Package org.apache.axis2.jms

Source Code of org.apache.axis2.jms.JMSEchoRawXMLOneWayTest

/*
* 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.jms;

import junit.framework.TestCase;
import org.apache.activemq.broker.BrokerService;
import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
import org.apache.axis2.AxisFault;
import org.apache.axis2.Constants;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.client.ServiceClient;
import org.apache.axis2.context.ConfigurationContext;
import org.apache.axis2.description.AxisOperation;
import org.apache.axis2.description.AxisService;
import org.apache.axis2.description.InOnlyAxisOperation;
import org.apache.axis2.description.Parameter;
import org.apache.axis2.engine.Echo;
import org.apache.axis2.integration.UtilServer;
import org.apache.axis2.integration.UtilsJMSServer;
import org.apache.axis2.receivers.RawXMLINOnlyMessageReceiver;
import org.apache.axis2.transport.jms.JMSConstants;
import org.apache.axis2.wsdl.WSDLConstants;

import javax.naming.Context;
import javax.xml.namespace.QName;

/**
* This class contains unit tests for the jms implementation. Embedded ActiveMQ broker is used as
* JMS provider.
*/

/*
TODO:
- UtilServer.createClientConfigurationContext() uses
   target\test-resources\integrationRepo\ instead of
   target\test-resources\jms-enabled-client-repository
   and thus jms-enabled-client-axis2.xml is not used.
- JMSEchoRawXMLTest and this class can be combined.
- No fault case(calling echoFault, for example) is tested
- No message security(Rampart) over JMS is tested (I did but couldn't find
  time and easy way for adding it to Integration module :) )
- No JMS transport security(secure connection, for example) is tested
    - JMS implementaton doesn't support secure connection
      (conFac.createConnection(username, password))
     
      Standalone or embedded ActiveMQ can be configured for secure connection
      as mentioned here: http://issues.apache.org/activemq/browse/AMQ-982.
*/
public class JMSEchoRawXMLOneWayTest extends TestCase {

    private static final String INITIAL_CONTEXT_FACTORY =
            "org.apache.activemq.jndi.ActiveMQInitialContextFactory";
    private static final String PROVIDER_URL = "tcp://localhost:61654";
    private static final String CONNECTION_FACTORY_NAME = "QueueConnectionFactory";
    private static final String DESTINATION_NAME = "TestQueue";
    // USERNAME and PASSWORD are required only if broker has been
    // configured for authanticated connection to the context.
    // Works for SonicMQ but, couldn't find a way to do this for ActiveMQ :)
    private static final String USERNAME = null;
    private static final String PASSWORD = null;

    // ActiveMQ settings
    private BrokerService broker = null;
    private static final boolean USE_EMBEDDED_BROKER =
            true; // If false, standalone ActiveMQ broker is required.

    // Client (service consumer/JMS sender) variables
    private String targetEprUrl;
    private ConfigurationContext clientConfigContext;

    public JMSEchoRawXMLOneWayTest() throws AxisFault {
        super(JMSEchoRawXMLOneWayTest.class.getName());
    }

    public JMSEchoRawXMLOneWayTest(String testName) throws AxisFault {
        super(testName);
    }

    protected void setUp() throws Exception {
        initializeServerSide();
        initializeClientSide();
    }

    protected void tearDown() throws Exception {
        shutdownServerSide();
    }

    ////////////////////////////////////////////////////////////////////
    // HELPER METHODS
    ////////////////////////////////////////////////////////////////////

    private void initializeServerSide() throws Exception {
        if (USE_EMBEDDED_BROKER) {
            broker = new BrokerService();
            broker.setUseJmx(false);
            broker.setPersistent(false);
            // To enable security for embedded broker please
            // follow http://issues.apache.org/activemq/browse/AMQ-982
            //broker.setPlugins(new BrokerPlugin[] { new JaasAuthenticationPlugin () });
            broker.addConnector(PROVIDER_URL);
            broker.start();
        }

        UtilsJMSServer.start();
    }

    private void shutdownServerSide() throws Exception {
        // Gracefully shutdown the server
        UtilsJMSServer.stop();
        if (USE_EMBEDDED_BROKER) {
            broker.stop();
        }
    }

    private void initializeClientSide() throws Exception {
        targetEprUrl = createJmsEndpointURL();
        clientConfigContext = UtilServer.createClientConfigurationContext();
    }

    // Creates vendor specific JMS endpoint URL.
    private String createJmsEndpointURL() {
        return new StringBuffer("jms:/").append(DESTINATION_NAME)
                .append("?").append(JMSConstants.CONFAC_JNDI_NAME_PARAM).append("=")
                .append(CONNECTION_FACTORY_NAME)
                .append("&").append(Context.INITIAL_CONTEXT_FACTORY).append("=")
                .append(INITIAL_CONTEXT_FACTORY)
                .append("&").append(Context.PROVIDER_URL).append("=").append(PROVIDER_URL)
                .append("&").append(Context.SECURITY_PRINCIPAL).append("=").append(USERNAME)
                .append("&").append(Context.SECURITY_CREDENTIALS).append("=").append(PASSWORD)
                .toString();
    }

    private OMElement createPayload(QName serviceName, QName operationName) {
        OMFactory fac = OMAbstractFactory.getOMFactory();
        OMNamespace omNs = fac.createOMNamespace("http://localhost/axis2/services/"
                + serviceName.getLocalPart(), "my");
        OMElement method = fac.createOMElement(operationName.getLocalPart(), omNs);
        OMElement value = fac.createOMElement("myValue", omNs);
        value.addChild(fac.createOMText(value, "Isaac Asimov, The Foundation Trilogy"));
        method.addChild(value);

        return method;
    }


    protected AxisService createInOnlyService(QName serviceName, String serviceClassName,
                                              QName operationName)
            throws AxisFault {

        // Creates service that maps to the given service class
        AxisService service = new AxisService(serviceName.getLocalPart());
        service.setClassLoader(Thread.currentThread().getContextClassLoader());
        service.addParameter(new Parameter(
                Constants.SERVICE_CLASS, serviceClassName));

        // Adds an operation who's MEP is In-Only.
        AxisOperation operation = new InOnlyAxisOperation(operationName);
        operation.setMessageReceiver(new RawXMLINOnlyMessageReceiver());
        operation.setStyle(WSDLConstants.STYLE_RPC);
        service.addOperation(operation);

        return service;
    }

    /** Adds JMS configuration to the service. These parameters are normally loaded from service.xml */
    protected AxisService addDestination(AxisService service, String destinationName)
            throws AxisFault {

        //service.addParameter(new Parameter(JMSConstants.CONFAC_PARAM,
        //    "default"));
        service.addParameter(new Parameter(JMSConstants.DEST_PARAM,
                                           destinationName));

        return service;
    }

    ////////////////////////////////////////////////////////////////////
    // UNIT TESTS
    ////////////////////////////////////////////////////////////////////


    /**
     * Calls 'echoOMElementNoResponse' operation of the EchoXMLService service in one-way fashion.
     * Therefore, we don't expect a response from the service.
     * <p/>
     * When this test sends message to the queue, the server retrieves and delegates it to the
     * 'echoOMElementNoResponse' method of Echo class.
     */
    public void test01EchoOMElementNoResponse() throws Exception {
        try {
            // Service and transport variables common both to service provider and
            // service consumer
            Class serviceClass = Echo.class;
            QName serviceName = new QName("EchoXMLService");
            QName operationName = new QName("echoOMElementNoResponse");

            ////////////////////////////////////////////////////
            // Service side processes
            ////////////////////////////////////////////////////

            //create and deploy the service
            AxisService service = createInOnlyService(serviceName,
                                                      serviceClass.getName(),
                                                      operationName);

            service = addDestination(service, DESTINATION_NAME);

            UtilsJMSServer.deployService(service);

            ////////////////////////////////////////////////////
            // Client side processes.
            //
            // We don't need to create an AxisService for client side.
            ////////////////////////////////////////////////////

            OMElement payload = createPayload(serviceName, operationName);
            Options options = new Options();
            options.setTo(new EndpointReference(targetEprUrl));
            options.setTransportInProtocol(Constants.TRANSPORT_JMS);
            options.setAction(serviceName.getLocalPart());
            options.setUseSeparateListener(true);

            ServiceClient sender = new ServiceClient(clientConfigContext, null);
            sender.setOptions(options);
            sender.fireAndForget(payload);

            // Wait while the message being sent to the queue. Otherwise,
            // message sending process will be canceled while exiting
            // the test and there will be no message in queue.
            Thread.sleep(3500);

            // Undeploy the service (don't listen to it anymore)
            UtilsJMSServer.unDeployService(serviceName);

        } catch (AxisFault axisFault) {
            axisFault.printStackTrace();
            fail();
        }
    }
}
TOP

Related Classes of org.apache.axis2.jms.JMSEchoRawXMLOneWayTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.