blob: 085115a4be18835eebde14a3cfd67f0be526abc0 [file] [log] [blame]
/**
* 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.camel.component.cxf.soap.headers;
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.OutofBandHeader;
@javax.jws.WebService(serviceName = "HeaderService",
targetNamespace = "http://apache.org/camel/cxf/soap/headers",
endpointInterface = "org.apache.camel.component.cxf.soap.headers.HeaderTester")
public class HeaderTesterImpl implements HeaderTester {
@Resource
protected WebServiceContext context;
protected boolean relayHeaders = true;
public HeaderTesterImpl() {
}
public HeaderTesterImpl(boolean relayHeaders) {
this.relayHeaders = relayHeaders;
}
public void outHeader(OutHeader me, Holder<OutHeaderResponse> theResponse, Holder<SOAPHeaderData> headerInfo) {
try {
OutHeaderResponse theResponseValue = new OutHeaderResponse();
theResponseValue.setResponseType("pass");
theResponse.value = theResponseValue;
headerInfo.value = Constants.OUT_HEADER_DATA;
} catch (Exception ex) {
ex.printStackTrace();
throw new RuntimeException(ex);
}
}
public InHeaderResponse inHeader(InHeader me, SOAPHeaderData headerInfo) {
try {
InHeaderResponse result = new InHeaderResponse();
if (!relayHeaders) {
if (headerInfo == null) {
result.setResponseType("pass");
} else {
result.setResponseType("fail");
}
} else if (Constants.equals(Constants.IN_HEADER_DATA, headerInfo)) {
result.setResponseType("pass");
} else {
result.setResponseType("fail");
}
return result;
} catch (Exception ex) {
ex.printStackTrace();
throw new RuntimeException(ex);
}
}
public InoutHeaderResponse inoutHeader(InoutHeader me, Holder<SOAPHeaderData> headerInfo) {
try {
InoutHeaderResponse result = new InoutHeaderResponse();
if (!relayHeaders) {
if (headerInfo.value == null) {
result.setResponseType("pass");
} else {
result.setResponseType("fail");
}
} else if (Constants.equals(Constants.IN_OUT_REQUEST_HEADER_DATA, headerInfo.value)) {
result.setResponseType("pass");
} else {
result.setResponseType("fail");
}
headerInfo.value = Constants.IN_OUT_RESPONSE_HEADER_DATA;
return result;
} catch (Exception ex) {
ex.printStackTrace();
throw new RuntimeException(ex);
}
}
public Me inOutOfBandHeader(Me me) {
try {
Me result = new Me();
if (validateOutOfBandHander()) {
result.setFirstName("pass");
} else {
result.setFirstName("fail");
}
return result;
} catch (Exception ex) {
ex.printStackTrace();
throw new RuntimeException(ex);
}
}
public Me inoutOutOfBandHeader(Me me) {
try {
Me result = new Me();
if (validateOutOfBandHander()) {
addReplyOutOfBandHeader();
result.setFirstName("pass");
} else {
result.setFirstName("fail");
}
return result;
} catch (Exception ex) {
ex.printStackTrace();
throw new RuntimeException(ex);
}
}
public Me outOutOfBandHeader(Me me) {
try {
Me result = new Me();
result.setFirstName("pass");
addReplyOutOfBandHeader();
return result;
} catch (Exception ex) {
ex.printStackTrace();
throw new RuntimeException(ex);
}
}
private void addReplyOutOfBandHeader() {
if (context != null) {
MessageContext ctx = context.getMessageContext();
if (ctx != null) {
try {
OutofBandHeader ob = new OutofBandHeader();
ob.setName("testOobReturnHeaderName");
ob.setValue("testOobReturnHeaderValue");
ob.setHdrAttribute("testReturnHdrAttribute");
JAXBElement<OutofBandHeader> job = new JAXBElement<OutofBandHeader>(
new QName(Constants.TEST_HDR_NS, Constants.TEST_HDR_RESPONSE_ELEM),
OutofBandHeader.class, null, ob);
Header hdr = new Header(
new QName(Constants.TEST_HDR_NS, Constants.TEST_HDR_RESPONSE_ELEM),
job,
new JAXBDataBinding(ob.getClass()));
List<Header> hdrList = CastUtils.cast((List<?>) ctx.get(Header.HEADER_LIST));
hdrList.add(hdr);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
}
protected boolean validateOutOfBandHander() {
MessageContext ctx = context == null ? null : context.getMessageContext();
if (!relayHeaders) {
if (ctx != null
&& !ctx.containsKey(Header.HEADER_LIST)
|| (ctx.containsKey(Header.HEADER_LIST)
&& ((List<?>)ctx.get(Header.HEADER_LIST)).size() == 0)) {
return true;
}
return false;
}
boolean success = false;
if (ctx != null && 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;
try {
JAXBElement<?> job =
(JAXBElement<?>)JAXBContext.newInstance(org.apache.cxf.outofband.header.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;
}
}