/*
* 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.axis2.jaxws.sample;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Future;
import javax.xml.namespace.QName;
import javax.xml.soap.SOAPFactory;
import javax.xml.ws.AsyncHandler;
import javax.xml.ws.BindingProvider;
import javax.xml.ws.Response;
import javax.xml.ws.WebServiceException;
import javax.xml.ws.handler.Handler;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.apache.axis2.jaxws.TestLogger;
import org.apache.axis2.Constants;
import org.apache.axis2.jaxws.framework.AbstractTestCase;
import org.apache.axis2.jaxws.sample.headershandler.HeadersClientTrackerHandler;
import org.apache.axis2.jaxws.sample.headershandler.HeadersHandlerPortType;
import org.apache.axis2.jaxws.sample.headershandler.HeadersHandlerService;
import org.apache.axis2.jaxws.sample.headershandler.TestHeaders;
import org.test.headershandler.HeadersHandlerResponse;
/**
* @author rott
*
*/
public class HeadersHandlerTests extends AbstractTestCase {
String axisEndpoint = "http://localhost:6060/axis2/services/HeadersHandlerService.HeadersHandlerPortTypeImplPort";
private static final String filelogname = "target/HeadersHandlerTests.log";
public static Test suite() {
return getTestSetup(new TestSuite(HeadersHandlerTests.class));
}
protected void setUp() throws Exception {
deleteFile();
super.setUp();
}
protected void tearDown() throws Exception {
//deleteFile();
super.tearDown();
}
private void deleteFile() throws Exception {
File file = new File(filelogname);
file.delete(); // yes, delete for each retrieval, which should only happen once per test
}
public void testHeadersHandler() throws Exception {
TestLogger.logger.debug("----------------------------------");
TestLogger.logger.debug("test: " + getName());
HeadersHandlerService service = new HeadersHandlerService();
HeadersHandlerPortType proxy = service.getHeadersHandlerPort();
BindingProvider p = (BindingProvider) proxy;
Map<String, Object> requestCtx = p.getRequestContext();
requestCtx.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, axisEndpoint);
/*
* add several headers by way of HeadersAdapter property
*/
String acoh1, acoh2, acoh3, acoh4, acoh5, acoh6;
SOAPFactory sf = SOAPFactory.newInstance();
try {
Map<QName, List<String>> requestHeaders = new HashMap<QName, List<String>>();
// QName used here should match the key for the list set on the requestCtx
acoh1 = TestHeaders.createHeaderXMLString(TestHeaders.ACOH1_HEADER_QNAME, TestHeaders.CONTENT_SMALL1);
// QName used here should match the key for the list set on the requestCtx
acoh2 = TestHeaders.createHeaderXMLString(TestHeaders.ACOH1_HEADER_QNAME, TestHeaders.CONTENT_SMALL2);
// QName used here should match the key for the list set on the requestCtx
acoh3 = TestHeaders.createHeaderXMLString(TestHeaders.ACOH2_HEADER_QNAME, TestHeaders.CONTENT_SMALL3);
// QName used here should match the key for the list set on the requestCtx
acoh4 = TestHeaders.createHeaderXMLString(TestHeaders.ACOH2_HEADER_QNAME, TestHeaders.CONTENT_SMALL4);
// create additional header strings that will need to be checked:
acoh5 = TestHeaders.createHeaderXMLString(TestHeaders.ACOH3_HEADER_QNAME, TestHeaders.CONTENT_LARGE);
acoh6 = TestHeaders.createHeaderXMLString(TestHeaders.ACOH4_HEADER_QNAME, TestHeaders.CONTENT_SMALL4);
List<String> list1 = new ArrayList<String>();
list1.add(acoh1);
list1.add(acoh2);
List<String> list2 = new ArrayList<String>();
list2.add(acoh3);
list2.add(acoh4);
requestHeaders.put(TestHeaders.ACOH1_HEADER_QNAME, list1);
requestHeaders.put(TestHeaders.ACOH2_HEADER_QNAME, list2);
requestCtx.put(Constants.JAXWS_OUTBOUND_SOAP_HEADERS, requestHeaders);
} catch (Throwable e) {
fail(e.getMessage());
return;
}
// some handlers decrement the value, so we can confirm SOAP body manipulation does not corrupt the headers
int numOfHandlerHitsInFlow = 3;
int intParam1 = 10;
int intParam2 = 10;
int total = proxy.headersHandler(intParam1, intParam2);
assertEquals("Return value should be " + (intParam1 + intParam2 - numOfHandlerHitsInFlow) + " but was " + total ,
(intParam1 + intParam2 - numOfHandlerHitsInFlow),
total);
TestLogger.logger.debug("Total (after handler manipulation) = " + total);
/*
* I tried to give enough info below in the expected_calls list so you can tell what's
* being tested without having to look at handler code. All header manipulation is
* done by SOAPHeadersAdapter.
*
* TODO: I would very much like to have done some other means of
* header manipulation, but the Axis2 SAAJ module is lacking necessary implementation
* to do this with any reliability.
*/
String log = readLogFile();
String expected_calls =
// client outbound
"HeadersClientLogicalHandler HANDLE_MESSAGE_OUTBOUND\n"
+ "HeadersClientLogicalHandler CHECKED_HEADER "+acoh1+"\n"
+ "HeadersClientLogicalHandler CHECKED_HEADER "+acoh2+"\n"
+ "HeadersClientLogicalHandler CHECKED_HEADER "+acoh3+"\n"
+ "HeadersClientLogicalHandler CHECKED_HEADER "+acoh4+"\n"
+ "HeadersClientLogicalHandler REMOVED_HEADER "+acoh1+"\n"
+ "HeadersClientLogicalHandler REMOVED_HEADER "+acoh3+"\n"
+ "HeadersClientLogicalHandler REMOVED_HEADER "+acoh4+"\n" // message manipulated after this action
+ "HeadersClientProtocolHandler HANDLE_MESSAGE_OUTBOUND\n"
+ "HeadersClientProtocolHandler CHECKED_HEADER "+acoh2+"\n"
+ "HeadersClientProtocolHandler ADDED_HEADER "+acoh5+"\n"
+ "HeadersClientProtocolHandler2 HANDLE_MESSAGE_OUTBOUND\n"
+ "HeadersClientProtocolHandler2 CHECKED_HEADER "+acoh2+"\n"
+ "HeadersClientProtocolHandler2 CHECKED_HEADER "+acoh5+"\n"
+ "HeadersClientProtocolHandler GET_HEADERS\n"
+ "HeadersClientProtocolHandler2 GET_HEADERS\n"
// server inbound
+ "HeadersServerProtocolHandler GET_HEADERS\n"
+ "HeadersServerProtocolHandler HANDLE_MESSAGE_INBOUND\n"
+ "HeadersServerProtocolHandler CHECKED_HEADER "+acoh2+"\n"
+ "HeadersServerProtocolHandler CHECKED_HEADER "+acoh5+"\n"
+ "HeadersServerProtocolHandler REMOVED_HEADER "+acoh2+"\n"
+ "HeadersServerProtocolHandler ADDED_HEADER "+acoh6+"\n"
+ "HeadersServerLogicalHandler HANDLE_MESSAGE_INBOUND\n"
+ "HeadersServerLogicalHandler CHECKED_HEADER "+acoh5+"\n"
+ "HeadersServerLogicalHandler CHECKED_HEADER "+acoh6+"\n"
+ "HeadersServerLogicalHandler REMOVED_HEADER "+acoh5+"\n" // message manipulated after this action
+ "HeadersServerLogicalHandler REMOVED_HEADER "+acoh6+"\n"
// server outbound
+ "HeadersServerLogicalHandler HANDLE_MESSAGE_OUTBOUND\n"
+ "HeadersServerLogicalHandler ADDED_HEADER "+acoh1+"\n" // message manipulated after this action
+ "HeadersServerProtocolHandler HANDLE_MESSAGE_OUTBOUND\n"
+ "HeadersServerProtocolHandler CHECKED_HEADER "+acoh1+"\n"
+ "HeadersServerProtocolHandler REMOVED_HEADER "+acoh1+"\n"
+ "HeadersServerProtocolHandler ADDED_HEADER "+acoh5+"\n"
+ "HeadersServerLogicalHandler CLOSE\n"
+ "HeadersServerProtocolHandler CLOSE\n"
// client inbound
+ "HeadersClientProtocolHandler2 HANDLE_MESSAGE_INBOUND\n"
+ "HeadersClientProtocolHandler2 CHECKED_HEADER "+acoh5+"\n"
+ "HeadersClientProtocolHandler2 ADDED_HEADER "+acoh3+"\n"
+ "HeadersClientProtocolHandler HANDLE_MESSAGE_INBOUND\n"
+ "HeadersClientProtocolHandler CHECKED_HEADER "+acoh5+"\n"
+ "HeadersClientProtocolHandler CHECKED_HEADER "+acoh3+"\n"
+ "HeadersClientProtocolHandler REMOVED_HEADER "+acoh5+"\n"
+ "HeadersClientProtocolHandler ADDED_HEADER "+acoh4+"\n"
+ "HeadersClientLogicalHandler HANDLE_MESSAGE_INBOUND\n"
+ "HeadersClientProtocolHandler2 CLOSE\n"
+ "HeadersClientProtocolHandler CLOSE\n"
+ "HeadersClientLogicalHandler CLOSE\n";
assertEquals(expected_calls, log);
TestLogger.logger.debug("----------------------------------");
}
public void testHeadersHandlerAsyncCallback() throws Exception {
TestLogger.logger.debug("----------------------------------");
TestLogger.logger.debug("test: " + getName());
HeadersHandlerService service = new HeadersHandlerService();
HeadersHandlerPortType proxy = service.getHeadersHandlerPort();
BindingProvider p = (BindingProvider) proxy;
Map<String, Object> requestCtx = p.getRequestContext();
requestCtx.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, axisEndpoint);
/*
* add several headers by way of HeadersAdapter property
*/
String acoh1, acoh2, acoh3, acoh4, acoh5, acoh6;
SOAPFactory sf = SOAPFactory.newInstance();
Map<QName, List<String>> requestHeaders = new HashMap<QName, List<String>>();
// QName used here should match the key for the list set on the requestCtx
acoh1 = TestHeaders.createHeaderXMLString(TestHeaders.ACOH1_HEADER_QNAME, TestHeaders.CONTENT_SMALL1);
// QName used here should match the key for the list set on the requestCtx
acoh2 = TestHeaders.createHeaderXMLString(TestHeaders.ACOH1_HEADER_QNAME, TestHeaders.CONTENT_SMALL2);
// QName used here should match the key for the list set on the requestCtx
acoh3 = TestHeaders.createHeaderXMLString(TestHeaders.ACOH2_HEADER_QNAME, TestHeaders.CONTENT_SMALL3);
// QName used here should match the key for the list set on the requestCtx
acoh4 = TestHeaders.createHeaderXMLString(TestHeaders.ACOH2_HEADER_QNAME, TestHeaders.CONTENT_SMALL4);
// create additional header strings that will need to be checked:
acoh5 = TestHeaders.createHeaderXMLString(TestHeaders.ACOH3_HEADER_QNAME, TestHeaders.CONTENT_LARGE);
acoh6 = TestHeaders.createHeaderXMLString(TestHeaders.ACOH4_HEADER_QNAME, TestHeaders.CONTENT_SMALL4);
List<String> list1 = new ArrayList<String>();
list1.add(acoh1);
list1.add(acoh2);
List<String> list2 = new ArrayList<String>();
list2.add(acoh3);
list2.add(acoh4);
requestHeaders.put(TestHeaders.ACOH1_HEADER_QNAME, list1);
requestHeaders.put(TestHeaders.ACOH2_HEADER_QNAME, list2);
requestCtx.put(Constants.JAXWS_OUTBOUND_SOAP_HEADERS, requestHeaders);
// some handlers decrement the value, so we can confirm SOAP body manipulation does not corrupt the headers
int numOfHandlerHitsInFlow = 3;
int intParam1 = 10;
int intParam2 = 10;
HeadersHandlerAsyncCallback callback = new HeadersHandlerAsyncCallback();
Future<?> future = proxy.headersHandlerAsync(intParam1, intParam2, callback);
while (!future.isDone()) {
Thread.sleep(1000);
TestLogger.logger.debug("Async invocation incomplete");
}
int total = callback.getResponseValue();
assertEquals("Return value should be " + (intParam1 + intParam2 - numOfHandlerHitsInFlow) + " but was " + total ,
(intParam1 + intParam2 - numOfHandlerHitsInFlow),
total);
TestLogger.logger.debug("Total (after handler manipulation) = " + total);
/*
* I tried to give enough info below in the expected_calls list so you can tell what's
* being tested without having to look at handler code. All header manipulation is
* done by SOAPHeadersAdapter.
*
* TODO: I would very much like to have done some other means of
* header manipulation, but the Axis2 SAAJ module is lacking necessary implementation
* to do this with any reliability.
*/
String log = readLogFile();
String expected_calls =
// client outbound
"HeadersClientLogicalHandler HANDLE_MESSAGE_OUTBOUND\n"
+ "HeadersClientLogicalHandler CHECKED_HEADER "+acoh1+"\n"
+ "HeadersClientLogicalHandler CHECKED_HEADER "+acoh2+"\n"
+ "HeadersClientLogicalHandler CHECKED_HEADER "+acoh3+"\n"
+ "HeadersClientLogicalHandler CHECKED_HEADER "+acoh4+"\n"
+ "HeadersClientLogicalHandler REMOVED_HEADER "+acoh1+"\n"
+ "HeadersClientLogicalHandler REMOVED_HEADER "+acoh3+"\n"
+ "HeadersClientLogicalHandler REMOVED_HEADER "+acoh4+"\n" // message manipulated after this action
+ "HeadersClientProtocolHandler HANDLE_MESSAGE_OUTBOUND\n"
+ "HeadersClientProtocolHandler CHECKED_HEADER "+acoh2+"\n"
+ "HeadersClientProtocolHandler ADDED_HEADER "+acoh5+"\n"
+ "HeadersClientProtocolHandler2 HANDLE_MESSAGE_OUTBOUND\n"
+ "HeadersClientProtocolHandler2 CHECKED_HEADER "+acoh2+"\n"
+ "HeadersClientProtocolHandler2 CHECKED_HEADER "+acoh5+"\n"
+ "HeadersClientProtocolHandler GET_HEADERS\n"
+ "HeadersClientProtocolHandler2 GET_HEADERS\n"
// server inbound
+ "HeadersServerProtocolHandler GET_HEADERS\n"
+ "HeadersServerProtocolHandler HANDLE_MESSAGE_INBOUND\n"
+ "HeadersServerProtocolHandler CHECKED_HEADER "+acoh2+"\n"
+ "HeadersServerProtocolHandler CHECKED_HEADER "+acoh5+"\n"
+ "HeadersServerProtocolHandler REMOVED_HEADER "+acoh2+"\n"
+ "HeadersServerProtocolHandler ADDED_HEADER "+acoh6+"\n"
+ "HeadersServerLogicalHandler HANDLE_MESSAGE_INBOUND\n"
+ "HeadersServerLogicalHandler CHECKED_HEADER "+acoh5+"\n"
+ "HeadersServerLogicalHandler CHECKED_HEADER "+acoh6+"\n"
+ "HeadersServerLogicalHandler REMOVED_HEADER "+acoh5+"\n" // message manipulated after this action
+ "HeadersServerLogicalHandler REMOVED_HEADER "+acoh6+"\n"
// server outbound
+ "HeadersServerLogicalHandler HANDLE_MESSAGE_OUTBOUND\n"
+ "HeadersServerLogicalHandler ADDED_HEADER "+acoh1+"\n" // message manipulated after this action
+ "HeadersServerProtocolHandler HANDLE_MESSAGE_OUTBOUND\n"
+ "HeadersServerProtocolHandler CHECKED_HEADER "+acoh1+"\n"
+ "HeadersServerProtocolHandler REMOVED_HEADER "+acoh1+"\n"
+ "HeadersServerProtocolHandler ADDED_HEADER "+acoh5+"\n"
+ "HeadersServerLogicalHandler CLOSE\n"
+ "HeadersServerProtocolHandler CLOSE\n"
// client inbound
+ "HeadersClientProtocolHandler2 HANDLE_MESSAGE_INBOUND\n"
+ "HeadersClientProtocolHandler2 CHECKED_HEADER "+acoh5+"\n"
+ "HeadersClientProtocolHandler2 ADDED_HEADER "+acoh3+"\n"
+ "HeadersClientProtocolHandler HANDLE_MESSAGE_INBOUND\n"
+ "HeadersClientProtocolHandler CHECKED_HEADER "+acoh5+"\n"
+ "HeadersClientProtocolHandler CHECKED_HEADER "+acoh3+"\n"
+ "HeadersClientProtocolHandler REMOVED_HEADER "+acoh5+"\n"
+ "HeadersClientProtocolHandler ADDED_HEADER "+acoh4+"\n"
+ "HeadersClientLogicalHandler HANDLE_MESSAGE_INBOUND\n"
+ "HeadersClientProtocolHandler2 CLOSE\n"
+ "HeadersClientProtocolHandler CLOSE\n"
+ "HeadersClientLogicalHandler CLOSE\n";
assertEquals(expected_calls, log);
TestLogger.logger.debug("----------------------------------");
}
public void testHeadersHandlerServerInboundFault() {
TestLogger.logger.debug("----------------------------------");
TestLogger.logger.debug("test: " + getName());
HeadersHandlerService service = new HeadersHandlerService();
HeadersHandlerPortType proxy = service.getHeadersHandlerPort();
BindingProvider p = (BindingProvider) proxy;
Map<String, Object> requestCtx = p.getRequestContext();
requestCtx.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, axisEndpoint);
/*
* add several headers by way of HeadersAdapter property
*/
String acoh1, acoh2, acoh3, acoh4, acoh5, acoh6;
SOAPFactory sf;
try {
sf = SOAPFactory.newInstance();
} catch (Exception e) {
e.printStackTrace();
fail(e.getMessage());
return;
}
Map<QName, List<String>> requestHeaders = new HashMap<QName, List<String>>();
// QName used here should match the key for the list set on the requestCtx
acoh1 = TestHeaders.createHeaderXMLString(TestHeaders.ACOH1_HEADER_QNAME, TestHeaders.CONTENT_SMALL1);
// QName used here should match the key for the list set on the requestCtx
acoh2 = TestHeaders.createHeaderXMLString(TestHeaders.ACOH1_HEADER_QNAME, TestHeaders.CONTENT_SMALL2);
// QName used here should match the key for the list set on the requestCtx
acoh3 = TestHeaders.createHeaderXMLString(TestHeaders.ACOH2_HEADER_QNAME, TestHeaders.CONTENT_SMALL3);
// QName used here should match the key for the list set on the requestCtx
acoh4 = TestHeaders.createHeaderXMLString(TestHeaders.ACOH2_HEADER_QNAME, TestHeaders.CONTENT_SMALL4);
// create additional header strings that will need to be checked:
acoh5 = TestHeaders.createHeaderXMLString(TestHeaders.ACOH3_HEADER_QNAME, TestHeaders.CONTENT_LARGE);
acoh6 = TestHeaders.createHeaderXMLString(TestHeaders.ACOH4_HEADER_QNAME, TestHeaders.CONTENT_SMALL4);
List<String> list1 = new ArrayList<String>();
list1.add(acoh1);
list1.add(acoh2);
List<String> list2 = new ArrayList<String>();
list2.add(acoh3);
list2.add(acoh4);
requestHeaders.put(TestHeaders.ACOH1_HEADER_QNAME, list1);
requestHeaders.put(TestHeaders.ACOH2_HEADER_QNAME, list2);
requestCtx.put(Constants.JAXWS_OUTBOUND_SOAP_HEADERS, requestHeaders);
// some handlers decrement the value, so we can confirm SOAP body manipulation does not corrupt the headers
int numOfHandlerHitsInFlow = 3;
int intParam1 = 10;
int intParam2 = 66;
try {
int total = proxy.headersHandler(intParam1, intParam2);
fail("headersHandler should have caused an exception, but did not.");
/*
* I tried to give enough info below in the expected_calls list so you can tell what's
* being tested without having to look at handler code. All header manipulation is
* done by SOAPHeadersAdapter.
*
* TODO: I would very much like to have done some other means of
* header manipulation, but the Axis2 SAAJ module is lacking necessary implementation
* to do this with any reliability.
*/
} catch (Exception e) {
String log = readLogFile();
String expected_calls =
// client outbound
"HeadersClientLogicalHandler HANDLE_MESSAGE_OUTBOUND\n"
+ "HeadersClientLogicalHandler CHECKED_HEADER "+acoh1+"\n"
+ "HeadersClientLogicalHandler CHECKED_HEADER "+acoh2+"\n"
+ "HeadersClientLogicalHandler CHECKED_HEADER "+acoh3+"\n"
+ "HeadersClientLogicalHandler CHECKED_HEADER "+acoh4+"\n"
+ "HeadersClientLogicalHandler REMOVED_HEADER "+acoh1+"\n"
+ "HeadersClientLogicalHandler REMOVED_HEADER "+acoh3+"\n"
+ "HeadersClientLogicalHandler REMOVED_HEADER "+acoh4+"\n" // message manipulated after this action
+ "HeadersClientProtocolHandler HANDLE_MESSAGE_OUTBOUND\n"
+ "HeadersClientProtocolHandler CHECKED_HEADER "+acoh2+"\n"
+ "HeadersClientProtocolHandler ADDED_HEADER "+acoh5+"\n"
+ "HeadersClientProtocolHandler2 HANDLE_MESSAGE_OUTBOUND\n"
+ "HeadersClientProtocolHandler2 CHECKED_HEADER "+acoh2+"\n"
+ "HeadersClientProtocolHandler2 CHECKED_HEADER "+acoh5+"\n"
+ "HeadersClientProtocolHandler GET_HEADERS\n"
+ "HeadersClientProtocolHandler2 GET_HEADERS\n"
// server inbound
+ "HeadersServerProtocolHandler GET_HEADERS\n"
+ "HeadersServerProtocolHandler HANDLE_MESSAGE_INBOUND\n"
+ "HeadersServerProtocolHandler CHECKED_HEADER "+acoh2+"\n"
+ "HeadersServerProtocolHandler CHECKED_HEADER "+acoh5+"\n"
+ "HeadersServerProtocolHandler REMOVED_HEADER "+acoh2+"\n"
+ "HeadersServerProtocolHandler ADDED_HEADER "+acoh6+"\n"
+ "HeadersServerLogicalHandler HANDLE_MESSAGE_INBOUND\n"
+ "HeadersServerLogicalHandler CHECKED_HEADER "+acoh5+"\n"
+ "HeadersServerLogicalHandler CHECKED_HEADER "+acoh6+"\n"
+ "HeadersServerLogicalHandler REMOVED_HEADER "+acoh5+"\n" // message manipulated after this action
+ "HeadersServerLogicalHandler REMOVED_HEADER "+acoh6+"\n" // throws protocol exception
// server outbound
+ "HeadersServerProtocolHandler HANDLE_FAULT_OUTBOUND\n"
+ "HeadersServerProtocolHandler ADDED_HEADER "+acoh5+"\n"
+ "HeadersServerLogicalHandler CLOSE\n"
+ "HeadersServerProtocolHandler CLOSE\n"
// client inbound
+ "HeadersClientProtocolHandler2 HANDLE_FAULT_INBOUND\n"
+ "HeadersClientProtocolHandler2 CHECKED_HEADER "+acoh5+"\n"
+ "HeadersClientProtocolHandler2 REMOVED_HEADER "+acoh5+"\n"
+ "HeadersClientProtocolHandler HANDLE_FAULT_INBOUND\n"
+ "HeadersClientLogicalHandler HANDLE_FAULT_INBOUND\n" // getPayload called, just to exercise underlying code
+ "HeadersClientProtocolHandler2 CLOSE\n"
+ "HeadersClientProtocolHandler CLOSE\n"
+ "HeadersClientLogicalHandler CLOSE\n";
assertEquals(expected_calls, log);
assertEquals("I don't like 66", e.getMessage());
}
TestLogger.logger.debug("----------------------------------");
}
/*
* TODO: test is currently disabled due to exception:
*
* Caused by: java.net.SocketException: Broken pipe
* at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:103)
* at java.net.SocketOutputStream.write(SocketOutputStream.java:147)
* at org.apache.http.impl.io.AbstractSessionOutputBuffer.write(AbstractSessionOutputBuffer.java:109)
* at org.apache.http.impl.io.ChunkedOutputStream.flushCacheWithAppend(ChunkedOutputStream.java:117)
* at org.apache.http.impl.io.ChunkedOutputStream.write(ChunkedOutputStream.java:166)
* at org.apache.axis2.transport.http.server.AxisHttpResponseImpl$AutoCommitOutputStream.write(AxisHttpResponseImpl.java:231)
* at com.ctc.wstx.io.UTF8Writer.write(UTF8Writer.java:139)
* at com.ctc.wstx.sw.BufferingXmlWriter.flushBuffer(BufferingXmlWriter.java:1103)
* at com.ctc.wstx.sw.BufferingXmlWriter.flush(BufferingXmlWriter.java:213)
* at com.ctc.wstx.sw.BaseStreamWriter.flush(BaseStreamWriter.java:311)
* ... 12 more
*
* Currently, the server side returns the inbound message when a handler.handleMessage
* method returns 'false'. This may be a misinterpretation of the jaxws spec.
* When the response flow is fixed, remove this comment, and remove the '_' from the
* test method name to enable it.
*/
public void _testHeadersHandlerServerInboundFlowReversal() {
TestLogger.logger.debug("----------------------------------");
TestLogger.logger.debug("test: " + getName());
HeadersHandlerService service = new HeadersHandlerService();
HeadersHandlerPortType proxy = service.getHeadersHandlerPort();
BindingProvider p = (BindingProvider) proxy;
Map<String, Object> requestCtx = p.getRequestContext();
requestCtx.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, axisEndpoint);
/*
* add several headers by way of HeadersAdapter property
*/
String acoh1, acoh2, acoh3, acoh4, acoh5, acoh6;
SOAPFactory sf;
try {
sf = SOAPFactory.newInstance();
} catch (Exception e) {
e.printStackTrace();
fail(e.getMessage());
return;
}
Map<QName, List<String>> requestHeaders = new HashMap<QName, List<String>>();
// QName used here should match the key for the list set on the requestCtx
acoh1 = TestHeaders.createHeaderXMLString(TestHeaders.ACOH1_HEADER_QNAME, TestHeaders.CONTENT_SMALL1);
// QName used here should match the key for the list set on the requestCtx
acoh2 = TestHeaders.createHeaderXMLString(TestHeaders.ACOH1_HEADER_QNAME, TestHeaders.CONTENT_SMALL2);
// QName used here should match the key for the list set on the requestCtx
acoh3 = TestHeaders.createHeaderXMLString(TestHeaders.ACOH2_HEADER_QNAME, TestHeaders.CONTENT_SMALL3);
// QName used here should match the key for the list set on the requestCtx
acoh4 = TestHeaders.createHeaderXMLString(TestHeaders.ACOH2_HEADER_QNAME, TestHeaders.CONTENT_SMALL4);
// create additional header strings that will need to be checked:
acoh5 = TestHeaders.createHeaderXMLString(TestHeaders.ACOH3_HEADER_QNAME, TestHeaders.CONTENT_LARGE);
acoh6 = TestHeaders.createHeaderXMLString(TestHeaders.ACOH4_HEADER_QNAME, TestHeaders.CONTENT_SMALL4);
List<String> list1 = new ArrayList<String>();
list1.add(acoh1);
list1.add(acoh2);
List<String> list2 = new ArrayList<String>();
list2.add(acoh3);
list2.add(acoh4);
requestHeaders.put(TestHeaders.ACOH1_HEADER_QNAME, list1);
requestHeaders.put(TestHeaders.ACOH2_HEADER_QNAME, list2);
requestCtx.put(Constants.JAXWS_OUTBOUND_SOAP_HEADERS, requestHeaders);
int intParam1 = 10;
int intParam2 = 33;
try {
int total = proxy.headersHandler(intParam1, intParam2);
} catch (Exception e) {
/*
* I tried to give enough info below in the expected_calls list so you can tell what's
* being tested without having to look at handler code. All header manipulation is
* done by SOAPHeadersAdapter.
*
* TODO: I would very much like to have done some other means of
* header manipulation, but the Axis2 SAAJ module is lacking necessary implementation
* to do this with any reliability.
*/
String log = readLogFile();
String expected_calls =
// client outbound
"HeadersClientLogicalHandler HANDLE_MESSAGE_OUTBOUND\n"
+ "HeadersClientLogicalHandler CHECKED_HEADER "+acoh1+"\n"
+ "HeadersClientLogicalHandler CHECKED_HEADER "+acoh2+"\n"
+ "HeadersClientLogicalHandler CHECKED_HEADER "+acoh3+"\n"
+ "HeadersClientLogicalHandler CHECKED_HEADER "+acoh4+"\n"
+ "HeadersClientLogicalHandler REMOVED_HEADER "+acoh1+"\n"
+ "HeadersClientLogicalHandler REMOVED_HEADER "+acoh3+"\n"
+ "HeadersClientLogicalHandler REMOVED_HEADER "+acoh4+"\n" // message manipulated after this action
+ "HeadersClientProtocolHandler HANDLE_MESSAGE_OUTBOUND\n"
+ "HeadersClientProtocolHandler CHECKED_HEADER "+acoh2+"\n"
+ "HeadersClientProtocolHandler ADDED_HEADER "+acoh5+"\n"
+ "HeadersClientProtocolHandler2 HANDLE_MESSAGE_OUTBOUND\n"
+ "HeadersClientProtocolHandler2 CHECKED_HEADER "+acoh2+"\n"
+ "HeadersClientProtocolHandler2 CHECKED_HEADER "+acoh5+"\n"
+ "HeadersClientProtocolHandler GET_HEADERS\n"
+ "HeadersClientProtocolHandler2 GET_HEADERS\n"
// server inbound
+ "HeadersServerProtocolHandler GET_HEADERS\n"
+ "HeadersServerProtocolHandler HANDLE_MESSAGE_INBOUND\n"
+ "HeadersServerProtocolHandler CHECKED_HEADER "+acoh2+"\n"
+ "HeadersServerProtocolHandler CHECKED_HEADER "+acoh5+"\n"
+ "HeadersServerProtocolHandler REMOVED_HEADER "+acoh2+"\n"
+ "HeadersServerProtocolHandler ADDED_HEADER "+acoh6+"\n"
+ "HeadersServerLogicalHandler HANDLE_MESSAGE_INBOUND\n"
+ "HeadersServerLogicalHandler CHECKED_HEADER "+acoh5+"\n"
+ "HeadersServerLogicalHandler CHECKED_HEADER "+acoh6+"\n"
+ "HeadersServerLogicalHandler REMOVED_HEADER "+acoh5+"\n" // message manipulated after this action
+ "HeadersServerLogicalHandler REMOVED_HEADER "+acoh6+"\n" // returns false
// server outbound
+ "HeadersServerProtocolHandler HANDLE_MESSAGE_OUTBOUND\n"
+ "HeadersServerProtocolHandler ADDED_HEADER "+acoh1+"\n"
+ "HeadersServerProtocolHandler CHECKED_HEADER "+acoh1+"\n"
+ "HeadersServerProtocolHandler REMOVED_HEADER "+acoh1+"\n"
+ "HeadersServerProtocolHandler ADDED_HEADER "+acoh5+"\n"
+ "HeadersServerLogicalHandler CLOSE\n"
+ "HeadersServerProtocolHandler CLOSE\n"
// client inbound
+ "HeadersClientProtocolHandler2 HANDLE_MESSAGE_INBOUND\n"
+ "HeadersClientProtocolHandler2 CHECKED_HEADER "+acoh5+"\n"
+ "HeadersClientProtocolHandler2 ADDED_HEADER "+acoh3+"\n"
+ "HeadersClientProtocolHandler HANDLE_MESSAGE_INBOUND\n"
+ "HeadersClientProtocolHandler CHECKED_HEADER "+acoh5+"\n"
+ "HeadersClientProtocolHandler CHECKED_HEADER "+acoh3+"\n"
+ "HeadersClientProtocolHandler REMOVED_HEADER "+acoh5+"\n"
+ "HeadersClientProtocolHandler ADDED_HEADER "+acoh4+"\n"
+ "HeadersClientLogicalHandler HANDLE_MESSAGE_INBOUND\n"
+ "HeadersClientLogicalHandler CHECKED_HEADER "+acoh3+"\n"
+ "HeadersClientLogicalHandler CHECKED_HEADER "+acoh4+"\n"
+ "HeadersClientLogicalHandler REMOVED_HEADER "+acoh3+"\n"
+ "HeadersClientLogicalHandler REMOVED_HEADER "+acoh4+"\n"
+ "HeadersClientProtocolHandler2 CLOSE\n"
+ "HeadersClientProtocolHandler CLOSE\n"
+ "HeadersClientLogicalHandler CLOSE\n";
assertEquals("I don't like 33", e.getMessage());
assertEquals(expected_calls, log);
}
TestLogger.logger.debug("----------------------------------");
}
/*
* The intent of making the SOAPHeadersAdapter available to handlers is that they
* use it as an alternative to SAAJ. We have protection built in to prevent handler
* implementations from doing both. This method tests for that.
*/
public void testHeadersHandlerTracker() {
TestLogger.logger.debug("----------------------------------");
TestLogger.logger.debug("test: " + getName());
try {
HeadersHandlerService service = new HeadersHandlerService();
HeadersHandlerPortType proxy = service.getHeadersHandlerPort();
BindingProvider p = (BindingProvider) proxy;
List<Handler> handlers = p.getBinding().getHandlerChain();
if (handlers == null)
handlers = new ArrayList<Handler>();
handlers.add(new HeadersClientTrackerHandler());
p.getBinding().setHandlerChain(handlers);
Map<String, Object> requestCtx = p.getRequestContext();
requestCtx.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, axisEndpoint);
int total = proxy.headersHandler(1, 1);
fail("Should have received a WebServiceException, but did not.");
} catch (Exception e) {
assertTrue(e instanceof WebServiceException);
}
TestLogger.logger.debug("----------------------------------");
}
/*
* A callback implementation that can be used to collect the exceptions
*/
class HeadersHandlerAsyncCallback implements AsyncHandler<HeadersHandlerResponse> {
private Exception exception;
private int retVal;
public void handleResponse(Response<HeadersHandlerResponse> response) {
try {
TestLogger.logger.debug("HeadersHandlerAsyncCallback.handleResponse() was called");
HeadersHandlerResponse r = response.get();
TestLogger.logger.debug("No exception was thrown from Response.get()");
retVal = r.getReturn();
} catch (Exception e) {
TestLogger.logger.debug("An exception was thrown: " + e.getClass());
exception = e;
}
}
public int getResponseValue() {
return retVal;
}
public Exception getException() {
return exception;
}
}
private String readLogFile() {
try {
FileReader fr = new FileReader(filelogname);
BufferedReader inputStream = new BufferedReader(fr);
String line = null;
String ret = null;
while ((line = inputStream.readLine()) != null) {
if (ret == null) {
ret = "";
}
ret = ret.concat(line + "\n");
}
fr.close();
return ret;
} catch (FileNotFoundException fnfe) {
// it's possible the test does not actually call any handlers and therefore
// no file would have been written. The test should account for this by
// assertNull on the return value from here
} catch (IOException ioe) {
ioe.printStackTrace();
fail(ioe.getMessage());
}
return null;
}
}