org.apache.cactus.internal.server.MessageDrivenBeanTestController.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.cactus.internal.server.MessageDrivenBeanTestController.java

Source

/* 
 * ========================================================================
 * 
 * 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.cactus.internal.server;

import org.apache.cactus.internal.HttpServiceDefinition;
import org.apache.cactus.internal.ServiceEnumeration;
import org.apache.cactus.spi.server.ImplicitObjects;
import org.apache.cactus.spi.server.MessageDrivenBeanImplicitObjects;
import org.apache.cactus.spi.server.TestController;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import javax.jms.JMSException;
import javax.jms.Message;

/**
 * MDB Controller that extracts the requested service from the
 * JMS request and executes the request by calling a
 * <code>MessageDrivenBeanTestCaller</code>. There are 2 services available : 
 * one for executing the test and one for returning the test result.
 *
 * @version $Id: MessageDrivenBeantestController.java 238991 2004-05-22 11:34:50Z ptahchiev $
 */
public class MessageDrivenBeanTestController implements TestController {

    /**
     * The logger.
     */
    private static final Log LOGGER = LogFactory.getLog(MessageDrivenBeanTestController.class);

    /**
     * {@inheritDoc}
     * @see AbstractWebTestController#getTestCaller(WebImplicitObjects)
     */
    protected MessageDrivenBeanTestCaller getTestCaller(MessageDrivenBeanImplicitObjects theObjects) {
        return new MessageDrivenBeanTestCaller(theObjects);
    }

    /**
     * This method is supposed to handle the request from the Redirector.
     * 
     * @param theObjects for the request
     * @throws JMSException in case an error occurs
     */
    public void handleRequest(ImplicitObjects theObjects) throws JMSException {
        MessageDrivenBeanImplicitObjects mdbImplicitObjects = (MessageDrivenBeanImplicitObjects) theObjects;

        // If the Cactus user has forgotten to put a needed jar on the server
        // classpath (i.e. in WEB-INF/lib), then the servlet engine Webapp
        // class loader will throw a NoClassDefFoundError exception. As this
        // method is the entry point of the webapp, we'll catch all
        // NoClassDefFoundError exceptions and report a nice error message
        // for the user so that he knows he has forgotten to put a jar in the
        // classpath. If we don't do this, the error will be trapped by the
        // container and may not result in an ... err ... understandable error
        // message (like in Tomcat) ...
        try {
            String serviceName = getServiceName(mdbImplicitObjects.getMessage());

            MessageDrivenBeanTestCaller caller = getTestCaller(mdbImplicitObjects);

            // TODO: will need a factory here real soon...

            ServiceEnumeration service = ServiceEnumeration.valueOf(serviceName);

            // Is it the call test method service ?
            if (service == ServiceEnumeration.CALL_TEST_SERVICE) {
                caller.doTest();
            }
            // Is it the get test results service ?
            else if (service == ServiceEnumeration.GET_RESULTS_SERVICE) {
                caller.doGetResults();
            }
            // Is it the test connection service ?
            // This service is only used to verify that connection between
            // client and server is working fine
            else if (service == ServiceEnumeration.RUN_TEST_SERVICE) {
                caller.doRunTest();
            }
            // Is it the service to create an HTTP session?
            else if (service == ServiceEnumeration.CREATE_SESSION_SERVICE) {
                caller.doCreateSession();
            } else if (service == ServiceEnumeration.GET_VERSION_SERVICE) {
                caller.doGetVersion();
            } else {
                String message = "Unknown service [" + serviceName + "] in HTTP request.";

                LOGGER.error(message);
                throw new JMSException(message);
            }
        } catch (NoClassDefFoundError e) {
            // try to display messages as descriptive as possible !
            if (e.getMessage().startsWith("junit/framework")) {
                String message = "You must put the JUnit jar in "
                        + "your server classpath (in WEB-INF/lib for example)";

                LOGGER.error(message, e);
                throw new JMSException(message);
            } else {
                String message = "You are missing a jar in your " + "classpath (class [" + e.getMessage()
                        + "] could not " + "be found";

                LOGGER.error(message, e);
                throw new JMSException(message);
            }
        }
    }

    /**
     * @param theRequest the JMS message
     * @return the service name of the service to call (there are 2 services
     *         "do test" and "get results"), extracted from the JMS message
     * @exception JMSException if the service to execute is missing from
     *            the JMS message
     */
    private String getServiceName(Message theRequest) throws JMSException {
        // Call the correct Service method
        String serviceName = theRequest.getStringProperty(HttpServiceDefinition.SERVICE_NAME_PARAM);

        //String serviceName = ServletUtil.getQueryStringParameter(queueName, 
        //    HttpServiceDefinition.SERVICE_NAME_PARAM);

        if (serviceName == null) {
            String message = "Missing service name parameter [" + HttpServiceDefinition.SERVICE_NAME_PARAM
                    + "] in HTTP request. Received query string is [" + serviceName + "].";

            LOGGER.debug(message);
            throw new JMSException(message);
        }

        LOGGER.debug("Service to call = " + serviceName);

        return serviceName;
    }

}