/* * 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.TestCase; import org.apache.axiom.om.OMAbstractFactory; import org.apache.axiom.soap.SOAPFactory; import org.apache.axiom.util.UIDGenerator; import org.apache.axis2.AxisFault; import org.apache.axis2.addressing.EndpointReference; import org.apache.axis2.context.ConfigurationContext; import org.apache.axis2.context.MessageContext; import org.apache.axis2.context.OperationContext; import org.apache.axis2.context.ServiceContext; import org.apache.axis2.context.ServiceGroupContext; import org.apache.axis2.description.AxisOperation; import org.apache.axis2.description.AxisService; import org.apache.axis2.description.AxisServiceGroup; import org.apache.axis2.description.HandlerDescription; import org.apache.axis2.description.InOutAxisOperation; import org.apache.axis2.description.TransportInDescription; import org.apache.axis2.description.TransportOutDescription; import org.apache.axis2.dispatchers.AddressingBasedDispatcher; import org.apache.axis2.dispatchers.RequestURIBasedDispatcher; import org.apache.axis2.dispatchers.SOAPActionBasedDispatcher; import org.apache.axis2.dispatchers.SOAPMessageBodyBasedDispatcher; import org.apache.axis2.handlers.AbstractHandler; import org.apache.axis2.receivers.RawXMLINOnlyMessageReceiver; import org.apache.axis2.receivers.RawXMLINOutMessageReceiver; import org.apache.axis2.transport.http.impl.httpclient4.HTTPClient4TransportSender; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import javax.xml.namespace.QName; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.ArrayList; public class OperationContextSaveTest extends TestCase { protected static final Log log = LogFactory.getLog(OperationContextSaveTest.class); private QName serviceName = new QName("TestService"); private QName operationName = new QName("Operation_1"); private ConfigurationContext configurationContext = null; private ServiceGroupContext serviceGroupContext = null; private ServiceContext serviceContext = null; private OperationContext operationContext = null; private AxisConfiguration axisConfiguration = null; private AxisServiceGroup axisServiceGroup = null; private AxisService axisService = null; private AxisOperation axisOperation = null; private TransportOutDescription transportOut = null; private TransportInDescription transportIn = null; private MessageContext mc = null; private ArrayList executedHandlers = null; private String testArg = null; public OperationContextSaveTest(String arg0) { super(arg0); testArg = new String(arg0); try { prepare(); } catch (Exception e) { log.debug("OperationContextSaveTest:constructor: error in setting up object graph [" + e.getClass().getName() + " : " + e.getMessage() + "]"); } } // // prepare the object hierarchy for testing // private void prepare() throws Exception { //----------------------------------------------------------------- axisConfiguration = new AxisConfiguration(); configurationContext = new ConfigurationContext(axisConfiguration); configurationContext.getAxisConfiguration().addMessageReceiver( "http://www.w3.org/ns/wsdl/in-only", new RawXMLINOnlyMessageReceiver()); configurationContext.getAxisConfiguration().addMessageReceiver( "http://www.w3.org/ns/wsdl/in-out", new RawXMLINOutMessageReceiver()); DispatchPhase dispatchPhase = new DispatchPhase(); dispatchPhase.setName("Dispatch"); AddressingBasedDispatcher abd = new AddressingBasedDispatcher(); abd.initDispatcher(); RequestURIBasedDispatcher rud = new RequestURIBasedDispatcher(); rud.initDispatcher(); SOAPActionBasedDispatcher sabd = new SOAPActionBasedDispatcher(); sabd.initDispatcher(); SOAPMessageBodyBasedDispatcher smbd = new SOAPMessageBodyBasedDispatcher(); smbd.initDispatcher(); dispatchPhase.addHandler(abd); dispatchPhase.addHandler(rud); dispatchPhase.addHandler(sabd); dispatchPhase.addHandler(smbd); configurationContext.getAxisConfiguration().getInFlowPhases().add(dispatchPhase); //----------------------------------------------------------------- axisServiceGroup = new AxisServiceGroup(axisConfiguration); axisServiceGroup.setServiceGroupName("ServiceGroupTest"); axisService = new AxisService(serviceName.getLocalPart()); axisServiceGroup.addService(axisService); axisOperation = new InOutAxisOperation(operationName); axisOperation.setMessageReceiver(new MessageReceiver() { public void receive(MessageContext messageCtx) { } }); axisService.addOperation(axisOperation); axisService.mapActionToOperation(operationName.getLocalPart(), axisOperation); configurationContext.getAxisConfiguration().addService(axisService); //----------------------------------------------------------------- serviceGroupContext = configurationContext.createServiceGroupContext(axisService.getAxisServiceGroup()); serviceGroupContext.setId("ServiceGroupContextTest"); serviceContext = serviceGroupContext.getServiceContext(axisService); operationContext = serviceContext.createOperationContext(operationName); //----------------------------------------------------------------- transportOut = new TransportOutDescription("null"); transportOut.setSender(new HTTPClient4TransportSender()); transportIn = new TransportInDescription("null"); //----------------------------------------------------------------- mc = configurationContext.createMessageContext(); mc.setTransportIn(transportIn); mc.setTransportOut(transportOut); mc.setTransportOut(transportOut); mc.setServerSide(true); mc.setProperty(MessageContext.TRANSPORT_OUT, System.out); SOAPFactory omFac = OMAbstractFactory.getSOAP11Factory(); mc.setEnvelope(omFac.getDefaultEnvelope()); Phase phase1 = new Phase("beginPhase1"); phase1.addHandler(new TempHandler(1)); phase1.addHandler(new TempHandler(2)); phase1.addHandler(new TempHandler(3)); Phase phase2 = new Phase("middlePhase2"); phase2.addHandler(new TempHandler(4)); phase2.addHandler(new TempHandler(5)); phase2.addHandler(new TempHandler(6)); phase2.addHandler(new TempHandler(7)); phase2.addHandler(new TempHandler(8)); Phase phase3 = new Phase("lastPhase3"); phase3.addHandler(new TempHandler(9)); phase3.addHandler(new TempHandler(10)); axisOperation.getRemainingPhasesInFlow().add(phase1); axisOperation.getRemainingPhasesInFlow().add(phase2); axisOperation.getRemainingPhasesInFlow().add(phase3); mc.setWSAAction(operationName.getLocalPart()); mc.setSoapAction(operationName.getLocalPart()); System.out.flush(); mc.setMessageID(UIDGenerator.generateURNString()); //operationContext.addMessageContext(mc); gets done via the register axisOperation.registerOperationContext(mc, operationContext); mc.setOperationContext(operationContext); mc.setServiceContext(serviceContext); mc.setTo(new EndpointReference("axis2/services/NullService")); mc.setWSAAction("DummyOp"); //----------------------------------------------------------------- executedHandlers = new ArrayList(); } protected void setUp() throws Exception { //org.apache.log4j.BasicConfigurator.configure(); } public void testSaveAndRestore() throws Exception { File theFile = null; String theFilename = null; boolean saved = false; boolean restored = false; boolean done = false; boolean comparesOk = false; log.debug("OperationContextSaveTest:testSaveAndRestore(): BEGIN ---------------"); // --------------------------------------------------------- // setup a temporary file to use // --------------------------------------------------------- try { theFile = File.createTempFile("OpCtxSave", null); theFilename = theFile.getName(); log.debug("OperationContextSaveTest:testSaveAndRestore(): temp file = [" + theFilename + "]"); } catch (Exception ex) { log.debug( "OperationContextSaveTest:testSaveAndRestore(): error creating temp file = [" + ex.getMessage() + "]"); theFile = null; } if (theFile != null) { // --------------------------------------------------------- // save to the temporary file // --------------------------------------------------------- try { // setup an output stream to a physical file FileOutputStream outStream = new FileOutputStream(theFile); // attach a stream capable of writing objects to the // stream connected to the file ObjectOutputStream outObjStream = new ObjectOutputStream(outStream); // try to save the message context log.debug("OperationContextSaveTest:testSaveAndRestore(): saving ....."); saved = false; outObjStream.writeObject(operationContext); // close out the streams outObjStream.flush(); outObjStream.close(); outStream.flush(); outStream.close(); saved = true; log.debug( "OperationContextSaveTest:testSaveAndRestore(): ....save operation completed....."); long filesize = theFile.length(); log.debug("OperationContextSaveTest:testSaveAndRestore(): file size after save [" + filesize + "] temp file = [" + theFilename + "]"); } catch (Exception ex2) { log.debug("OperationContextSaveTest:testSaveAndRestore(): error during save [" + ex2.getClass().getName() + " : " + ex2.getMessage() + "]"); ex2.printStackTrace(); } assertTrue(saved); // --------------------------------------------------------- // restore from the temporary file // --------------------------------------------------------- try { // setup an input stream to the file FileInputStream inStream = new FileInputStream(theFile); // attach a stream capable of reading objects from the // stream connected to the file ObjectInputStream inObjStream = new ObjectInputStream(inStream); // try to restore the context log.debug("OperationContextSaveTest:testSaveAndRestore(): restoring ....."); restored = false; OperationContext opctx_restored = (OperationContext) inObjStream.readObject(); inObjStream.close(); inStream.close(); opctx_restored.activate(configurationContext); restored = true; log.debug( "OperationContextSaveTest:testSaveAndRestore(): ....restored operation completed....."); // compare to original comparesOk = opctx_restored.isEquivalent(operationContext); log.debug( "OperationContextSaveTest:testSaveAndRestore(): OperationContext equivalency [" + comparesOk + "]"); assertTrue(comparesOk); ServiceContext restored_srvCtx = opctx_restored.getServiceContext(); ServiceGroupContext restored_sgCtx = restored_srvCtx.getServiceGroupContext(); comparesOk = restored_sgCtx.isEquivalent(serviceGroupContext); log.debug( "OperationContextSaveTest:testSaveAndRestore(): ServiceGroupContext equivalency [" + comparesOk + "]"); assertTrue(comparesOk); } catch (Exception ex2) { log.debug("OperationContextSaveTest:testSaveAndRestore(): error during restore [" + ex2.getClass().getName() + " : " + ex2.getMessage() + "]"); ex2.printStackTrace(); } assertTrue(restored); // if the save/restore of the operation context succeeded, // then don't keep the temporary file around boolean removeTmpFile = saved && restored && comparesOk; if (removeTmpFile) { try { theFile.delete(); } catch (Exception e) { // just absorb it } } // indicate that the temp file was created ok done = true; } // this is false when there are problems with the temporary file assertTrue(done); log.debug("OperationContextSaveTest:testSaveAndRestore(): END ---------------"); } public class TempHandler extends AbstractHandler { private Integer index; //----------------------------------------------------------------- // constructors //----------------------------------------------------------------- public TempHandler(int index) { this.index = new Integer(index); init(new HandlerDescription(new String("handler" + index))); } //----------------------------------------------------------------- // methods //----------------------------------------------------------------- public InvocationResponse invoke(MessageContext msgContext) throws AxisFault { log.debug("TempHandler:invoke(): index = [" + index + "]"); executedHandlers.add(index); return InvocationResponse.CONTINUE; } } }