blob: 57506df39624c9caa28be8b038da6def1ca13265 [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.axis2.engine;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.soap.SOAP12Constants;
import org.apache.axis2.AxisFault;
import org.apache.axis2.Constants;
import org.apache.axis2.client.Options;
import org.apache.axis2.client.ServiceClient;
import org.apache.axis2.context.ConfigurationContext;
import org.apache.axis2.context.MessageContext;
import org.apache.axis2.description.AxisOperation;
import org.apache.axis2.description.AxisService;
import org.apache.axis2.engine.util.TestConstants;
import org.apache.axis2.handlers.AbstractHandler;
import org.apache.axis2.integration.TestingUtils;
import org.apache.axis2.integration.UtilServer;
import org.apache.axis2.integration.UtilServerBasedTestCase;
import org.apache.axis2.phaseresolver.PhaseMetadata;
import org.apache.axis2.util.Utils;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
/**
* This tests the saving and restoring of the Axis2 contexts from within a handler. This is a more
* thorough test of the serialization mechanisms than the other unit tests, as the contexts are
* populated from the beginning of the Axis2 execution path.
*/
public class MessageSaveAndRestoreTest extends UtilServerBasedTestCase implements TestConstants {
public MessageSaveAndRestoreTest() {
super(MessageSaveAndRestoreTest.class.getName());
}
public MessageSaveAndRestoreTest(String testName) {
super(testName);
}
public static Test suite() {
return getTestSetup(new TestSuite(MessageSaveAndRestoreTest.class));
}
protected void setUp() throws Exception {
AxisService service = Utils.createSimpleService(TestConstants.serviceName,
Echo.class.getName(),
TestConstants.operationName);
UtilServer.deployService(service);
AxisOperation operation = service.getOperation(TestConstants.operationName);
ArrayList phases = new ArrayList();
phases.add(new Phase(PhaseMetadata.PHASE_POLICY_DETERMINATION));
operation.setRemainingPhasesInFlow(phases);
ArrayList phase = operation.getRemainingPhasesInFlow();
for (int i = 0; i < phase.size(); i++) {
Phase phase1 = (Phase)phase.get(i);
if (PhaseMetadata.PHASE_POLICY_DETERMINATION.equals(phase1.getPhaseName())) {
phase1.addHandler(inboundHandler);
}
}
phases = new ArrayList();
phases.add(new Phase(PhaseMetadata.PHASE_POLICY_DETERMINATION));
operation.setPhasesOutFlow(phases);
phase = operation.getPhasesOutFlow();
for (int i = 0; i < phase.size(); i++) {
Phase phase1 = (Phase)phase.get(i);
if (PhaseMetadata.PHASE_POLICY_DETERMINATION.equals(phase1.getPhaseName())) {
phase1.addHandler(outboundHandler);
}
}
}
protected void tearDown() throws Exception {
UtilServer.unDeployService(TestConstants.serviceName);
UtilServer.unDeployClientService();
}
public void testSaveAndRestoreOfMessage() throws Exception {
OMElement payload = TestingUtils.createDummyOMElement();
Options options = new Options();
options.setTo(TestConstants.targetEPR);
options.setSoapVersionURI(SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI);
options.setTransportInProtocol(Constants.TRANSPORT_HTTP);
options.setAction(TestConstants.operationName.getLocalPart());
options.setUseSeparateListener(true);
ConfigurationContext configContext = UtilServer.createClientConfigurationContext();
ServiceClient sender = new ServiceClient(configContext, null);
sender.setOptions(options);
sender.engageModule("addressing");
OMElement result = sender.sendReceive(payload);
TestingUtils.compareWithCreatedOMElement(result);
}
private Handler inboundHandler = new AbstractHandler() {
private static final long serialVersionUID = 1L;
private String stateProperty = "InboundHandlerState";
public InvocationResponse invoke(MessageContext messageContext) throws AxisFault {
System.out.println("MessageSaveAndRestoreTest:Inbound handler invoked");
if (messageContext.getProperty(stateProperty) == null) {
System.out.println("MessageSaveAndRestoreTest:Suspending processing");
messageContext.setProperty(stateProperty, new Object());
messageContext.pause();
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
try {
ObjectOutputStream objectOutputStream =
new ObjectOutputStream(byteArrayOutputStream);
objectOutputStream.writeObject(messageContext);
objectOutputStream.flush();
objectOutputStream.close();
byteArrayOutputStream.flush();
byteArrayOutputStream.close();
}
catch (IOException e) {
e.printStackTrace();
fail("An error occurred when serializing the MessageContext");
}
new Worker(byteArrayOutputStream.toByteArray(),
messageContext.getConfigurationContext()).start();
return InvocationResponse.SUSPEND;
} else {
System.out.println(
"MessageSaveAndRestoreTest:Skipping previously invoked Inbound handler");
}
return InvocationResponse.CONTINUE;
}
};
private Handler outboundHandler = new AbstractHandler() {
private static final long serialVersionUID = 1L;
public InvocationResponse invoke(MessageContext messageContext) throws AxisFault {
System.out.println("MessageSaveAndRestoreTest:Outbound handler invoked");
return InvocationResponse.CONTINUE;
}
};
private class Worker extends Thread {
private byte[] serializedMessageContext;
private ConfigurationContext configurationContext;
public Worker(byte[] serializedMessageContext, ConfigurationContext configurationContext) {
this.serializedMessageContext = serializedMessageContext;
this.configurationContext = configurationContext;
}
public void run() {
try {
System.out.println("MessageSaveAndRestoreTest:Worker thread started");
Thread.sleep(5000);
System.out.println("MessageSaveAndRestoreTest:Resuming processing");
ObjectInputStream objectInputStream =
new ObjectInputStream(new ByteArrayInputStream(serializedMessageContext));
MessageContext reconstitutedMessageContext =
(MessageContext)objectInputStream.readObject();
reconstitutedMessageContext.activate(configurationContext);
AxisEngine.resume(reconstitutedMessageContext);
}
catch (Exception e) {
e.printStackTrace();
fail("An error occurred in the worker thread");
}
}
}
}