You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-commits@axis.apache.org by sa...@apache.org on 2012/01/13 12:41:11 UTC

svn commit: r1231015 - in /axis/axis2/java/core/trunk/modules/adb/src/org/apache/axis2/rpc/receivers/ejb: EJB3InOnlyMessageReceiver.java EJB3MessageReceiver.java EJB3Util.java

Author: sagara
Date: Fri Jan 13 11:41:11 2012
New Revision: 1231015

URL: http://svn.apache.org/viewvc?rev=1231015&view=rev
Log:
Applied patch for AXIS2-5204.

Added:
    axis/axis2/java/core/trunk/modules/adb/src/org/apache/axis2/rpc/receivers/ejb/EJB3InOnlyMessageReceiver.java   (with props)
    axis/axis2/java/core/trunk/modules/adb/src/org/apache/axis2/rpc/receivers/ejb/EJB3MessageReceiver.java   (with props)
    axis/axis2/java/core/trunk/modules/adb/src/org/apache/axis2/rpc/receivers/ejb/EJB3Util.java   (with props)

Added: axis/axis2/java/core/trunk/modules/adb/src/org/apache/axis2/rpc/receivers/ejb/EJB3InOnlyMessageReceiver.java
URL: http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/adb/src/org/apache/axis2/rpc/receivers/ejb/EJB3InOnlyMessageReceiver.java?rev=1231015&view=auto
==============================================================================
--- axis/axis2/java/core/trunk/modules/adb/src/org/apache/axis2/rpc/receivers/ejb/EJB3InOnlyMessageReceiver.java (added)
+++ axis/axis2/java/core/trunk/modules/adb/src/org/apache/axis2/rpc/receivers/ejb/EJB3InOnlyMessageReceiver.java Fri Jan 13 11:41:11 2012
@@ -0,0 +1,31 @@
+/*
+ * 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.rpc.receivers.ejb;
+
+import org.apache.axis2.AxisFault;
+import org.apache.axis2.context.MessageContext;
+import org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver;
+
+public class EJB3InOnlyMessageReceiver extends RPCInOnlyMessageReceiver {
+
+    protected Object makeNewServiceObject(MessageContext msgContext) throws AxisFault {
+        return EJB3Util.makeNewServiceObject(msgContext);
+    }
+}

Propchange: axis/axis2/java/core/trunk/modules/adb/src/org/apache/axis2/rpc/receivers/ejb/EJB3InOnlyMessageReceiver.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: axis/axis2/java/core/trunk/modules/adb/src/org/apache/axis2/rpc/receivers/ejb/EJB3MessageReceiver.java
URL: http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/adb/src/org/apache/axis2/rpc/receivers/ejb/EJB3MessageReceiver.java?rev=1231015&view=auto
==============================================================================
--- axis/axis2/java/core/trunk/modules/adb/src/org/apache/axis2/rpc/receivers/ejb/EJB3MessageReceiver.java (added)
+++ axis/axis2/java/core/trunk/modules/adb/src/org/apache/axis2/rpc/receivers/ejb/EJB3MessageReceiver.java Fri Jan 13 11:41:11 2012
@@ -0,0 +1,31 @@
+/*
+ * 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.rpc.receivers.ejb;
+
+import org.apache.axis2.AxisFault;
+import org.apache.axis2.context.MessageContext;
+import org.apache.axis2.rpc.receivers.RPCMessageReceiver;
+
+public class EJB3MessageReceiver extends RPCMessageReceiver {
+
+    protected Object makeNewServiceObject(MessageContext msgContext) throws AxisFault {
+        return EJB3Util.makeNewServiceObject(msgContext);
+    }
+}

Propchange: axis/axis2/java/core/trunk/modules/adb/src/org/apache/axis2/rpc/receivers/ejb/EJB3MessageReceiver.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: axis/axis2/java/core/trunk/modules/adb/src/org/apache/axis2/rpc/receivers/ejb/EJB3Util.java
URL: http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/adb/src/org/apache/axis2/rpc/receivers/ejb/EJB3Util.java?rev=1231015&view=auto
==============================================================================
--- axis/axis2/java/core/trunk/modules/adb/src/org/apache/axis2/rpc/receivers/ejb/EJB3Util.java (added)
+++ axis/axis2/java/core/trunk/modules/adb/src/org/apache/axis2/rpc/receivers/ejb/EJB3Util.java Fri Jan 13 11:41:11 2012
@@ -0,0 +1,310 @@
+/*
+ * 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.rpc.receivers.ejb;
+
+import org.apache.axis2.AxisFault;
+import org.apache.axis2.context.MessageContext;
+import org.apache.axis2.description.AxisService;
+import org.apache.axis2.description.Parameter;
+import org.apache.axis2.util.threadpool.DefaultThreadFactory;
+
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.util.Properties;
+import java.util.concurrent.*;
+
+public class EJB3Util {
+    public static final String EJB_JNDI_NAME = "beanJndiName";
+    public static final String EJB_REMOTE_INTERFACE_NAME = "remoteInterfaceName";
+    public static final String EJB_LOCAL_INTERFACE_NAME = "localInterfaceName";
+    public static final String EJB_INITIAL_CONTEXT_FACTORY = "jndiContextClass";
+    public static final String EJB_PROVIDER_URL = "providerUrl";
+    public static final String EJB_JNDI_USERNAME = "jndiUser";
+    public static final String EJB_JNDI_PASSWORD = "jndiPassword";
+
+    private static ExecutorService workerPool = null;
+
+    static {
+        workerPool = new ThreadPoolExecutor(1, 50, 150L, TimeUnit.SECONDS,
+                new LinkedBlockingQueue<Runnable>(), new DefaultThreadFactory(new ThreadGroup(
+                        "EJB provider thread group"), "EJBProvider"));
+    }
+
+    /**
+     * Return a object which implements the service.
+     * 
+     * @param msgContext
+     *            the message context
+     * @return an object that implements the service
+     * @throws org.apache.axis2.AxisFault
+     *             if fails
+     */
+    protected static Object makeNewServiceObject(MessageContext msgContext) throws AxisFault {
+        CountDownLatch startLatch = new CountDownLatch(1);
+        CountDownLatch stopLatch = new CountDownLatch(1);
+        EJBClientWorker worker = new EJBClientWorker(msgContext, startLatch, stopLatch);
+        workerPool.execute(worker);
+        startLatch.countDown();
+        try {
+            stopLatch.await();
+        } catch (InterruptedException e) {
+            throw AxisFault.makeFault(e);
+        }
+
+        if (worker.getException() != null) {
+            throw AxisFault.makeFault(worker.getException());
+        }
+
+        return worker.getReturnedValue();
+    }
+
+    private static class EJBClientWorker implements Runnable {
+
+        private MessageContext msgContext = null;
+
+        private CountDownLatch startLatch = null;
+        private CountDownLatch stopLatch = null;
+        // protected static final Class[] empty_class_array = new Class[0];
+        // protected static final Object[] empty_object_array = new Object[0];
+        private static InitialContext cached_context = null;
+        private Exception exception = null;
+        private Object returnedValue = null;
+
+        public EJBClientWorker(MessageContext msgContext, CountDownLatch startLatch,
+                CountDownLatch stopLatch) {
+            this.msgContext = msgContext;
+            this.startLatch = startLatch;
+            this.stopLatch = stopLatch;
+        }
+
+        public void run() {
+            try {
+                startLatch.await();
+                final AxisService service = msgContext.getAxisService();
+                AccessController.doPrivileged(new PrivilegedAction() {
+                    public Object run() {
+                        Thread.currentThread().setContextClassLoader(service.getClassLoader());
+                        return null;
+                    }
+                });
+                Parameter remoteName = service.getParameter(EJB_REMOTE_INTERFACE_NAME);
+                Parameter localName = service.getParameter(EJB_LOCAL_INTERFACE_NAME);
+                Parameter jndiName = service.getParameter(EJB_JNDI_NAME);
+                Parameter interfaceName = (remoteName != null ? remoteName : localName);
+
+                if (jndiName == null || jndiName.getValue() == null) {
+                    throw new AxisFault("jndi name is not specified");
+                } else if (interfaceName == null || interfaceName.getValue() == null) {
+                    // cannot find both ejb remote and local interfaces
+                    // todo - in ejb 3.1 this is also not required!
+                    throw new AxisFault("ejb remote/local home class name is not specified");
+                }
+
+                // we create either the ejb using either the RemoteHome or
+                // LocalHome object
+                if (remoteName != null) {
+                    returnedValue = createRemoteEJB(msgContext,
+                            ((String) jndiName.getValue()).trim(),
+                            ((String) interfaceName.getValue()).trim());
+                } else {
+                    returnedValue = createLocalEJB(msgContext,
+                            ((String) jndiName.getValue()).trim(),
+                            ((String) interfaceName.getValue()).trim());
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+                exception = e;
+            } finally {
+                stopLatch.countDown();
+            }
+        }
+
+        /**
+         * Create an EJB using a ejb remote object
+         * 
+         * @param msgContext
+         *            the message context
+         * @param beanJndiName
+         *            The JNDI name of the EJB remote class
+         * @param interfaceName
+         *            the name of the interface class
+         * @return an EJB
+         * @throws Exception
+         *             If fails
+         */
+        private Object createRemoteEJB(MessageContext msgContext, String beanJndiName,
+                String interfaceName) throws Exception {
+            Class cls = getContextClassLoader().loadClass(interfaceName);
+            // Get the EJB Remote object from JNDI
+            Object ejbRemote = getEJBInterface(msgContext.getAxisService(), beanJndiName);
+            return cls.cast(ejbRemote);
+        }
+
+        /**
+         * Create an EJB using a local home object
+         * 
+         * @param msgContext
+         *            the message context
+         * @param beanJndiName
+         *            The JNDI name of the EJB local interface class
+         * @param interfaceName
+         *            the name of the local interface class
+         * @return an EJB
+         * @throws Exception
+         *             if fails
+         */
+        private Object createLocalEJB(MessageContext msgContext, String beanJndiName,
+                String interfaceName) throws Exception {
+            Class cls = getContextClassLoader().loadClass(interfaceName);
+            // Get the EJB local interface object from JNDI
+            Object ejbLocal = getEJBInterface(msgContext.getAxisService(), beanJndiName);
+            return cls.cast(ejbLocal);
+        }
+
+        /**
+         * Common routine to do the JNDI lookup on the remote/local interface
+         * object username and password for jndi lookup are got from the
+         * configuration or from the messageContext if not found in the
+         * configuration
+         * 
+         * @param service
+         *            AxisService object
+         * @param beanJndiName
+         *            JNDI name of the EJB remote/local object
+         * @return EJB remote/local object
+         * @throws org.apache.axis2.AxisFault
+         *             If fails
+         */
+        private Object getEJBInterface(AxisService service, String beanJndiName) throws AxisFault {
+            Object ejbRemote = null;
+
+            // Set up an InitialContext and use it get the beanJndiName from
+            // JNDI
+            try {
+                Properties properties = null;
+
+                // collect all the properties we need to access JNDI:
+                // username, password, factoryclass, contextUrl
+
+                // username
+                Parameter username = service.getParameter(EJB_JNDI_USERNAME);
+                if (username != null) {
+                    if (properties == null)
+                        properties = new Properties();
+                    properties.setProperty(Context.SECURITY_PRINCIPAL,
+                            ((String) username.getValue()).trim());
+                }
+
+                // password
+                Parameter password = service.getParameter(EJB_JNDI_PASSWORD);
+                if (password != null) {
+                    if (properties == null)
+                        properties = new Properties();
+                    properties.setProperty(Context.SECURITY_CREDENTIALS,
+                            ((String) password.getValue()).trim());
+                }
+
+                // factory class
+                Parameter factoryClass = service.getParameter(EJB_INITIAL_CONTEXT_FACTORY);
+                if (factoryClass != null) {
+                    if (properties == null)
+                        properties = new Properties();
+                    properties.setProperty(Context.INITIAL_CONTEXT_FACTORY,
+                            ((String) factoryClass.getValue()).trim());
+                }
+
+                // contextUrl
+                Parameter contextUrl = service.getParameter(EJB_PROVIDER_URL);
+                if (contextUrl != null) {
+                    if (properties == null)
+                        properties = new Properties();
+                    properties.setProperty(Context.PROVIDER_URL,
+                            ((String) contextUrl.getValue()).trim());
+                }
+
+                // get context using these properties
+                InitialContext context = getContext(properties);
+
+                // if we didn't get a context, fail
+                if (context == null)
+                    throw new AxisFault("cannot create initial context");
+
+                try {
+                    ejbRemote = lookUpEJBInterface(context, beanJndiName);
+                } catch (Exception e) {
+                    ejbRemote = lookUpEJBInterface(context, beanJndiName); // Retry
+                                                                           // for
+                                                                           // the
+                                                                           // 2nd
+                                                                           // time
+                                                                           // to
+                                                                           // overcome
+                                                                           // issues
+                                                                           // related
+                                                                           // to
+                                                                           // cahing
+                }
+
+                if (ejbRemote == null)
+                    throw new AxisFault("cannot find jndi home");
+            } catch (Exception exception) {
+
+                throw AxisFault.makeFault(exception);
+            }
+
+            return ejbRemote;
+        }
+
+        private InitialContext getCachedContext() throws NamingException {
+            if (cached_context == null)
+                cached_context = new InitialContext();
+            return cached_context;
+        }
+
+        private InitialContext getContext(Properties properties) throws AxisFault, NamingException {
+            return ((properties == null) ? getCachedContext() : new InitialContext(properties));
+        }
+
+        private Object lookUpEJBInterface(InitialContext context, String beanJndiName)
+                throws AxisFault, NamingException {
+            return context.lookup(beanJndiName);
+        }
+
+        private ClassLoader getContextClassLoader() {
+            return (ClassLoader) AccessController.doPrivileged(new PrivilegedAction() {
+                public Object run() {
+                    return Thread.currentThread().getContextClassLoader();
+                }
+            });
+        }
+
+        public Exception getException() {
+            return exception;
+        }
+
+        public Object getReturnedValue() {
+            return returnedValue;
+        }
+
+    }
+}

Propchange: axis/axis2/java/core/trunk/modules/adb/src/org/apache/axis2/rpc/receivers/ejb/EJB3Util.java
------------------------------------------------------------------------------
    svn:eol-style = native