/* * 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.context.externalize.ActivateUtils; import org.apache.axis2.description.AxisMessage; 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.SimpleHTTPServer; import org.apache.axis2.transport.http.impl.httpclient4.HTTPClient4TransportSender; import org.apache.axis2.wsdl.WSDLConstants; 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; import java.util.HashMap; import java.util.Iterator; import java.util.List; public class MessageContextSaveATest extends TestCase { protected static final Log log = LogFactory.getLog(MessageContextSaveATest.class); private QName serviceName = new QName("TestService"); private QName operationName = new QName("Operation_1"); private ConfigurationContext configurationContext = null; private ServiceGroupContext serviceGroupContext = null; private OperationContext operationContext = null; private AxisServiceGroup axisServiceGroup = null; private AxisService axisService = null; private AxisOperation axisOperation = null; private AxisMessage axisMessage = null; private Phase phase1 = null; private Phase phase2 = null; private Phase phase3 = null; private Phase phase4 = null; private Phase phase5 = null; private Phase phase6 = null; private Phase phase7 = null; private MessageContext mc = null; private MessageContext mc2 = null; private ArrayList executedHandlers = null; public MessageContextSaveATest(String arg0) { super(arg0); try { prepare(); } catch (Exception e) { log.debug("MessageContextSaveATest:constructor: error in setting up object graph [" + e.getClass().getName() + " : " + e.getMessage() + "]"); } } // // prepare the object hierarchy for testing // private void prepare() throws Exception { //----------------------------------------------------------------- AxisConfiguration 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 serviceContext = serviceGroupContext.getServiceContext(axisService); operationContext = serviceContext.createOperationContext(operationName); //----------------------------------------------------------------- TransportOutDescription transportOut = new TransportOutDescription("null"); TransportOutDescription transportOut2 = new TransportOutDescription("happy"); TransportOutDescription transportOut3 = new TransportOutDescription("golucky"); transportOut.setSender(new HTTPClient4TransportSender()); transportOut2.setSender(new HTTPClient4TransportSender()); transportOut3.setSender(new HTTPClient4TransportSender()); axisConfiguration.addTransportOut(transportOut3); axisConfiguration.addTransportOut(transportOut2); axisConfiguration.addTransportOut(transportOut); TransportInDescription transportIn = new TransportInDescription("null"); TransportInDescription transportIn2 = new TransportInDescription("always"); TransportInDescription transportIn3 = new TransportInDescription("thebest"); transportIn.setReceiver(new SimpleHTTPServer()); transportIn2.setReceiver(new SimpleHTTPServer()); transportIn3.setReceiver(new SimpleHTTPServer()); axisConfiguration.addTransportIn(transportIn2); axisConfiguration.addTransportIn(transportIn); axisConfiguration.addTransportIn(transportIn3); //----------------------------------------------------------------- mc = configurationContext.createMessageContext(); mc.setTransportIn(transportIn); mc.setTransportOut(transportOut); mc.setServerSide(true); // mc.setProperty(MessageContext.TRANSPORT_OUT, System.out); SOAPFactory omFac = OMAbstractFactory.getSOAP11Factory(); mc.setEnvelope(omFac.getDefaultEnvelope()); phase1 = new Phase("beginPhase1"); phase1.addHandler(new TempHandler(1)); phase1.addHandler(new TempHandler(2)); phase1.addHandler(new TempHandler(3)); phase1.addHandler(new TempHandler(4)); phase1.addHandler(new TempHandler(5)); phase1.addHandler(new TempHandler(6)); phase1.addHandler(new TempHandler(7)); phase1.addHandler(new TempHandler(8)); phase1.addHandler(new TempHandler(9)); phase2 = new Phase("middlePhase2"); phase2.addHandler(new TempHandler(10)); phase2.addHandler(new TempHandler(11)); phase2.addHandler(new TempHandler(12)); phase2.addHandler(new TempHandler(13)); phase2.addHandler(new TempHandler(14)); phase2.addHandler(new TempHandler(15, true)); phase2.addHandler(new TempHandler(16)); phase2.addHandler(new TempHandler(17)); phase2.addHandler(new TempHandler(18)); phase3 = new Phase("lastPhase3"); phase3.addHandler(new TempHandler(19)); phase3.addHandler(new TempHandler(20)); phase3.addHandler(new TempHandler(21)); phase3.addHandler(new TempHandler(22)); phase3.addHandler(new TempHandler(23)); phase3.addHandler(new TempHandler(24)); phase3.addHandler(new TempHandler(25)); phase3.addHandler(new TempHandler(26)); phase3.addHandler(new TempHandler(27)); phase4 = new Phase("extraPhase1"); phase4.addHandler(new TempHandler(28)); phase4.addHandler(new TempHandler(29)); phase5 = new Phase("extraPhase2"); phase5.addHandler(new TempHandler(30)); phase6 = new Phase("extraPhase3"); phase6.addHandler(new TempHandler(31, true)); phase6.addHandler(new TempHandler(32)); phase7 = new Phase("extraPhase4"); phase7.addHandler(new TempHandler(33)); phase7.addHandler(new TempHandler(34)); phase7.addHandler(new TempHandler(35)); axisOperation.getRemainingPhasesInFlow().add(phase1); axisOperation.getRemainingPhasesInFlow().add(phase2); axisOperation.getRemainingPhasesInFlow().add(phase3); axisOperation.getRemainingPhasesInFlow().add(phase4); axisOperation.getRemainingPhasesInFlow().add(phase5); axisOperation.getRemainingPhasesInFlow().add(phase6); axisOperation.getRemainingPhasesInFlow().add(phase7); ArrayList phases = new ArrayList(); phases.add(phase1); phases.add(phase2); phases.add(phase3); phases.add(phase4); phases.add(phase5); phases.add(phase6); phases.add(phase7); axisConfiguration.setInPhasesUptoAndIncludingPostDispatch(phases); 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"); axisMessage = axisOperation.getMessage(WSDLConstants.MESSAGE_LABEL_IN_VALUE); mc.setAxisMessage(axisMessage); //----------------------------------------------------------------- executedHandlers = new ArrayList(); } protected void setUp() throws Exception { //org.apache.log4j.BasicConfigurator.configure(); } public void testReceive() throws Exception { log.debug( "MessageContextSaveATest:testReceive(): start - - engine.receive(mc) - - - - - - - - - - - - - - - -"); AxisEngine.receive(mc); log.debug( "MessageContextSaveATest:testReceive(): resume - - engine.resume(mc) - - - - - - - - - - - - - - - -"); AxisEngine.resume(mc); assertEquals(30, executedHandlers.size()); for (int i = 15; i < 30; i++) { assertEquals(((Integer) executedHandlers.get(i)).intValue(), i + 1); } // get the phase lists and see if they match up ArrayList restoredPhases = mc2.getExecutionChain(); int it_count = 0; Iterator it = restoredPhases.iterator(); while (it.hasNext()) { // we know everything at this level is a Phase. // if you change it, you might get a ClassCastException Phase restored_phase = (Phase) it.next(); Phase original_phase = null; it_count++; if (it_count == 1) { original_phase = phase1; } else if (it_count == 2) { original_phase = phase2; } else if (it_count == 3) { original_phase = phase3; } else if (it_count == 4) { original_phase = phase4; } else if (it_count == 5) { original_phase = phase5; } else if (it_count == 6) { original_phase = phase6; } else if (it_count == 7) { original_phase = phase7; } else { // unexpected assertTrue(false); } boolean isOk = comparePhases(restored_phase, original_phase); assertTrue(isOk); } // ------------------------------------------------------------------- // second resume to start the second pause // ------------------------------------------------------------------- log.debug( "MessageContextSaveATest:testReceive(): resume - - engine.resume(mc) - - - - - - - - - - - - - - - -"); AxisEngine.resume(mc); assertEquals(35, executedHandlers.size()); for (int i = 31; i < 35; i++) { assertEquals(((Integer) executedHandlers.get(i)).intValue(), i + 1); } // get the phase lists and see if they match up restoredPhases = mc2.getExecutionChain(); it_count = 0; it = restoredPhases.iterator(); while (it.hasNext()) { // we know everything at this level is a Phase. // if you change it, you might get a ClassCastException Phase restored_phase = (Phase) it.next(); Phase original_phase = null; it_count++; if (it_count == 1) { original_phase = phase1; } else if (it_count == 2) { original_phase = phase2; } else if (it_count == 3) { original_phase = phase3; } else if (it_count == 4) { original_phase = phase4; } else if (it_count == 5) { original_phase = phase5; } else if (it_count == 6) { original_phase = phase6; } else if (it_count == 7) { original_phase = phase7; } else { // unexpected assertTrue(false); } boolean isOk = comparePhases(restored_phase, original_phase); assertTrue(isOk); } } /** * Gets the ID associated with the handler object. * * @param o The handler object * @return The ID associated with the handler, * -1 otherwise */ private int getHandlerID(Object o) { int id = -1; if (o instanceof TempHandler) { id = ((TempHandler) o).getHandlerID(); } return id; } /** * Check the handler objects to see if they are equivalent. * * @param o1 The first handler * @param o2 The second handler * @return TRUE if the handler objects are equivalent, * FALSE otherwise */ private boolean compareHandlers(Object o1, Object o2) { if ((o1 == null) && (o2 == null)) { return true; } if ((o1 != null) && (o2 != null)) { String c1 = o1.getClass().getName(); String c2 = o2.getClass().getName(); if (c1.equals(c2)) { log.debug("MessageContextSaveATest::compareHandlers: class [" + c1 + "] match "); int id1 = getHandlerID(o1); int id2 = getHandlerID(o2); if (id1 == id2) { log.debug("MessageContextSaveATest::compareHandlers: id [" + id1 + "] match"); return true; } else { log.debug("MessageContextSaveATest::compareHandlers: id1 [" + id1 + "] != id2 [" + id2 + "] "); return false; } } else { log.debug("MessageContextSaveATest::compareHandlers: class1 [" + c1 + "] != class2 [" + c2 + "] "); return false; } } return false; } /** * Compare two phases. * * @param o1 The first phase object * @param o2 The second phase object * @return TRUE if the phases are equivalent, * FALSE otherwise */ private boolean comparePhases(Object o1, Object o2) { if ((o1 == null) && (o2 == null)) { log.debug( "MessageContextSaveATest: comparePhases: Phase1[] == Phase2[] - both null objects"); return true; } if (((o1 != null) && (o2 != null)) && ((o1 instanceof Phase) && (o2 instanceof Phase)) ) { try { Phase p1 = (Phase) o1; Phase p2 = (Phase) o2; String name1 = p1.getName(); String name2 = p2.getName(); List list1 = p1.getHandlers(); List list2 = p2.getHandlers(); if ((list1 == null) && (list2 == null)) { log.debug("MessageContextSaveATest: comparePhases: Phase1[" + name1 + "] == Phase2[" + name2 + "]"); return true; } if ((list1 != null) && (list2 != null)) { int size1 = list1.size(); int size2 = list2.size(); if (size1 != size2) { log.debug("MessageContextSaveATest: comparePhases: Phase1[" + name1 + "] != Phase2[" + name2 + "] - mismatched size of handler lists"); return false; } for (int j = 0; j < size1; j++) { Object obj1 = list1.get(j); Object obj2 = list2.get(j); if ((obj1 == null) && (obj2 == null)) { // ok } else if ((obj1 != null) && (obj2 != null)) { boolean check; if (obj1 instanceof Phase) { check = comparePhases(obj1, obj2); } else { // must be a handler check = compareHandlers(obj1, obj2); } if (!check) { log.debug( "MessageContextSaveATest: comparePhases: Phase1[" + name1 + "] != Phase2[" + name2 + "] - mismatched handler lists"); return false; } } else { // mismatch log.debug("MessageContextSaveATest: comparePhases: Phase1[" + name1 + "] != Phase2[" + name2 + "] - mismatched handler lists"); return false; } } // if we got here, the comparison completed ok // with a match log.debug("MessageContextSaveATest: comparePhases: Phase1[" + name1 + "] == Phase2[" + name2 + "] - matched handler lists"); return true; } } catch (Exception e) { // some error e.printStackTrace(); } } log.debug("MessageContextSaveATest: comparePhases: Phase1[] != Phase2[]"); return false; } private void showMcMap(HashMap map) { if ((map != null) && (!map.isEmpty())) { Iterator itList = map.keySet().iterator(); while (itList.hasNext()) { String key = (String) itList.next(); MessageContext value = (MessageContext) map.get(key); String valueID = null; if (value != null) { valueID = value.getMessageID(); log.debug( "MessageContextSaveATest: showMcMap: Message context ID[" + valueID + "] Key Label [" + key + "]"); } } } else { log.debug( "MessageContextSaveATest: showMcMap: No entries to display for message contexts table."); } } // this checks the save/restore of a message context that hasn't been // through the engine to simulate what some WS-RM implementations // need to do - make a simple message context for a RM ack or other // simple message public void testSimpleMC() throws Exception { String title = "MessageContextSaveATest:testSimpleMC(): "; log.debug(title + "start - - - - - - - - - - - - - - - -"); MessageContext simpleMsg = new MessageContext(); MessageContext restoredSimpleMsg = null; File theFile = null; String theFilename = null; boolean savedMessageContext = false; boolean restoredMessageContext = false; boolean comparesOk = false; try { theFile = File.createTempFile("Simple", null); theFilename = theFile.getName(); log.debug(title + "temp file = [" + theFilename + "]"); } catch (Exception ex) { log.debug(title + "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(title + "saving message context....."); savedMessageContext = false; outObjStream.writeObject(simpleMsg); // close out the streams outObjStream.flush(); outObjStream.close(); outStream.flush(); outStream.close(); savedMessageContext = true; log.debug(title + "....saved message context....."); long filesize = theFile.length(); log.debug(title + "file size after save [" + filesize + "] temp file = [" + theFilename + "]"); } catch (Exception ex2) { log.debug(title + "error with saving message context = [" + ex2.getClass().getName() + " : " + ex2.getMessage() + "]"); ex2.printStackTrace(); } assertTrue(savedMessageContext); // --------------------------------------------------------- // 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 message context log.debug(title + "restoring a message context....."); restoredMessageContext = false; restoredSimpleMsg = (MessageContext) inObjStream.readObject(); inObjStream.close(); inStream.close(); restoredSimpleMsg.activate(configurationContext); restoredMessageContext = true; log.debug(title + "....restored message context....."); // compare to original execution chain ArrayList restored_execChain = restoredSimpleMsg.getExecutionChain(); ArrayList orig_execChain = simpleMsg.getExecutionChain(); comparesOk = ActivateUtils.isEquivalent(restored_execChain, orig_execChain, false); log.debug(title + "execution chain equivalency [" + comparesOk + "]"); assertTrue(comparesOk); // check executed list Iterator restored_executed_it = restoredSimpleMsg.getExecutedPhases(); Iterator orig_executed_it = simpleMsg.getExecutedPhases(); if ((restored_executed_it != null) && (orig_executed_it != null)) { while (restored_executed_it.hasNext() && orig_executed_it.hasNext()) { Object p1 = restored_executed_it.next(); Object p2 = orig_executed_it.next(); comparesOk = comparePhases(p1, p2); log.debug(title + "executed phase list: compare phases [" + comparesOk + "]"); assertTrue(comparesOk); } } else { // problem with the executed lists assertTrue(false); } } catch (Exception ex2) { log.debug(title + "error with saving message context = [" + ex2.getClass().getName() + " : " + ex2.getMessage() + "]"); ex2.printStackTrace(); } assertTrue(restoredMessageContext); // if the save/restore of the message context succeeded, // then don't keep the temporary file around boolean removeTmpFile = savedMessageContext && restoredMessageContext && comparesOk; if (removeTmpFile) { try { theFile.delete(); } catch (Exception e) { // just absorb it } } } log.debug(title + "end - - - - - - - - - - - - - - - -"); } // this checks the save/restore of a message context that has // some properties set public void testMcProperties() throws Exception { String title = "MessageContextSaveATest:testMcProperties(): "; log.debug(title + "start - - - - - - - - - - - - - - - -"); MessageContext simpleMsg = new MessageContext(); MessageContext restoredSimpleMsg = null; simpleMsg.setProperty("key1", "value1"); simpleMsg.setProperty("key2", null); simpleMsg.setProperty("key3", new Integer(3)); simpleMsg.setProperty("key4", new Long(4L)); File theFile = null; String theFilename = null; boolean pause = false; boolean savedMessageContext = false; boolean restoredMessageContext = false; boolean comparesOk = false; try { theFile = File.createTempFile("McProps", null); theFilename = theFile.getName(); log.debug(title + "temp file = [" + theFilename + "]"); } catch (Exception ex) { log.debug(title + "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(title + "saving message context....."); savedMessageContext = false; outObjStream.writeObject(simpleMsg); // close out the streams outObjStream.flush(); outObjStream.close(); outStream.flush(); outStream.close(); savedMessageContext = true; log.debug(title + "....saved message context....."); long filesize = theFile.length(); log.debug(title + "file size after save [" + filesize + "] temp file = [" + theFilename + "]"); } catch (Exception ex2) { log.debug(title + "error with saving message context = [" + ex2.getClass().getName() + " : " + ex2.getMessage() + "]"); ex2.printStackTrace(); } assertTrue(savedMessageContext); // --------------------------------------------------------- // 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 message context log.debug(title + "restoring a message context....."); restoredMessageContext = false; restoredSimpleMsg = (MessageContext) inObjStream.readObject(); inObjStream.close(); inStream.close(); restoredSimpleMsg.activate(configurationContext); restoredMessageContext = true; log.debug(title + "....restored message context....."); // compare to original execution chain ArrayList restored_execChain = restoredSimpleMsg.getExecutionChain(); ArrayList orig_execChain = simpleMsg.getExecutionChain(); comparesOk = ActivateUtils.isEquivalent(restored_execChain, orig_execChain, false); log.debug(title + "execution chain equivalency [" + comparesOk + "]"); assertTrue(comparesOk); // check executed list Iterator restored_executed_it = restoredSimpleMsg.getExecutedPhases(); Iterator orig_executed_it = simpleMsg.getExecutedPhases(); if ((restored_executed_it != null) && (orig_executed_it != null)) { while (restored_executed_it.hasNext() && orig_executed_it.hasNext()) { Object p1 = restored_executed_it.next(); Object p2 = orig_executed_it.next(); comparesOk = comparePhases(p1, p2); log.debug(title + "executed phase list: compare phases [" + comparesOk + "]"); assertTrue(comparesOk); } } else { // problem with the executed lists assertTrue(false); } // check the properties String value1 = (String) restoredSimpleMsg.getProperty("key1"); Object value2 = restoredSimpleMsg.getProperty("key2"); Integer value3 = (Integer) restoredSimpleMsg.getProperty("key3"); Long value4 = (Long) restoredSimpleMsg.getProperty("key4"); assertEquals("value1", value1); assertNull(value2); boolean isOk = false; if ((value3 != null) && value3.equals(new Integer(3))) { isOk = true; } assertTrue(isOk); if ((value4 != null) && value4.equals(new Long(4L))) { isOk = true; } assertTrue(isOk); } catch (Exception ex2) { log.debug(title + "error with restoring message context = [" + ex2.getClass().getName() + " : " + ex2.getMessage() + "]"); ex2.printStackTrace(); } assertTrue(restoredMessageContext); // if the save/restore of the message context succeeded, // then don't keep the temporary file around boolean removeTmpFile = savedMessageContext && restoredMessageContext && comparesOk; if (removeTmpFile) { try { theFile.delete(); } catch (Exception e) { // just absorb it } } } log.debug(title + "end - - - - - - - - - - - - - - - -"); } public void testMapping() throws Exception { String title = "MessageContextSaveATest:testMapping(): "; log.debug(title + "start - - - - - - - - - - - - - - - -"); MessageContext restoredMC = null; //--------------------------------------------------------------------- // make sure that the operation context messageContexts table // has an entry for the message context that we working with //--------------------------------------------------------------------- // look at the OperationContext messageContexts table HashMap mcMap1 = mc.getOperationContext().getMessageContexts(); if ((mcMap1 == null) || (mcMap1.isEmpty())) { mc.getAxisOperation().addMessageContext(mc, mc.getOperationContext()); } // update the table mcMap1 = mc.getOperationContext().getMessageContexts(); log.debug(title + "- - - - - original message contexts table- - - - - - - - - - -"); showMcMap(mcMap1); //--------------------------------------------------------------------- // save and restore the message context //--------------------------------------------------------------------- File theFile; String theFilename = null; boolean pause = false; boolean savedMessageContext = false; boolean restoredMessageContext = false; boolean comparesOk = false; try { theFile = File.createTempFile("McMappings", null); theFilename = theFile.getName(); log.debug(title + "temp file = [" + theFilename + "]"); } catch (Exception ex) { log.debug(title + "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(title + "saving message context....."); savedMessageContext = false; outObjStream.writeObject(mc); // close out the streams outObjStream.flush(); outObjStream.close(); outStream.flush(); outStream.close(); savedMessageContext = true; log.debug(title + "....saved message context....."); long filesize = theFile.length(); log.debug(title + "file size after save [" + filesize + "] temp file = [" + theFilename + "]"); } catch (Exception ex2) { log.debug(title + "error with saving message context = [" + ex2.getClass().getName() + " : " + ex2.getMessage() + "]"); ex2.printStackTrace(); } assertTrue(savedMessageContext); // --------------------------------------------------------- // 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 message context log.debug(title + "restoring a message context....."); restoredMessageContext = false; restoredMC = (MessageContext) inObjStream.readObject(); inObjStream.close(); inStream.close(); restoredMC.activate(configurationContext); restoredMessageContext = true; log.debug(title + "....restored message context....."); // get the table after the restore HashMap mcMap2 = restoredMC.getOperationContext().getMessageContexts(); log.debug( "MessageContextSaveATest:testMapping(): - - - - - restored message contexts table- - - - - - - - - - -"); showMcMap(mcMap2); boolean okMap = compareMCMaps(mcMap1, mcMap2); assertTrue(okMap); } catch (Exception ex2) { log.debug(title + "error with restoring message context = [" + ex2.getClass().getName() + " : " + ex2.getMessage() + "]"); ex2.printStackTrace(); } assertTrue(restoredMessageContext); // if the save/restore of the message context succeeded, // then don't keep the temporary file around boolean removeTmpFile = savedMessageContext && restoredMessageContext && comparesOk; if (removeTmpFile) { try { theFile.delete(); } catch (Exception e) { // just absorb it } } } log.debug(title + "end - - - - - - - - - - - - - - - -"); } private boolean compareMCMaps(HashMap m1, HashMap m2) { String title = "MessageContextSaveATest:compareMCMaps(): "; if ((m1 != null) && (m2 != null)) { int size1 = m1.size(); int size2 = m2.size(); if (size1 != size2) { log.debug(title + "MISMATCH: map1 size [" + size1 + "] != map2 size [" + size2 + "]"); return false; } String id1 = null; String id2 = null; // check the keys, ordering is not important between the two maps Iterator it1 = m1.keySet().iterator(); while (it1.hasNext()) { String key1 = (String) it1.next(); MessageContext value1 = (MessageContext) m1.get(key1); if (value1 != null) { id1 = value1.getMessageID(); MessageContext value2 = (MessageContext) m2.get(key1); if (value2 != null) { id2 = value2.getMessageID(); } else { // mismatch log.debug(title + "MISMATCH: no message context in one of the tables for key [" + key1 + "]"); return false; } if ((id1 != null) && (id2 != null)) { if (!id1.equals(id2)) { // mismatch log.debug(title + "MISMATCH: messageID_1 [" + id1 + "] != messageID_2 [" + id2 + "]"); return false; } } else { // null values, can't tell log.debug(title + "MISMATCH: one or more null message IDs"); return false; } } } return true; } else if ((m1 == null) && (m2 == null)) { return true; } else { // mismatch log.debug(title + "MISMATCH: one of the tables is null"); return false; } } public class TempHandler extends AbstractHandler { private Integer handlerID = null; private File theFile = null; private String theFilename = null; private boolean pause = false; private boolean savedMessageContext = false; private boolean restoredMessageContext = false; private boolean comparesOk = false; //----------------------------------------------------------------- // constructors //----------------------------------------------------------------- public TempHandler() { this.handlerID = new Integer(-5); } public TempHandler(int index, boolean pause) { this.handlerID = new Integer(index); this.pause = pause; init(new HandlerDescription("handler" + index)); } public TempHandler(int index) { this.handlerID = new Integer(index); init(new HandlerDescription("handler" + index)); } //----------------------------------------------------------------- // methods //----------------------------------------------------------------- public int getHandlerID() { if (handlerID != null) { return handlerID.intValue(); } return -5; } public InvocationResponse invoke(MessageContext msgContext) throws AxisFault { String title = "TempHandler[" + getHandlerID() + "]:invoke(): "; log.debug(title + "pause = [" + pause + "]"); savedMessageContext = false; restoredMessageContext = false; if (pause) { log.debug(title + "msgContext.pause()"); msgContext.pause(); pause = false; try { theFile = File.createTempFile("mcSave", null); theFilename = theFile.getName(); log.debug(title + "temp file = [" + theFilename + "]"); } catch (Exception ex) { log.debug(title + "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(title + "saving message context....."); savedMessageContext = false; outObjStream.writeObject(msgContext); // close out the streams outObjStream.flush(); outObjStream.close(); outStream.flush(); outStream.close(); savedMessageContext = true; log.debug(title + "....saved message context....."); long filesize = theFile.length(); log.debug(title + "file size after save [" + filesize + "] temp file = [" + theFilename + "]"); } catch (Exception ex2) { log.debug(title + "error with saving message context = [" + ex2.getClass().getName() + " : " + ex2.getMessage() + "]"); ex2.printStackTrace(); } assertTrue(savedMessageContext); // --------------------------------------------------------- // 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 message context log.debug(title + "restoring a message context....."); restoredMessageContext = false; MessageContext msgContext2 = (MessageContext) inObjStream.readObject(); inObjStream.close(); inStream.close(); msgContext2.activate(configurationContext); restoredMessageContext = true; log.debug(title + "....restored message context....."); // compare to original execution chain ArrayList restored_execChain = msgContext2.getExecutionChain(); ArrayList orig_execChain = msgContext.getExecutionChain(); comparesOk = ActivateUtils .isEquivalent(restored_execChain, orig_execChain, false); log.debug(title + "execution chain equivalency [" + comparesOk + "]"); assertTrue(comparesOk); // check executed list Iterator restored_executed_it = msgContext2.getExecutedPhases(); Iterator orig_executed_it = msgContext.getExecutedPhases(); if ((restored_executed_it != null) && (orig_executed_it != null)) { while (restored_executed_it.hasNext() && orig_executed_it.hasNext()) { Object p1 = restored_executed_it.next(); Object p2 = orig_executed_it.next(); comparesOk = comparePhases(p1, p2); log.debug(title + "executed phase list: compare phases [" + comparesOk + "]"); assertTrue(comparesOk); } } else { // problem with the executed lists assertTrue(false); } // now put the restored message context in the global // variable for the test mc2 = msgContext2; } catch (Exception ex2) { log.debug(title + "error with saving message context = [" + ex2.getClass().getName() + " : " + ex2.getMessage() + "]"); ex2.printStackTrace(); } assertTrue(restoredMessageContext); // if the save/restore of the message context succeeded, // then don't keep the temporary file around boolean removeTmpFile = savedMessageContext && restoredMessageContext && comparesOk; if (removeTmpFile) { try { theFile.delete(); } catch (Exception e) { // just absorb it } } } return InvocationResponse.SUSPEND; } else { log.debug(title + "executedHandlers.add(" + handlerID + ")"); executedHandlers.add(handlerID); } return InvocationResponse.CONTINUE; } } }