[jboss-cvs] JBossAS SVN: r77567 - in projects/ejb3/tags: jboss-ejb3-proxy-0.1.3 and 1 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Thu Aug 28 01:28:50 EDT 2008


Author: ALRubinger
Date: 2008-08-28 01:28:50 -0400 (Thu, 28 Aug 2008)
New Revision: 77567

Added:
   projects/ejb3/tags/jboss-ejb3-proxy-0.1.3/
   projects/ejb3/tags/jboss-ejb3-proxy-0.1.3/pom.xml
   projects/ejb3/tags/jboss-ejb3-proxy-0.1.3/src/main/java/org/jboss/ejb3/proxy/factory/session/SessionProxyFactoryBase.java
Removed:
   projects/ejb3/tags/jboss-ejb3-proxy-0.1.3/pom.xml
   projects/ejb3/tags/jboss-ejb3-proxy-0.1.3/src/main/java/org/jboss/ejb3/proxy/factory/session/SessionProxyFactoryBase.java
Log:
[maven-release-plugin]  copy for tag jboss-ejb3-proxy-0.1.3

Copied: projects/ejb3/tags/jboss-ejb3-proxy-0.1.3 (from rev 77556, projects/ejb3/trunk/proxy)

Deleted: projects/ejb3/tags/jboss-ejb3-proxy-0.1.3/pom.xml
===================================================================
--- projects/ejb3/trunk/proxy/pom.xml	2008-08-28 01:22:28 UTC (rev 77556)
+++ projects/ejb3/tags/jboss-ejb3-proxy-0.1.3/pom.xml	2008-08-28 05:28:50 UTC (rev 77567)
@@ -1,149 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
-  <!-- Parent -->
-  <parent>
-    <groupId>org.jboss.ejb3</groupId>
-    <artifactId>jboss-ejb3-build</artifactId>
-    <version>0.13.14</version>
-  </parent>
-
-  <!-- Model Version -->
-  <modelVersion>4.0.0</modelVersion>
-
-  <!-- Artifact Configuration -->
-  <groupId>org.jboss.ejb3</groupId>
-  <artifactId>jboss-ejb3-proxy</artifactId>
-  <version>0.1.3-SNAPSHOT</version>
-  <name>JBoss EJB 3.0 Proxy</name>
-  <description>JBoss EJB3 Proxy Component</description>
-  <url>http://www.jboss.org/jbossejb3</url>
-
-  <!-- Build Configuration -->
-  <build>
-
-    <plugins>
-
-      <!-- Build a CP File for use by MockServer -->     
-      <plugin>
-        <artifactId>maven-dependency-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>build-cp-file</id>
-            <phase>validate</phase>
-            <goals>
-              <goal>build-classpath</goal>
-            </goals>
-            <configuration>
-              <outputFile>target/cp.txt</outputFile>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-
-      <!-- Assembly Plugin (Proxy Client) -->
-      <plugin>
-        <artifactId>maven-assembly-plugin</artifactId>
-        <version>2.2-beta-1</version>
-        <executions>
-          <execution>
-            <id>make-assembly</id>
-            <phase>package</phase>
-            <goals>
-              <goal>attached</goal>
-            </goals>
-          </execution>
-        </executions>
-        <configuration>
-          <descriptors>
-            <descriptor>jboss-ejb3-proxy-client.xml</descriptor>
-          </descriptors>
-          <attach>true</attach>
-        </configuration>
-        <inherited>false</inherited>
-      </plugin>
-
-    </plugins>
-
-  </build>
-
-  <dependencyManagement>
-    <dependencies>
-      <!-- Because of a bug in m2eclipse the version of reflect must be explicitly defined 
-      <dependency>
-        <groupId>org.jboss</groupId>
-        <artifactId>jboss-reflect</artifactId>
-        <version>2.0.0.Beta12</version>
-      </dependency> -->
-    </dependencies>
-  </dependencyManagement>
-  
-  <!-- Dependencies -->
-  <dependencies>
-
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <scope>test</scope>
-    </dependency>
-    
-    <!-- JBoss Remoting Aspects -->
-    <dependency>
-      <groupId>org.jboss.aspects</groupId>
-      <artifactId>jboss-remoting-aspects</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>org.jboss.ejb3</groupId>
-      <artifactId>jboss-ejb3-common</artifactId>
-      <version>0.1.5</version>
-    </dependency>
-
-    <dependency>
-      <groupId>org.jboss.ejb3</groupId>
-      <artifactId>jboss-ejb3-interceptors</artifactId>
-      <version>0.13.3</version>
-    </dependency>
-    
-     <dependency>
-      <groupId>org.jboss.ejb3</groupId>
-      <artifactId>jboss-ejb3-test</artifactId>
-      <version>0.1.2</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.jboss.logging</groupId>
-      <artifactId>jboss-logging-spi</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>org.jboss.logging</groupId>
-      <artifactId>jboss-logging-log4j</artifactId>
-      <scope>test</scope>
-    </dependency>
-    
-    <dependency>
-      <groupId>org.jboss.metadata</groupId>
-      <artifactId>jboss-metadata</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>org.jboss.naming</groupId>
-      <artifactId>jnpserver</artifactId>
-      <scope>compile</scope>
-    </dependency>
-    
-    <!-- 
-     Needed by remoting, not declared as runtime dependency? 
-     
-     Remove if possible later
-    -->
-    <dependency>
-      <groupId>oswego-concurrent</groupId>
-      <artifactId>concurrent</artifactId>
-      <version>1.3.4-jboss-update1</version>
-      <scope>test</scope>
-    </dependency>        
-
-  </dependencies>
-</project>

Copied: projects/ejb3/tags/jboss-ejb3-proxy-0.1.3/pom.xml (from rev 77566, projects/ejb3/trunk/proxy/pom.xml)
===================================================================
--- projects/ejb3/tags/jboss-ejb3-proxy-0.1.3/pom.xml	                        (rev 0)
+++ projects/ejb3/tags/jboss-ejb3-proxy-0.1.3/pom.xml	2008-08-28 05:28:50 UTC (rev 77567)
@@ -0,0 +1,155 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+  <!-- Parent -->
+  <parent>
+    <groupId>org.jboss.ejb3</groupId>
+    <artifactId>jboss-ejb3-build</artifactId>
+    <version>0.13.14</version>
+  </parent>
+
+  <!-- Model Version -->
+  <modelVersion>4.0.0</modelVersion>
+
+  <!-- Artifact Configuration -->
+  <groupId>org.jboss.ejb3</groupId>
+  <artifactId>jboss-ejb3-proxy</artifactId>
+  <version>0.1.3</version>
+  <name>JBoss EJB 3.0 Proxy</name>
+  <description>JBoss EJB3 Proxy Component</description>
+  <url>http://www.jboss.org/jbossejb3</url>
+
+  <!-- Build Configuration -->
+  <build>
+
+    <plugins>
+
+      <!-- Build a CP File for use by MockServer -->     
+      <plugin>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>build-cp-file</id>
+            <phase>validate</phase>
+            <goals>
+              <goal>build-classpath</goal>
+            </goals>
+            <configuration>
+              <outputFile>target/cp.txt</outputFile>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+
+      <!-- Assembly Plugin (Proxy Client) -->
+      <plugin>
+        <artifactId>maven-assembly-plugin</artifactId>
+        <version>2.2-beta-1</version>
+        <executions>
+          <execution>
+            <id>make-assembly</id>
+            <phase>package</phase>
+            <goals>
+              <goal>attached</goal>
+            </goals>
+          </execution>
+        </executions>
+        <configuration>
+          <descriptors>
+            <descriptor>jboss-ejb3-proxy-client.xml</descriptor>
+          </descriptors>
+          <attach>true</attach>
+        </configuration>
+        <inherited>false</inherited>
+      </plugin>
+
+    </plugins>
+
+  </build>
+
+  <dependencyManagement>
+    <dependencies>
+      <!-- Because of a bug in m2eclipse the version of reflect must be explicitly defined 
+      <dependency>
+        <groupId>org.jboss</groupId>
+        <artifactId>jboss-reflect</artifactId>
+        <version>2.0.0.Beta12</version>
+      </dependency> -->
+    </dependencies>
+  </dependencyManagement>
+  
+  <!-- Dependencies -->
+  <dependencies>
+
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <scope>test</scope>
+    </dependency>
+    
+    <!-- JBoss Remoting Aspects -->
+    <dependency>
+      <groupId>org.jboss.aspects</groupId>
+      <artifactId>jboss-remoting-aspects</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>org.jboss.ejb3</groupId>
+      <artifactId>jboss-ejb3-common</artifactId>
+      <version>0.1.5</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.jboss.ejb3</groupId>
+      <artifactId>jboss-ejb3-interceptors</artifactId>
+      <version>0.13.3</version>
+    </dependency>
+    
+     <dependency>
+      <groupId>org.jboss.ejb3</groupId>
+      <artifactId>jboss-ejb3-test</artifactId>
+      <version>0.1.2</version>
+      <scope>test</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>org.jboss.logging</groupId>
+      <artifactId>jboss-logging-spi</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>org.jboss.logging</groupId>
+      <artifactId>jboss-logging-log4j</artifactId>
+      <scope>test</scope>
+    </dependency>
+    
+    <dependency>
+      <groupId>org.jboss.metadata</groupId>
+      <artifactId>jboss-metadata</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>org.jboss.naming</groupId>
+      <artifactId>jnpserver</artifactId>
+      <scope>compile</scope>
+    </dependency>
+    
+    <!-- 
+     Needed by remoting, not declared as runtime dependency? 
+     
+     Remove if possible later
+    -->
+    <dependency>
+      <groupId>oswego-concurrent</groupId>
+      <artifactId>concurrent</artifactId>
+      <version>1.3.4-jboss-update1</version>
+      <scope>test</scope>
+    </dependency>        
+
+  </dependencies>
+
+  <scm>
+    <connection>scm:svn:http://anonsvn.jboss.org/repos/jbossas/projects/ejb3/tags/jboss-ejb3-proxy-0.1.3</connection>
+    <developerConnection>scm:svn:https://svn.jboss.org/repos/jbossas/projects/ejb3/tags/jboss-ejb3-proxy-0.1.3</developerConnection>
+    <url>http://anonsvn.jboss.org/repos/jbossas/projects/ejb3/tags/jboss-ejb3-proxy-0.1.3</url>
+  </scm>
+</project>

Deleted: projects/ejb3/tags/jboss-ejb3-proxy-0.1.3/src/main/java/org/jboss/ejb3/proxy/factory/session/SessionProxyFactoryBase.java
===================================================================
--- projects/ejb3/trunk/proxy/src/main/java/org/jboss/ejb3/proxy/factory/session/SessionProxyFactoryBase.java	2008-08-28 01:22:28 UTC (rev 77556)
+++ projects/ejb3/tags/jboss-ejb3-proxy-0.1.3/src/main/java/org/jboss/ejb3/proxy/factory/session/SessionProxyFactoryBase.java	2008-08-28 05:28:50 UTC (rev 77567)
@@ -1,727 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2008, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
-  *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.jboss.ejb3.proxy.factory.session;
-
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import javax.ejb.EJBHome;
-import javax.ejb.EJBLocalHome;
-
-import org.jboss.aop.Advisor;
-import org.jboss.ejb3.common.lang.ClassHelper;
-import org.jboss.ejb3.common.string.StringUtils;
-import org.jboss.ejb3.proxy.factory.ProxyFactoryBase;
-import org.jboss.ejb3.proxy.handler.session.SessionProxyInvocationHandler;
-import org.jboss.ejb3.proxy.intf.SessionProxy;
-import org.jboss.logging.Logger;
-import org.jboss.metadata.ejb.jboss.JBossSessionBeanMetaData;
-
-/**
- * SessionProxyFactoryBase
- * 
- * Base upon which Session Proxy Factory implementations
- * may build
- *
- * @author <a href="mailto:andrew.rubinger at jboss.org">ALR</a>
- * @version $Revision: $
- */
-public abstract class SessionProxyFactoryBase extends ProxyFactoryBase implements SessionProxyFactory
-{
-
-   // --------------------------------------------------------------------------------||
-   // Class Members ------------------------------------------------------------------||
-   // --------------------------------------------------------------------------------||
-
-   private static final Logger log = Logger.getLogger(SessionProxyFactoryBase.class);
-
-   // --------------------------------------------------------------------------------||
-   // Instance Members ---------------------------------------------------------------||
-   // --------------------------------------------------------------------------------||
-
-   private JBossSessionBeanMetaData metadata;
-
-   /**
-    * Constructor for the default Proxy Constructor (All
-    * business interfaces and, if bound together, the EJB2.x Home)
-    */
-   private Constructor<?> constructorProxyDefault;
-
-   /**
-    * Map of Proxy Constructors, one per business interface, with key 
-    * as the fully-qualified class name of the interface, and value
-    * of the constructor to use
-    */
-   private Map<String, Constructor<?>> constructorsProxySpecificBusinessInterface;
-
-   /**
-    * Constructor for the EJB2.x Home Proxy
-    */
-   private Constructor<?> constructorProxyHome;
-
-   /**
-    * Constructor for the EJB2.x View Proxy
-    */
-   private Constructor<?> constructorProxyEjb2x;
-
-   // --------------------------------------------------------------------------------||
-   // Constructor --------------------------------------------------------------------||
-   // --------------------------------------------------------------------------------||
-
-   /**
-    * Constructor
-    * 
-    * @param name The unique name for this ProxyFactory
-    * @param containerName The name of the InvokableContext (container)
-    *   upon which Proxies will invoke
-    * @param containerGuid The globally-unique name of the container
-    * @param metadata The metadata representing this Session Bean
-    * @param classloader The ClassLoader associated with the Container's Bean Class
-    *       for which this ProxyFactory is to generate Proxies
-    * @param advisor The Advisor for proxies created by this factory
-    */
-   public SessionProxyFactoryBase(final String name, final String containerName, final String containerGuid,
-         final JBossSessionBeanMetaData metadata, final ClassLoader classloader, final Advisor advisor)
-   {
-      // Call Super
-      super(name, containerName, containerGuid, classloader, advisor);
-
-      // Set Metadata
-      this.setMetadata(metadata);
-
-      // Instanciate backing Map for interface-specific business proxies
-      this.setConstructorsProxySpecificBusinessInterface(new HashMap<String, Constructor<?>>());
-   }
-
-   // --------------------------------------------------------------------------------||
-   // Functional Methods -------------------------------------------------------------||
-   // --------------------------------------------------------------------------------||
-
-   /**
-    * Create an EJB2.x Home Proxy
-    * 
-    * @return
-    */
-   public Object createProxyHome()
-   {
-      // Create a new InvocationHandler
-      SessionProxyInvocationHandler handler = this.createHomeInvocationHandler();
-
-      try
-      {
-         // Create a new Proxy instance, and return
-         return this.getConstructorProxyHome().newInstance(handler);
-      }
-      catch (Throwable t)
-      {
-         // Throw a descriptive error message along with the originating Throwable 
-         throw new RuntimeException("Could not create Home Proxy for " + this.getMetadata().getEjbName(), t);
-      }
-   }
-
-   /**
-    * Create an EJB3 Business proxy with no 
-    * specific target business interface.  The 
-    * returned proxy will implement all appropriate
-    * business interfaces.  Additionally, if
-    * the Home interface is bound alongside 
-    * the Default (same JNDI Name), this 
-    * Proxy will implement the Home interface as well.
-    * 
-    * @return
-    */
-   public Object createProxyDefault()
-   {
-      // Obtain Constructor to Default Proxy
-      Constructor<?> constructor = this.getConstructorProxyDefault();
-      assert constructor != null : "Constructor for Default Proxy was null; perhaps the "
-            + SessionProxyFactory.class.getSimpleName() + " was not properly started?";
-
-      // Create a new InvocationHandler
-      SessionProxyInvocationHandler handler = this.createBusinessDefaultInvocationHandler();
-
-      try
-      {
-         // Create a new Proxy instance, and return
-         return constructor.newInstance(handler);
-      }
-      catch (Throwable t)
-      {
-         // Throw a descriptive error message along with the originating Throwable 
-         throw new RuntimeException("Could not create the Default Proxy for " + this.getMetadata().getEjbName(), t);
-      }
-   }
-
-   /**
-    * Create an EJB3 Business Proxy specific to the specified
-    * target business interface name (expressed as 
-    * a fully-qualified class name)
-    * 
-    * @param businessInterfaceName
-    * @return
-    */
-   public Object createProxyBusiness(final String businessInterfaceName)
-   {
-      // Ensure businessInterfaceName is specified
-      assert businessInterfaceName != null && businessInterfaceName.trim().length() > 0 : "Required business interface type name was not specified";
-
-      try
-      {
-
-         // Obtain the correct business proxy constructor
-         Constructor<?> constructor = this.getConstructorsProxySpecificBusinessInterface().get(
-               businessInterfaceName.trim());
-
-         /*
-          * In place for web injection (isolated CL)
-          */
-         ClassLoader tcl = Thread.currentThread().getContextClassLoader();
-         try
-         {
-            // See if we can get at the bean class from the TCL
-            Class<?> businessInterfaceClass = Class.forName(businessInterfaceName, false, tcl);
-            
-            // Load the Bean Class from the Container's CL
-            Class<?> ourBusinessInterfaceClass = Class.forName(businessInterfaceName, false, this.getClassLoader());
-
-            // If the classes aren't equal, the injection target won't be assignable
-            if (!businessInterfaceClass.equals(ourBusinessInterfaceClass))
-            {
-               // So use the TCL to generate the Proxy class, not the Container CL
-               Set<Class<?>> businessInterfaces = new HashSet<Class<?>>();
-               businessInterfaces.add(businessInterfaceClass);
-               constructor = this.createProxyConstructor(businessInterfaces, tcl);
-            }
-
-         }
-         catch(LinkageError le)
-         {
-            // Ignore
-         }
-         catch (ClassNotFoundException cce)
-         {
-            // Ignore
-         }
-
-         // Ensure the constructor was found
-         assert constructor != null : "No business proxy constructor for \"" + businessInterfaceName
-               + "\" was found; not created at start() properly?  Bad value bound as RefAddr in JNDI?";
-
-         // Create a new InvocationHandler
-         SessionProxyInvocationHandler handler = this
-               .createBusinessInterfaceSpecificInvocationHandler(businessInterfaceName);
-
-         // Create a new Proxy instance, and return
-         return constructor.newInstance(handler);
-      }
-      catch (Throwable t)
-      {
-         // Throw a descriptive error message along with the originating Throwable 
-         throw new RuntimeException("Could not create the EJB3 Business Proxy implementing \"" + businessInterfaceName
-               + "\" for " + this.getMetadata().getEjbName(), t);
-      }
-   }
-
-   /**
-    * Create an EJB2.x Proxy 
-    * 
-    * @return
-    */
-   public Object createProxyEjb2x()
-   {
-      // Create a new InvocationHandler
-      SessionProxyInvocationHandler handler = this.createEjb2xComponentInterfaceInvocationHandler();
-
-      try
-      {
-         // Create a new Proxy instance, and return
-         return this.getConstructorProxyEjb2x().newInstance(handler);
-      }
-      catch (Throwable t)
-      {
-         // Throw a descriptive error message along with the originating Throwable 
-         throw new RuntimeException("Could not create the EJB2.x Proxy for " + this.getMetadata().getEjbName(), t);
-      }
-   }
-
-   // --------------------------------------------------------------------------------||
-   // Lifecycle Methods --------------------------------------------------------------||
-   // --------------------------------------------------------------------------------||
-
-   /**
-    * Lifecycle callback to be invoked 
-    * before the ProxyFactory is able to service requests
-    * 
-    *  @throws Exception
-    */
-   @Override
-   public void start() throws Exception
-   {
-      // Call Super
-      super.start();
-
-      /*
-       * TODO:
-       * 
-       * Yet another method that should be broken apart
-       * and analyzed for re-use.
-       */
-
-      /*
-       * Make Proxies for EJB3 Business Interfaces
-       */
-
-      // Obtain Business Interface Types
-      Set<String> businessInterfaceTypes = this.getBusinessInterfaceTypes();
-
-      // Initialize
-      Set<Class<?>> businessInterfaceClasses = new HashSet<Class<?>>();
-
-      // Determine if business interfaces are defined
-      boolean hasBusinessInterfaces = businessInterfaceTypes != null && businessInterfaceTypes.size() > 0;
-
-      // If there are business interfaces
-      if (hasBusinessInterfaces)
-      {
-         // For all business interface types
-         for (String businessInterfaceType : businessInterfaceTypes)
-         {
-            Class<?> businessInterface = null;
-            try
-            {
-               // Load
-               businessInterface = this.getClassLoader().loadClass(businessInterfaceType);
-            }
-            catch (ClassNotFoundException cnfe)
-            {
-               throw new RuntimeException("Could not find specified Session Bean Business Interface \""
-                     + businessInterfaceType + "\" in " + ClassLoader.class.getSimpleName() + " for EJB "
-                     + this.getMetadata().getEjbName(), cnfe);
-            }
-
-            // Add business interface to classes
-            businessInterfaceClasses.add(businessInterface);
-
-            // Make Proxy specific to the business interface
-            Set<Class<?>> businessInterfaces = new HashSet<Class<?>>();
-            businessInterfaces.add(businessInterface);
-            Constructor<?> businessInterfaceConstructor = this.createProxyConstructor(businessInterfaces, this
-                  .getClassLoader());
-            log.debug("Created Session Bean Business Interface-Specific Proxy Constructor implementing \""
-                  + businessInterfaceType + "\"");
-
-            // Set
-            this.getConstructorsProxySpecificBusinessInterface().put(businessInterfaceType,
-                  businessInterfaceConstructor);
-
-         }
-      }
-
-      /*
-       * Make Constructor for Home
-       */
-
-      // Obtain Home Interface Type
-      String homeInterfaceType = this.getHomeType();
-
-      // Determine if Home is defined
-      boolean hasHomeInterface = homeInterfaceType != null && !homeInterfaceType.equals("");
-
-      // Ensure Home ad/or Business is defined
-      if (!hasHomeInterface && !hasBusinessInterfaces)
-      {
-         // Throw bean provider descriptive error
-         throw new RuntimeException("Cannot deploy EJB " + this.getMetadata().getEjbName()
-               + " as it has no EJB3 (Business Interface) or EJB2.x (Home Interface) Views Defined.");
-      }
-
-      // Initialize Home Interface Class
-      Class<?> homeInterfaceClass = null;
-
-      // If Home is defined
-      if (hasHomeInterface)
-      {
-         try
-         {
-            // Load the Home class
-            homeInterfaceClass = this.getClassLoader().loadClass(homeInterfaceType);
-         }
-         catch (ClassNotFoundException cnfe)
-         {
-            throw new RuntimeException("Could not find specified Session Bean Home Interface \"" + homeInterfaceType
-                  + "\" in " + ClassLoader.class.getSimpleName() + " for EJB " + this.getMetadata().getEjbName(), cnfe);
-         }
-
-         // Make the Home Proxy Constructor
-         Set<Class<?>> homeInterfaces = new HashSet<Class<?>>();
-         homeInterfaces.add(homeInterfaceClass);
-         Constructor<?> homeConstructor = this.createProxyConstructor(homeInterfaces, this.getClassLoader());
-         log.debug("Created Session Bean Home Proxy Constructor implementing \"" + homeInterfaceType + "\"");
-
-         // Set the Home Proxy Constructor
-         this.setConstructorProxyHome(homeConstructor);
-      }
-
-      /*
-       * Make Default Proxy
-       */
-
-      // Create a Set to hold all relevant interfaces
-      Set<Class<?>> defaultProxyInterfaces = new HashSet<Class<?>>();
-
-      // Add all business interfaces
-      if (hasBusinessInterfaces)
-      {
-         defaultProxyInterfaces.addAll(businessInterfaceClasses);
-      }
-
-      // If there's a home defined and its bound to the same binding as the default
-      if (hasHomeInterface && this.getMetadata().getJndiName().equals(this.getMetadata().getHomeJndiName()))
-      {
-         defaultProxyInterfaces.add(homeInterfaceClass);
-      }
-
-      // Make the Default Business Interfaces Proxy Constructor
-      Constructor<?> businessInterfacesConstructor = this.createProxyConstructor(defaultProxyInterfaces, this
-            .getClassLoader());
-      log.debug("Created Session Bean Default EJB3 Business Proxy Constructor implementing " + defaultProxyInterfaces);
-
-      // Set
-      this.setConstructorProxyDefault(businessInterfacesConstructor);
-
-      /*
-       * Make Constructor for EJB2.x Views
-       */
-
-      // EJB2.x Views may exist only if there is a Home
-      if (hasHomeInterface)
-      {
-         // Initialize Set of EJB2.x Interfaces 
-         Set<Class<?>> ejb2xInterfaces = new HashSet<Class<?>>();
-
-         // Get return types of create methods (EJB3 Core Specification 3.6.2.1)
-         //TODO Should be handled by metadata, see @Deprecated on the method below
-         Set<Class<?>> homeReturnTypes = this.getReturnTypesFromCreateMethods(homeInterfaceClass);
-         if (homeReturnTypes != null)
-         {
-            ejb2xInterfaces.addAll(homeReturnTypes);
-
-         }
-
-         // Get explicitly-defined EJB2x interface type
-         String ejb2xDeclaredType = StringUtils.adjustWhitespaceStringToNull(this.getEjb2xInterfaceType());
-
-         // If there is an explicitly-defined EJB2.x interface
-         if (ejb2xDeclaredType != null)
-         {
-            Class<?> ejb2xInterface = null;
-            try
-            {
-               // Load
-               ejb2xInterface = this.getClassLoader().loadClass(ejb2xDeclaredType);
-            }
-            catch (ClassNotFoundException cnfe)
-            {
-               throw new RuntimeException("Could not find specified Session Bean EJB2.x Interface \""
-                     + ejb2xDeclaredType + "\" in " + ClassLoader.class.getSimpleName() + " for EJB "
-                     + this.getMetadata().getEjbName(), cnfe);
-            }
-
-            // Add
-            ejb2xInterfaces.add(ejb2xInterface);
-         }
-
-         // Make the EJB2.x Proxy Constructor
-         Constructor<?> ejb2xConstructor = this.createProxyConstructor(ejb2xInterfaces, this.getClassLoader());
-         log.debug("Created Session Bean EJB2x Proxy Constructor implementing " + ejb2xInterfaces);
-
-         // Set the EJB2.x Proxy Constructor
-         this.setConstructorProxyEjb2x(ejb2xConstructor);
-      }
-
-   }
-
-   /**
-    * Lifecycle callback to be invoked by the ProxyFactoryDeployer
-    * before the ProxyFactory is taken out of service, 
-    * possibly GC'd
-    * 
-    * @throws Exception
-    */
-   @Override
-   public void stop() throws Exception
-   {
-      super.stop();
-      //TODO
-   }
-
-   /**
-    * Returns Proxy interfaces common to all Proxies generated
-    * by this ProxyFactory
-    * 
-    * @return
-    */
-   @Override
-   protected Set<Class<?>> getCommonProxyInterfaces()
-   {
-      // Initialize
-      Set<Class<?>> interfaces = super.getCommonProxyInterfaces();
-
-      // Add
-      interfaces.add(SessionProxy.class);
-
-      // Return
-      return interfaces;
-   }
-
-   // --------------------------------------------------------------------------------||
-   // Functional Methods -------------------------------------------------------------||
-   // --------------------------------------------------------------------------------||
-
-   /**
-    * Obtains the return types declared by the "create" methods for the specified home interface.
-    * 
-    * EJB3 Core Specification 3.6.2.1
-    * JIRA: EJBTHREE-1127
-    *  
-    * @param homeInterface
-    * @param isStateless Flag to indicate whether this is for a Stateful or Stateless container
-    * @return
-    * @deprecated http://jira.jboss.com/jira/browse/JBMETA-41
-    */
-   @Deprecated
-   protected Set<Class<?>> getReturnTypesFromCreateMethods(Class<?> homeInterface, boolean isStateless)
-   {
-      /*
-       * TODO
-       * 
-       * Kill the "isStateless" argument, centralize logic as appropriate, 
-       * and use polymorphsm to properly implement this method.
-       * 
-       * The current structure with the "isStateless" was born out of
-       * this function originating as a static utility from EJB3 Core.
-       * 
-       * Note: Perhaps this is a moot point, given the @Deprecated tag 
-       * and that jboss-metadata should be implementing this.
-       */
-
-      // Ensure we've been passed a Home or LocalHome interface (Developers only)
-      assert (EJBHome.class.isAssignableFrom(homeInterface) || EJBLocalHome.class.isAssignableFrom(homeInterface));
-
-      // Ensure we've been passed a Home or LocalHome interface (End-User)
-      if (!EJBHome.class.isAssignableFrom(homeInterface) && !EJBLocalHome.class.isAssignableFrom(homeInterface))
-      {
-         throw new RuntimeException("Declared EJB 2.1 Home Interface " + homeInterface.getName() + " does not extend "
-               + EJBHome.class.getName() + " or " + EJBLocalHome.class.getName()
-               + " as required by EJB 3.0 Core Specification 4.6.8 and 4.6.10");
-      }
-
-      // Initialize
-      Set<Class<?>> types = new HashSet<Class<?>>();
-      List<Method> createMethods = null;
-
-      // If for a Stateless Container
-      if (isStateless)
-      {
-         // Initialize error message
-         String specViolationErrorMessage = "EJB 3.0 Specification Violation (4.6.8 Bullet 4, 4.6.10 Bullet 4): \""
-               + "A stateless session bean must define exactly one create method with no arguments." + "\"; found in "
-               + homeInterface.getName();
-
-         // Get all methods with signature "create"
-         createMethods = new ArrayList<Method>();
-         try
-         {
-            createMethods.add(homeInterface.getMethod("create", new Class<?>[]
-            {}));
-         }
-         // EJB 3.0 Specification 4.6.8 Bullet 4 Violation
-         // EJBTHREE-1156
-         catch (NoSuchMethodException e)
-         {
-            throw new RuntimeException(specViolationErrorMessage);
-         }
-
-         // Ensure only one create method is defined
-         // EJB 3.0 Specification 4.6.8 Bullet 4 Violation
-         // EJBTHREE-1156
-         if (createMethods.size() > 1)
-         {
-            throw new RuntimeException(specViolationErrorMessage);
-         }
-      }
-      else
-      {
-         // Obtain all "create<METHOD>" methods
-         createMethods = ClassHelper.getAllMethodsByPrefix(homeInterface, "create");
-      }
-      if (createMethods.size() == 0)
-      {
-         throw new RuntimeException("EJB 3.0 Core Specification Violation (4.6.8 Bullet 5): EJB2.1 Home Interface "
-               + homeInterface + " does not declare a \'create<METHOD>\' method");
-      }
-
-      // Add all return types
-      for (Method method : createMethods)
-      {
-         types.add(method.getReturnType());
-      }
-
-      // Return
-      return types;
-   }
-
-   // --------------------------------------------------------------------------------||
-   // Contracts ----------------------------------------------------------------------||
-   // --------------------------------------------------------------------------------||
-
-   /**
-    * Returns the a Set of String representations of the Business Interface Types
-    * 
-    *  @return
-    */
-   protected abstract Set<String> getBusinessInterfaceTypes();
-
-   /**
-    * Returns the String representation of the Home Interface Type
-    * @return
-    */
-   protected abstract String getHomeType();
-
-   /**
-    * Returns the String representation of the EJB2.x Interface Types
-    * 
-    *  @return
-    */
-   protected abstract String getEjb2xInterfaceType();
-
-   /**
-    * Obtains the return types declared by the "create" methods for the specified home interface.
-    *  
-    * @param homeInterface
-    * @return
-    */
-   protected abstract Set<Class<?>> getReturnTypesFromCreateMethods(Class<?> homeInterface);
-
-   /**
-    * Returns the Constructor of the SessionProxyInvocationHandler to be used in 
-    * instanciating new handlers to specify in Proxy Creation
-    * 
-    * Used for creating a Handler for a Business Interface-specific proxy
-    * 
-    * @return
-    */
-   protected abstract SessionProxyInvocationHandler createBusinessInterfaceSpecificInvocationHandler(
-         String businessInterfaceName);
-
-   /**
-    * Returns the Constructor of the SessionProxyInvocationHandler to be used in 
-    * instanciating new handlers to specify in Proxy Creation
-    * 
-    * Used for creating a Handler for a Business Default proxy
-    * 
-    * @return
-    */
-   protected abstract SessionProxyInvocationHandler createBusinessDefaultInvocationHandler();
-
-   /**
-    * Returns the Constructor of the SessionProxyInvocationHandler to be used in 
-    * instanciating new handlers to specify in Proxy Creation
-    * 
-    * Used for creating a Handler for an EJB2.x Component Interface proxy
-    * 
-    * @return
-    */
-   protected abstract SessionProxyInvocationHandler createEjb2xComponentInterfaceInvocationHandler();
-
-   /**
-    * Returns the Constructor of the SessionProxyInvocationHandler to be used in 
-    * instanciating new handlers to specify in Proxy Creation
-    * 
-    * Used for creating a Handler for am EJB2.x Home proxy
-    * 
-    * @return
-    */
-   protected abstract SessionProxyInvocationHandler createHomeInvocationHandler();
-
-   // --------------------------------------------------------------------------------||
-   // Accessors / Mutators -----------------------------------------------------------||
-   // --------------------------------------------------------------------------------||
-
-   public JBossSessionBeanMetaData getMetadata()
-   {
-      return metadata;
-   }
-
-   protected void setMetadata(final JBossSessionBeanMetaData metadata)
-   {
-      this.metadata = metadata;
-   }
-
-   protected Constructor<?> getConstructorProxyDefault()
-   {
-      return constructorProxyDefault;
-   }
-
-   protected void setConstructorProxyDefault(Constructor<?> constructorProxyDefault)
-   {
-      this.constructorProxyDefault = constructorProxyDefault;
-   }
-
-   protected Map<String, Constructor<?>> getConstructorsProxySpecificBusinessInterface()
-   {
-      return constructorsProxySpecificBusinessInterface;
-   }
-
-   protected void setConstructorsProxySpecificBusinessInterface(
-         Map<String, Constructor<?>> constructorsProxySpecificBusinessInterface)
-   {
-      this.constructorsProxySpecificBusinessInterface = constructorsProxySpecificBusinessInterface;
-   }
-
-   protected Constructor<?> getConstructorProxyHome()
-   {
-      return constructorProxyHome;
-   }
-
-   protected void setConstructorProxyHome(Constructor<?> constructorProxyHome)
-   {
-      this.constructorProxyHome = constructorProxyHome;
-   }
-
-   protected Constructor<?> getConstructorProxyEjb2x()
-   {
-      return constructorProxyEjb2x;
-   }
-
-   protected void setConstructorProxyEjb2x(Constructor<?> constructorProxyEjb2x)
-   {
-      this.constructorProxyEjb2x = constructorProxyEjb2x;
-   }
-
-}

Copied: projects/ejb3/tags/jboss-ejb3-proxy-0.1.3/src/main/java/org/jboss/ejb3/proxy/factory/session/SessionProxyFactoryBase.java (from rev 77560, projects/ejb3/trunk/proxy/src/main/java/org/jboss/ejb3/proxy/factory/session/SessionProxyFactoryBase.java)
===================================================================
--- projects/ejb3/tags/jboss-ejb3-proxy-0.1.3/src/main/java/org/jboss/ejb3/proxy/factory/session/SessionProxyFactoryBase.java	                        (rev 0)
+++ projects/ejb3/tags/jboss-ejb3-proxy-0.1.3/src/main/java/org/jboss/ejb3/proxy/factory/session/SessionProxyFactoryBase.java	2008-08-28 05:28:50 UTC (rev 77567)
@@ -0,0 +1,720 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+  *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.ejb3.proxy.factory.session;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.ejb.EJBHome;
+import javax.ejb.EJBLocalHome;
+
+import org.jboss.aop.Advisor;
+import org.jboss.ejb3.common.lang.ClassHelper;
+import org.jboss.ejb3.common.string.StringUtils;
+import org.jboss.ejb3.proxy.factory.ProxyFactoryBase;
+import org.jboss.ejb3.proxy.handler.session.SessionProxyInvocationHandler;
+import org.jboss.ejb3.proxy.intf.SessionProxy;
+import org.jboss.logging.Logger;
+import org.jboss.metadata.ejb.jboss.JBossSessionBeanMetaData;
+
+/**
+ * SessionProxyFactoryBase
+ * 
+ * Base upon which Session Proxy Factory implementations
+ * may build
+ *
+ * @author <a href="mailto:andrew.rubinger at jboss.org">ALR</a>
+ * @version $Revision: $
+ */
+public abstract class SessionProxyFactoryBase extends ProxyFactoryBase implements SessionProxyFactory
+{
+
+   // --------------------------------------------------------------------------------||
+   // Class Members ------------------------------------------------------------------||
+   // --------------------------------------------------------------------------------||
+
+   private static final Logger log = Logger.getLogger(SessionProxyFactoryBase.class);
+
+   // --------------------------------------------------------------------------------||
+   // Instance Members ---------------------------------------------------------------||
+   // --------------------------------------------------------------------------------||
+
+   private JBossSessionBeanMetaData metadata;
+
+   /**
+    * Constructor for the default Proxy Constructor (All
+    * business interfaces and, if bound together, the EJB2.x Home)
+    */
+   private Constructor<?> constructorProxyDefault;
+
+   /**
+    * Map of Proxy Constructors, one per business interface, with key 
+    * as the fully-qualified class name of the interface, and value
+    * of the constructor to use
+    */
+   private Map<String, Constructor<?>> constructorsProxySpecificBusinessInterface;
+
+   /**
+    * Constructor for the EJB2.x Home Proxy
+    */
+   private Constructor<?> constructorProxyHome;
+
+   /**
+    * Constructor for the EJB2.x View Proxy
+    */
+   private Constructor<?> constructorProxyEjb2x;
+
+   // --------------------------------------------------------------------------------||
+   // Constructor --------------------------------------------------------------------||
+   // --------------------------------------------------------------------------------||
+
+   /**
+    * Constructor
+    * 
+    * @param name The unique name for this ProxyFactory
+    * @param containerName The name of the InvokableContext (container)
+    *   upon which Proxies will invoke
+    * @param containerGuid The globally-unique name of the container
+    * @param metadata The metadata representing this Session Bean
+    * @param classloader The ClassLoader associated with the Container's Bean Class
+    *       for which this ProxyFactory is to generate Proxies
+    * @param advisor The Advisor for proxies created by this factory
+    */
+   public SessionProxyFactoryBase(final String name, final String containerName, final String containerGuid,
+         final JBossSessionBeanMetaData metadata, final ClassLoader classloader, final Advisor advisor)
+   {
+      // Call Super
+      super(name, containerName, containerGuid, classloader, advisor);
+
+      // Set Metadata
+      this.setMetadata(metadata);
+
+      // Instanciate backing Map for interface-specific business proxies
+      this.setConstructorsProxySpecificBusinessInterface(new HashMap<String, Constructor<?>>());
+   }
+
+   // --------------------------------------------------------------------------------||
+   // Functional Methods -------------------------------------------------------------||
+   // --------------------------------------------------------------------------------||
+
+   /**
+    * Create an EJB2.x Home Proxy
+    * 
+    * @return
+    */
+   public Object createProxyHome()
+   {
+      // Create a new InvocationHandler
+      SessionProxyInvocationHandler handler = this.createHomeInvocationHandler();
+
+      try
+      {
+         // Create a new Proxy instance, and return
+         return this.getConstructorProxyHome().newInstance(handler);
+      }
+      catch (Throwable t)
+      {
+         // Throw a descriptive error message along with the originating Throwable 
+         throw new RuntimeException("Could not create Home Proxy for " + this.getMetadata().getEjbName(), t);
+      }
+   }
+
+   /**
+    * Create an EJB3 Business proxy with no 
+    * specific target business interface.  The 
+    * returned proxy will implement all appropriate
+    * business interfaces.  Additionally, if
+    * the Home interface is bound alongside 
+    * the Default (same JNDI Name), this 
+    * Proxy will implement the Home interface as well.
+    * 
+    * @return
+    */
+   public Object createProxyDefault()
+   {
+      // Obtain Constructor to Default Proxy
+      Constructor<?> constructor = this.getConstructorProxyDefault();
+      assert constructor != null : "Constructor for Default Proxy was null; perhaps the "
+            + SessionProxyFactory.class.getSimpleName() + " was not properly started?";
+
+      // Create a new InvocationHandler
+      SessionProxyInvocationHandler handler = this.createBusinessDefaultInvocationHandler();
+
+      try
+      {
+         // Create a new Proxy instance, and return
+         return constructor.newInstance(handler);
+      }
+      catch (Throwable t)
+      {
+         // Throw a descriptive error message along with the originating Throwable 
+         throw new RuntimeException("Could not create the Default Proxy for " + this.getMetadata().getEjbName(), t);
+      }
+   }
+
+   /**
+    * Create an EJB3 Business Proxy specific to the specified
+    * target business interface name (expressed as 
+    * a fully-qualified class name)
+    * 
+    * @param businessInterfaceName
+    * @return
+    */
+   public Object createProxyBusiness(final String businessInterfaceName)
+   {
+      // Ensure businessInterfaceName is specified
+      assert businessInterfaceName != null && businessInterfaceName.trim().length() > 0 : "Required business interface type name was not specified";
+
+      try
+      {
+
+         // Obtain the correct business proxy constructor
+         Constructor<?> constructor = this.getConstructorsProxySpecificBusinessInterface().get(
+               businessInterfaceName.trim());
+
+         /*
+          * In place for web injection (isolated CL)
+          */
+         ClassLoader tcl = Thread.currentThread().getContextClassLoader();
+         try
+         {
+            // See if we can get at the bean class from the TCL
+            Class<?> businessInterfaceClass = Class.forName(businessInterfaceName, false, tcl);
+
+            // If so, use the TCL to generate the Proxy class, not the Container CL
+            Set<Class<?>> businessInterfaces = new HashSet<Class<?>>();
+            businessInterfaces.add(businessInterfaceClass);
+            constructor = this.createProxyConstructor(businessInterfaces, tcl);
+
+         }
+         catch (LinkageError le)
+         {
+            // Ignore
+         }
+         catch (ClassNotFoundException cce)
+         {
+            // Ignore
+         }
+
+         // Ensure the constructor was found
+         assert constructor != null : "No business proxy constructor for \"" + businessInterfaceName
+               + "\" was found; not created at start() properly?  Bad value bound as RefAddr in JNDI?";
+
+         // Create a new InvocationHandler
+         SessionProxyInvocationHandler handler = this
+               .createBusinessInterfaceSpecificInvocationHandler(businessInterfaceName);
+
+         // Create a new Proxy instance, and return
+         return constructor.newInstance(handler);
+      }
+      catch (Throwable t)
+      {
+         // Throw a descriptive error message along with the originating Throwable 
+         throw new RuntimeException("Could not create the EJB3 Business Proxy implementing \"" + businessInterfaceName
+               + "\" for " + this.getMetadata().getEjbName(), t);
+      }
+   }
+
+   /**
+    * Create an EJB2.x Proxy 
+    * 
+    * @return
+    */
+   public Object createProxyEjb2x()
+   {
+      // Create a new InvocationHandler
+      SessionProxyInvocationHandler handler = this.createEjb2xComponentInterfaceInvocationHandler();
+
+      try
+      {
+         // Create a new Proxy instance, and return
+         return this.getConstructorProxyEjb2x().newInstance(handler);
+      }
+      catch (Throwable t)
+      {
+         // Throw a descriptive error message along with the originating Throwable 
+         throw new RuntimeException("Could not create the EJB2.x Proxy for " + this.getMetadata().getEjbName(), t);
+      }
+   }
+
+   // --------------------------------------------------------------------------------||
+   // Lifecycle Methods --------------------------------------------------------------||
+   // --------------------------------------------------------------------------------||
+
+   /**
+    * Lifecycle callback to be invoked 
+    * before the ProxyFactory is able to service requests
+    * 
+    *  @throws Exception
+    */
+   @Override
+   public void start() throws Exception
+   {
+      // Call Super
+      super.start();
+
+      /*
+       * TODO:
+       * 
+       * Yet another method that should be broken apart
+       * and analyzed for re-use.
+       */
+
+      /*
+       * Make Proxies for EJB3 Business Interfaces
+       */
+
+      // Obtain Business Interface Types
+      Set<String> businessInterfaceTypes = this.getBusinessInterfaceTypes();
+
+      // Initialize
+      Set<Class<?>> businessInterfaceClasses = new HashSet<Class<?>>();
+
+      // Determine if business interfaces are defined
+      boolean hasBusinessInterfaces = businessInterfaceTypes != null && businessInterfaceTypes.size() > 0;
+
+      // If there are business interfaces
+      if (hasBusinessInterfaces)
+      {
+         // For all business interface types
+         for (String businessInterfaceType : businessInterfaceTypes)
+         {
+            Class<?> businessInterface = null;
+            try
+            {
+               // Load
+               businessInterface = this.getClassLoader().loadClass(businessInterfaceType);
+            }
+            catch (ClassNotFoundException cnfe)
+            {
+               throw new RuntimeException("Could not find specified Session Bean Business Interface \""
+                     + businessInterfaceType + "\" in " + ClassLoader.class.getSimpleName() + " for EJB "
+                     + this.getMetadata().getEjbName(), cnfe);
+            }
+
+            // Add business interface to classes
+            businessInterfaceClasses.add(businessInterface);
+
+            // Make Proxy specific to the business interface
+            Set<Class<?>> businessInterfaces = new HashSet<Class<?>>();
+            businessInterfaces.add(businessInterface);
+            Constructor<?> businessInterfaceConstructor = this.createProxyConstructor(businessInterfaces, this
+                  .getClassLoader());
+            log.debug("Created Session Bean Business Interface-Specific Proxy Constructor implementing \""
+                  + businessInterfaceType + "\"");
+
+            // Set
+            this.getConstructorsProxySpecificBusinessInterface().put(businessInterfaceType,
+                  businessInterfaceConstructor);
+
+         }
+      }
+
+      /*
+       * Make Constructor for Home
+       */
+
+      // Obtain Home Interface Type
+      String homeInterfaceType = this.getHomeType();
+
+      // Determine if Home is defined
+      boolean hasHomeInterface = homeInterfaceType != null && !homeInterfaceType.equals("");
+
+      // Ensure Home ad/or Business is defined
+      if (!hasHomeInterface && !hasBusinessInterfaces)
+      {
+         // Throw bean provider descriptive error
+         throw new RuntimeException("Cannot deploy EJB " + this.getMetadata().getEjbName()
+               + " as it has no EJB3 (Business Interface) or EJB2.x (Home Interface) Views Defined.");
+      }
+
+      // Initialize Home Interface Class
+      Class<?> homeInterfaceClass = null;
+
+      // If Home is defined
+      if (hasHomeInterface)
+      {
+         try
+         {
+            // Load the Home class
+            homeInterfaceClass = this.getClassLoader().loadClass(homeInterfaceType);
+         }
+         catch (ClassNotFoundException cnfe)
+         {
+            throw new RuntimeException("Could not find specified Session Bean Home Interface \"" + homeInterfaceType
+                  + "\" in " + ClassLoader.class.getSimpleName() + " for EJB " + this.getMetadata().getEjbName(), cnfe);
+         }
+
+         // Make the Home Proxy Constructor
+         Set<Class<?>> homeInterfaces = new HashSet<Class<?>>();
+         homeInterfaces.add(homeInterfaceClass);
+         Constructor<?> homeConstructor = this.createProxyConstructor(homeInterfaces, this.getClassLoader());
+         log.debug("Created Session Bean Home Proxy Constructor implementing \"" + homeInterfaceType + "\"");
+
+         // Set the Home Proxy Constructor
+         this.setConstructorProxyHome(homeConstructor);
+      }
+
+      /*
+       * Make Default Proxy
+       */
+
+      // Create a Set to hold all relevant interfaces
+      Set<Class<?>> defaultProxyInterfaces = new HashSet<Class<?>>();
+
+      // Add all business interfaces
+      if (hasBusinessInterfaces)
+      {
+         defaultProxyInterfaces.addAll(businessInterfaceClasses);
+      }
+
+      // If there's a home defined and its bound to the same binding as the default
+      if (hasHomeInterface && this.getMetadata().getJndiName().equals(this.getMetadata().getHomeJndiName()))
+      {
+         defaultProxyInterfaces.add(homeInterfaceClass);
+      }
+
+      // Make the Default Business Interfaces Proxy Constructor
+      Constructor<?> businessInterfacesConstructor = this.createProxyConstructor(defaultProxyInterfaces, this
+            .getClassLoader());
+      log.debug("Created Session Bean Default EJB3 Business Proxy Constructor implementing " + defaultProxyInterfaces);
+
+      // Set
+      this.setConstructorProxyDefault(businessInterfacesConstructor);
+
+      /*
+       * Make Constructor for EJB2.x Views
+       */
+
+      // EJB2.x Views may exist only if there is a Home
+      if (hasHomeInterface)
+      {
+         // Initialize Set of EJB2.x Interfaces 
+         Set<Class<?>> ejb2xInterfaces = new HashSet<Class<?>>();
+
+         // Get return types of create methods (EJB3 Core Specification 3.6.2.1)
+         //TODO Should be handled by metadata, see @Deprecated on the method below
+         Set<Class<?>> homeReturnTypes = this.getReturnTypesFromCreateMethods(homeInterfaceClass);
+         if (homeReturnTypes != null)
+         {
+            ejb2xInterfaces.addAll(homeReturnTypes);
+
+         }
+
+         // Get explicitly-defined EJB2x interface type
+         String ejb2xDeclaredType = StringUtils.adjustWhitespaceStringToNull(this.getEjb2xInterfaceType());
+
+         // If there is an explicitly-defined EJB2.x interface
+         if (ejb2xDeclaredType != null)
+         {
+            Class<?> ejb2xInterface = null;
+            try
+            {
+               // Load
+               ejb2xInterface = this.getClassLoader().loadClass(ejb2xDeclaredType);
+            }
+            catch (ClassNotFoundException cnfe)
+            {
+               throw new RuntimeException("Could not find specified Session Bean EJB2.x Interface \""
+                     + ejb2xDeclaredType + "\" in " + ClassLoader.class.getSimpleName() + " for EJB "
+                     + this.getMetadata().getEjbName(), cnfe);
+            }
+
+            // Add
+            ejb2xInterfaces.add(ejb2xInterface);
+         }
+
+         // Make the EJB2.x Proxy Constructor
+         Constructor<?> ejb2xConstructor = this.createProxyConstructor(ejb2xInterfaces, this.getClassLoader());
+         log.debug("Created Session Bean EJB2x Proxy Constructor implementing " + ejb2xInterfaces);
+
+         // Set the EJB2.x Proxy Constructor
+         this.setConstructorProxyEjb2x(ejb2xConstructor);
+      }
+
+   }
+
+   /**
+    * Lifecycle callback to be invoked by the ProxyFactoryDeployer
+    * before the ProxyFactory is taken out of service, 
+    * possibly GC'd
+    * 
+    * @throws Exception
+    */
+   @Override
+   public void stop() throws Exception
+   {
+      super.stop();
+      //TODO
+   }
+
+   /**
+    * Returns Proxy interfaces common to all Proxies generated
+    * by this ProxyFactory
+    * 
+    * @return
+    */
+   @Override
+   protected Set<Class<?>> getCommonProxyInterfaces()
+   {
+      // Initialize
+      Set<Class<?>> interfaces = super.getCommonProxyInterfaces();
+
+      // Add
+      interfaces.add(SessionProxy.class);
+
+      // Return
+      return interfaces;
+   }
+
+   // --------------------------------------------------------------------------------||
+   // Functional Methods -------------------------------------------------------------||
+   // --------------------------------------------------------------------------------||
+
+   /**
+    * Obtains the return types declared by the "create" methods for the specified home interface.
+    * 
+    * EJB3 Core Specification 3.6.2.1
+    * JIRA: EJBTHREE-1127
+    *  
+    * @param homeInterface
+    * @param isStateless Flag to indicate whether this is for a Stateful or Stateless container
+    * @return
+    * @deprecated http://jira.jboss.com/jira/browse/JBMETA-41
+    */
+   @Deprecated
+   protected Set<Class<?>> getReturnTypesFromCreateMethods(Class<?> homeInterface, boolean isStateless)
+   {
+      /*
+       * TODO
+       * 
+       * Kill the "isStateless" argument, centralize logic as appropriate, 
+       * and use polymorphsm to properly implement this method.
+       * 
+       * The current structure with the "isStateless" was born out of
+       * this function originating as a static utility from EJB3 Core.
+       * 
+       * Note: Perhaps this is a moot point, given the @Deprecated tag 
+       * and that jboss-metadata should be implementing this.
+       */
+
+      // Ensure we've been passed a Home or LocalHome interface (Developers only)
+      assert (EJBHome.class.isAssignableFrom(homeInterface) || EJBLocalHome.class.isAssignableFrom(homeInterface));
+
+      // Ensure we've been passed a Home or LocalHome interface (End-User)
+      if (!EJBHome.class.isAssignableFrom(homeInterface) && !EJBLocalHome.class.isAssignableFrom(homeInterface))
+      {
+         throw new RuntimeException("Declared EJB 2.1 Home Interface " + homeInterface.getName() + " does not extend "
+               + EJBHome.class.getName() + " or " + EJBLocalHome.class.getName()
+               + " as required by EJB 3.0 Core Specification 4.6.8 and 4.6.10");
+      }
+
+      // Initialize
+      Set<Class<?>> types = new HashSet<Class<?>>();
+      List<Method> createMethods = null;
+
+      // If for a Stateless Container
+      if (isStateless)
+      {
+         // Initialize error message
+         String specViolationErrorMessage = "EJB 3.0 Specification Violation (4.6.8 Bullet 4, 4.6.10 Bullet 4): \""
+               + "A stateless session bean must define exactly one create method with no arguments." + "\"; found in "
+               + homeInterface.getName();
+
+         // Get all methods with signature "create"
+         createMethods = new ArrayList<Method>();
+         try
+         {
+            createMethods.add(homeInterface.getMethod("create", new Class<?>[]
+            {}));
+         }
+         // EJB 3.0 Specification 4.6.8 Bullet 4 Violation
+         // EJBTHREE-1156
+         catch (NoSuchMethodException e)
+         {
+            throw new RuntimeException(specViolationErrorMessage);
+         }
+
+         // Ensure only one create method is defined
+         // EJB 3.0 Specification 4.6.8 Bullet 4 Violation
+         // EJBTHREE-1156
+         if (createMethods.size() > 1)
+         {
+            throw new RuntimeException(specViolationErrorMessage);
+         }
+      }
+      else
+      {
+         // Obtain all "create<METHOD>" methods
+         createMethods = ClassHelper.getAllMethodsByPrefix(homeInterface, "create");
+      }
+      if (createMethods.size() == 0)
+      {
+         throw new RuntimeException("EJB 3.0 Core Specification Violation (4.6.8 Bullet 5): EJB2.1 Home Interface "
+               + homeInterface + " does not declare a \'create<METHOD>\' method");
+      }
+
+      // Add all return types
+      for (Method method : createMethods)
+      {
+         types.add(method.getReturnType());
+      }
+
+      // Return
+      return types;
+   }
+
+   // --------------------------------------------------------------------------------||
+   // Contracts ----------------------------------------------------------------------||
+   // --------------------------------------------------------------------------------||
+
+   /**
+    * Returns the a Set of String representations of the Business Interface Types
+    * 
+    *  @return
+    */
+   protected abstract Set<String> getBusinessInterfaceTypes();
+
+   /**
+    * Returns the String representation of the Home Interface Type
+    * @return
+    */
+   protected abstract String getHomeType();
+
+   /**
+    * Returns the String representation of the EJB2.x Interface Types
+    * 
+    *  @return
+    */
+   protected abstract String getEjb2xInterfaceType();
+
+   /**
+    * Obtains the return types declared by the "create" methods for the specified home interface.
+    *  
+    * @param homeInterface
+    * @return
+    */
+   protected abstract Set<Class<?>> getReturnTypesFromCreateMethods(Class<?> homeInterface);
+
+   /**
+    * Returns the Constructor of the SessionProxyInvocationHandler to be used in 
+    * instanciating new handlers to specify in Proxy Creation
+    * 
+    * Used for creating a Handler for a Business Interface-specific proxy
+    * 
+    * @return
+    */
+   protected abstract SessionProxyInvocationHandler createBusinessInterfaceSpecificInvocationHandler(
+         String businessInterfaceName);
+
+   /**
+    * Returns the Constructor of the SessionProxyInvocationHandler to be used in 
+    * instanciating new handlers to specify in Proxy Creation
+    * 
+    * Used for creating a Handler for a Business Default proxy
+    * 
+    * @return
+    */
+   protected abstract SessionProxyInvocationHandler createBusinessDefaultInvocationHandler();
+
+   /**
+    * Returns the Constructor of the SessionProxyInvocationHandler to be used in 
+    * instanciating new handlers to specify in Proxy Creation
+    * 
+    * Used for creating a Handler for an EJB2.x Component Interface proxy
+    * 
+    * @return
+    */
+   protected abstract SessionProxyInvocationHandler createEjb2xComponentInterfaceInvocationHandler();
+
+   /**
+    * Returns the Constructor of the SessionProxyInvocationHandler to be used in 
+    * instanciating new handlers to specify in Proxy Creation
+    * 
+    * Used for creating a Handler for am EJB2.x Home proxy
+    * 
+    * @return
+    */
+   protected abstract SessionProxyInvocationHandler createHomeInvocationHandler();
+
+   // --------------------------------------------------------------------------------||
+   // Accessors / Mutators -----------------------------------------------------------||
+   // --------------------------------------------------------------------------------||
+
+   public JBossSessionBeanMetaData getMetadata()
+   {
+      return metadata;
+   }
+
+   protected void setMetadata(final JBossSessionBeanMetaData metadata)
+   {
+      this.metadata = metadata;
+   }
+
+   protected Constructor<?> getConstructorProxyDefault()
+   {
+      return constructorProxyDefault;
+   }
+
+   protected void setConstructorProxyDefault(Constructor<?> constructorProxyDefault)
+   {
+      this.constructorProxyDefault = constructorProxyDefault;
+   }
+
+   protected Map<String, Constructor<?>> getConstructorsProxySpecificBusinessInterface()
+   {
+      return constructorsProxySpecificBusinessInterface;
+   }
+
+   protected void setConstructorsProxySpecificBusinessInterface(
+         Map<String, Constructor<?>> constructorsProxySpecificBusinessInterface)
+   {
+      this.constructorsProxySpecificBusinessInterface = constructorsProxySpecificBusinessInterface;
+   }
+
+   protected Constructor<?> getConstructorProxyHome()
+   {
+      return constructorProxyHome;
+   }
+
+   protected void setConstructorProxyHome(Constructor<?> constructorProxyHome)
+   {
+      this.constructorProxyHome = constructorProxyHome;
+   }
+
+   protected Constructor<?> getConstructorProxyEjb2x()
+   {
+      return constructorProxyEjb2x;
+   }
+
+   protected void setConstructorProxyEjb2x(Constructor<?> constructorProxyEjb2x)
+   {
+      this.constructorProxyEjb2x = constructorProxyEjb2x;
+   }
+
+}




More information about the jboss-cvs-commits mailing list