/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.cxf.systest.outofband.header;
import java.math.BigDecimal;
import java.util.Iterator;
import java.util.List;
import javax.annotation.Resource;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.namespace.QName;
import javax.xml.ws.Holder;
import javax.xml.ws.WebServiceContext;
import javax.xml.ws.handler.MessageContext;
import org.w3c.dom.Node;
import org.apache.cxf.headers.Header;
import org.apache.cxf.helpers.CastUtils;
import org.apache.cxf.jaxb.JAXBDataBinding;
import org.apache.cxf.outofband.header.ObjectFactory;
import org.apache.cxf.outofband.header.OutofBandHeader;
import org.apache.hello_world_doc_lit_bare.PutLastTradedPricePortType;
import org.apache.hello_world_doc_lit_bare.types.TradePriceData;
@javax.jws.WebService(serviceName = "SOAPService",
portName = "SoapPort",
endpointInterface = "org.apache.hello_world_doc_lit_bare.PutLastTradedPricePortType",
targetNamespace = "http://apache.org/hello_world_doc_lit_bare",
wsdlLocation = "testutils/doc_lit_bare.wsdl")
public class OOBHdrServiceImpl implements PutLastTradedPricePortType {
@Resource
private WebServiceContext context;
public void sayHi(Holder<TradePriceData> inout) {
inout.value.setTickerPrice(4.5f);
inout.value.setTickerSymbol("APACHE");
if (checkContext()) {
//System.out.println("Received out-of-band header as expected..");
sendReturnOOBHeader();
}
}
private void sendReturnOOBHeader() {
if (context != null) {
MessageContext ctx = context.getMessageContext();
if (ctx != null) {
try {
// Create out-of-band header object.
OutofBandHeader ob = new OutofBandHeader();
ob.setName("testOobReturnHeaderName");
ob.setValue("testOobReturnHeaderValue");
ob.setHdrAttribute("testReturnHdrAttribute");
// Add Out-of-band header object to HeaderHolder.
JAXBElement<OutofBandHeader> job = new JAXBElement<OutofBandHeader>(
new QName(OOBHeaderTest.TEST_HDR_NS, OOBHeaderTest.TEST_HDR_RESPONSE_ELEM),
OutofBandHeader.class, null, ob);
Header hdr = new Header(
new QName(OOBHeaderTest.TEST_HDR_NS, OOBHeaderTest.TEST_HDR_RESPONSE_ELEM),
job,
new JAXBDataBinding(ob.getClass()));
List<Header> hdrList = CastUtils.cast((List<?>) ctx.get(Header.HEADER_LIST));
hdrList.add(hdr);
//Add headerHolder to requestContext.
// ctx.put(Header.HEADER_LIST, hdrList);
//System.out.println("Completed adding list to context");
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
}
public void putLastTradedPrice(TradePriceData body) {
//System.out.println("-----TradePriceData TickerPrice : ----- " + body.getTickerPrice());
//System.out.println("-----TradePriceData TickerSymbol : ----- " + body.getTickerSymbol());
}
private boolean checkContext() {
boolean success = false;
MessageContext ctx = context == null ? null : context.getMessageContext();
if (ctx.containsKey(Header.HEADER_LIST)) {
List oobHdr = (List) ctx.get(Header.HEADER_LIST);
Iterator iter = oobHdr.iterator();
while (iter.hasNext()) {
Object hdr = iter.next();
if (hdr instanceof Header && ((Header) hdr).getObject() instanceof Node) {
Header hdr1 = (Header) hdr;
//System.out.println("Node conains : " + hdr1.getObject().toString());
try {
JAXBElement job = (JAXBElement) JAXBContext.newInstance(ObjectFactory.class)
.createUnmarshaller()
.unmarshal((Node) hdr1.getObject());
OutofBandHeader ob = (OutofBandHeader) job.getValue();
if ("testOobHeader".equals(ob.getName())
&& "testOobHeaderValue".equals(ob.getValue())) {
if ("testHdrAttribute".equals(ob.getHdrAttribute())) {
success = true;
iter.remove(); //mark it processed
} else if ("dontProcess".equals(ob.getHdrAttribute())) {
//we won't remove it so we won't let the runtime know
//it's processed. It SHOULD throw an exception
//saying the mustunderstand wasn't processed
success = true;
}
} else {
throw new RuntimeException("test failed");
}
} catch (JAXBException ex) {
//
ex.printStackTrace();
}
}
}
} else {
throw new RuntimeException("MessageContext is null or doesnot contain OOBHeaders");
}
return success;
}
public String bareNoParam() {
return "testResponse";
}
public String nillableParameter(BigDecimal theRequest) {
return null;
}
}