diff --git a/ejb3/src/main/java/org/jboss/as/ejb3/iiop/EJBMetaDataImplIIOP.java b/ejb3/src/main/java/org/jboss/as/ejb3/component/EJBMetaDataImp.java similarity index 90% rename from ejb3/src/main/java/org/jboss/as/ejb3/iiop/EJBMetaDataImplIIOP.java rename to ejb3/src/main/java/org/jboss/as/ejb3/component/EJBMetaDataImp.java index 537a88221050..983f4e8675c0 100644 --- a/ejb3/src/main/java/org/jboss/as/ejb3/iiop/EJBMetaDataImplIIOP.java +++ b/ejb3/src/main/java/org/jboss/as/ejb3/component/EJBMetaDataImp.java @@ -19,23 +19,26 @@ * 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.as.ejb3.iiop; +package org.jboss.as.ejb3.component; + +import java.io.Serializable; import javax.ejb.EJBHome; import javax.ejb.EJBMetaData; -import java.io.Serializable; /** * An implementation of the EJBMetaData interface which allows a * client to obtain the enterprise Bean's meta-data information. * + * TODO: remove this on next EJB client release + * * @author Rickard ???berg (rickard.oberg@telkel.com) * @author Marc Fleury * @author Jason Dillon * @author Francisco Reverbel * @author Stuart Douglas */ -public class EJBMetaDataImplIIOP implements EJBMetaData, Serializable { +public class EJBMetaDataImp implements EJBMetaData, Serializable { private final Class remoteClass; private final Class homeClass; @@ -48,8 +51,8 @@ public class EJBMetaDataImplIIOP implements EJBMetaData, Serializable { private final EJBHome home; - public EJBMetaDataImplIIOP(Class remoteClass, Class homeClass, Class pkClass, boolean session, - boolean statelessSession, EJBHome home) { + public EJBMetaDataImp(final Class remoteClass, final Class homeClass, final Class pkClass, final boolean session, + final boolean statelessSession, final EJBHome home) { this.remoteClass = remoteClass; this.homeClass = homeClass; this.pkClass = pkClass; diff --git a/ejb3/src/main/java/org/jboss/as/ejb3/component/entity/EntityBeanHomeViewConfigurator.java b/ejb3/src/main/java/org/jboss/as/ejb3/component/entity/EntityBeanHomeViewConfigurator.java index 70341bdacd93..465ef8772cbd 100644 --- a/ejb3/src/main/java/org/jboss/as/ejb3/component/entity/EntityBeanHomeViewConfigurator.java +++ b/ejb3/src/main/java/org/jboss/as/ejb3/component/entity/EntityBeanHomeViewConfigurator.java @@ -25,6 +25,7 @@ import java.util.Collection; import javax.ejb.Handle; + import org.jboss.as.ee.component.ComponentConfiguration; import org.jboss.as.ee.component.ComponentStartService; import org.jboss.as.ee.component.ComponentView; @@ -33,7 +34,6 @@ import org.jboss.as.ee.component.ViewConfigurator; import org.jboss.as.ee.component.ViewDescription; import org.jboss.as.ee.component.interceptors.InterceptorOrder; -import org.jboss.as.ejb3.component.interceptors.ComponentTypeIdentityInterceptorFactory; import org.jboss.as.ejb3.component.EJBViewDescription; import org.jboss.as.ejb3.component.EjbHomeViewDescription; import org.jboss.as.ejb3.component.MethodIntf; @@ -42,11 +42,14 @@ import org.jboss.as.ejb3.component.entity.interceptors.EntityBeanHomeMethodInterceptorFactory; import org.jboss.as.ejb3.component.entity.interceptors.EntityBeanHomeRemoveByHandleInterceptorFactory; import org.jboss.as.ejb3.component.entity.interceptors.EntityBeanHomeRemoveInterceptorFactory; +import org.jboss.as.ejb3.component.interceptors.ComponentTypeIdentityInterceptorFactory; +import org.jboss.as.ejb3.component.interceptors.EjbMetadataInterceptorFactory; import org.jboss.as.server.deployment.Attachments; import org.jboss.as.server.deployment.DeploymentPhaseContext; import org.jboss.as.server.deployment.DeploymentUnit; import org.jboss.as.server.deployment.DeploymentUnitProcessingException; import org.jboss.as.server.deployment.reflect.ClassReflectionIndex; +import org.jboss.as.server.deployment.reflect.DeploymentClassIndex; import org.jboss.as.server.deployment.reflect.DeploymentReflectionIndex; import org.jboss.invocation.InterceptorFactory; import org.jboss.metadata.ejb.spec.PersistenceType; @@ -73,6 +76,8 @@ public void configure(final DeploymentPhaseContext context, final ComponentConfi final EntityBeanComponentDescription componentDescription = (EntityBeanComponentDescription) componentConfiguration.getComponentDescription(); final EJBViewDescription createdView = localHome ? componentDescription.getEjbLocalView() : componentDescription.getEjbRemoteView(); + final DeploymentClassIndex classIndex = deploymentUnit.getAttachment(Attachments.CLASS_INDEX); + for (final Method method : configuration.getProxyFactory().getCachedMethods()) { configuration.addClientInterceptor(method, ViewDescription.CLIENT_DISPATCHER_INTERCEPTOR_FACTORY, InterceptorOrder.Client.CLIENT_DISPATCHER); @@ -119,7 +124,27 @@ public void configureDependency(final ServiceBuilder serviceBuilder, final Co } else if (method.getName().equals("remove") && method.getParameterTypes().length == 1 && method.getParameterTypes()[0] == Handle.class) { configuration.addViewInterceptor(method, EntityBeanHomeRemoveByHandleInterceptorFactory.INSTANCE, InterceptorOrder.View.COMPONENT_DISPATCHER); } else if (method.getName().equals("getEJBMetaData") && method.getParameterTypes().length == 0) { - // TODO: impl + + final Class ejbObjectClass; + final Class pkClass; + try { + ejbObjectClass = classIndex.classIndex(createdView.getViewClassName()).getModuleClass(); + pkClass = classIndex.classIndex(componentDescription.getPrimaryKeyType()).getModuleClass(); + } catch (ClassNotFoundException e) { + throw new DeploymentUnitProcessingException("Could not load view class for " + componentDescription.getComponentName(), e); + } + final EjbMetadataInterceptorFactory factory = new EjbMetadataInterceptorFactory(ejbObjectClass, configuration.getViewClass(), pkClass, false, false); + + //add a dependency on the view to create + componentConfiguration.getStartDependencies().add(new DependencyConfigurator() { + @Override + public void configureDependency(final ServiceBuilder serviceBuilder, final ComponentStartService service) throws DeploymentUnitProcessingException { + serviceBuilder.addDependency(configuration.getViewServiceName(), ComponentView.class, factory.getHomeView()); + } + }); + //add the interceptor + configuration.addViewInterceptor(method, factory, InterceptorOrder.View.HOME_CREATE_INTERCEPTOR); + } else if (method.getName().equals("getHomeHandle") && method.getParameterTypes().length == 0) { // TODO: impl } else { diff --git a/ejb3/src/main/java/org/jboss/as/ejb3/component/interceptors/EjbMetadataInterceptorFactory.java b/ejb3/src/main/java/org/jboss/as/ejb3/component/interceptors/EjbMetadataInterceptorFactory.java new file mode 100644 index 000000000000..152cf40a2abd --- /dev/null +++ b/ejb3/src/main/java/org/jboss/as/ejb3/component/interceptors/EjbMetadataInterceptorFactory.java @@ -0,0 +1,70 @@ +/* + * JBoss, Home of Professional Open Source + * Copyright 2010, Red Hat Inc., and individual contributors as indicated + * by the @authors tag. See the copyright.txt 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.as.ejb3.component.interceptors; + +import javax.ejb.EJBHome; + +import org.jboss.as.ee.component.ComponentView; +import org.jboss.as.ejb3.component.EJBMetaDataImp; +import org.jboss.invocation.Interceptor; +import org.jboss.invocation.InterceptorContext; +import org.jboss.invocation.InterceptorFactory; +import org.jboss.invocation.InterceptorFactoryContext; +import org.jboss.msc.value.InjectedValue; + +/** + * Interceptor that handles the EJB metadata + * + * @author Stuart Douglas + */ +public class EjbMetadataInterceptorFactory implements InterceptorFactory { + + private final InjectedValue homeView = new InjectedValue(); + + private final Class remoteClass; + private final Class homeClass; + private final Class pkClass; + private final boolean session; + private final boolean stateless; + + public EjbMetadataInterceptorFactory(final Class remoteClass, final Class homeClass, final Class pkClass, final boolean session, final boolean stateless) { + this.remoteClass = remoteClass; + this.homeClass = homeClass; + this.pkClass = pkClass; + this.session = session; + this.stateless = stateless; + } + + @Override + public Interceptor create(final InterceptorFactoryContext context) { + return new Interceptor() { + @Override + public Object processInvocation(final InterceptorContext context) throws Exception { + return new EJBMetaDataImp(remoteClass, homeClass, pkClass, session, stateless, (EJBHome) homeView.getValue().createInstance().getInstance()); + } + }; + } + + public InjectedValue getHomeView() { + return homeView; + } +} diff --git a/ejb3/src/main/java/org/jboss/as/ejb3/component/session/SessionBeanHomeInterceptorFactory.java b/ejb3/src/main/java/org/jboss/as/ejb3/component/interceptors/SessionBeanHomeInterceptorFactory.java similarity index 98% rename from ejb3/src/main/java/org/jboss/as/ejb3/component/session/SessionBeanHomeInterceptorFactory.java rename to ejb3/src/main/java/org/jboss/as/ejb3/component/interceptors/SessionBeanHomeInterceptorFactory.java index b894784a4c1d..3524683efca9 100644 --- a/ejb3/src/main/java/org/jboss/as/ejb3/component/session/SessionBeanHomeInterceptorFactory.java +++ b/ejb3/src/main/java/org/jboss/as/ejb3/component/interceptors/SessionBeanHomeInterceptorFactory.java @@ -19,7 +19,7 @@ * 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.as.ejb3.component.session; +package org.jboss.as.ejb3.component.interceptors; import java.lang.reflect.Method; diff --git a/ejb3/src/main/java/org/jboss/as/ejb3/component/stateful/StatefulInitMethodInterceptorFactory.java b/ejb3/src/main/java/org/jboss/as/ejb3/component/stateful/StatefulInitMethodInterceptorFactory.java index e585c9e6ec0a..e4ee3cb80c1b 100644 --- a/ejb3/src/main/java/org/jboss/as/ejb3/component/stateful/StatefulInitMethodInterceptorFactory.java +++ b/ejb3/src/main/java/org/jboss/as/ejb3/component/stateful/StatefulInitMethodInterceptorFactory.java @@ -22,7 +22,7 @@ package org.jboss.as.ejb3.component.stateful; import org.jboss.as.ejb3.component.interceptors.AbstractEJBInterceptor; -import org.jboss.as.ejb3.component.session.SessionBeanHomeInterceptorFactory; +import org.jboss.as.ejb3.component.interceptors.SessionBeanHomeInterceptorFactory; import org.jboss.invocation.Interceptor; import org.jboss.invocation.InterceptorContext; import org.jboss.invocation.InterceptorFactory; diff --git a/ejb3/src/main/java/org/jboss/as/ejb3/deployment/processors/EjbDependencyDeploymentUnitProcessor.java b/ejb3/src/main/java/org/jboss/as/ejb3/deployment/processors/EjbDependencyDeploymentUnitProcessor.java index c97bda526e0d..4e972954a327 100644 --- a/ejb3/src/main/java/org/jboss/as/ejb3/deployment/processors/EjbDependencyDeploymentUnitProcessor.java +++ b/ejb3/src/main/java/org/jboss/as/ejb3/deployment/processors/EjbDependencyDeploymentUnitProcessor.java @@ -22,8 +22,8 @@ package org.jboss.as.ejb3.deployment.processors; -import static org.jboss.as.ejb3.deployment.EjbDeploymentMarker.isEjbDeployment; - +import org.jboss.as.ee.structure.DeploymentType; +import org.jboss.as.ee.structure.DeploymentTypeMarker; import org.jboss.as.server.deployment.Attachments; import org.jboss.as.server.deployment.DeploymentPhaseContext; import org.jboss.as.server.deployment.DeploymentUnit; @@ -35,6 +35,8 @@ import org.jboss.modules.ModuleIdentifier; import org.jboss.modules.ModuleLoader; +import static org.jboss.as.ejb3.deployment.EjbDeploymentMarker.isEjbDeployment; + /** * Responsible for adding appropriate Java EE {@link org.jboss.as.server.deployment.module.ModuleDependency module dependencies} *

@@ -78,7 +80,8 @@ public void deploy(DeploymentPhaseContext phaseContext) throws DeploymentUnitPro moduleSpecification.addSystemDependency(new ModuleDependency(moduleLoader, EJB_CLIENT, false, false, false)); // fetch the EjbJarMetaData - if (!isEjbDeployment(deploymentUnit)) { + //TODO: remove the app client bit after the next EJB release + if (!isEjbDeployment(deploymentUnit) && !DeploymentTypeMarker.isType(DeploymentType.APPLICATION_CLIENT, deploymentUnit)) { // nothing to do return; } diff --git a/ejb3/src/main/java/org/jboss/as/ejb3/deployment/processors/SessionBeanHomeProcessor.java b/ejb3/src/main/java/org/jboss/as/ejb3/deployment/processors/SessionBeanHomeProcessor.java index c4d3f2bcb14b..dc3c7ab6898d 100644 --- a/ejb3/src/main/java/org/jboss/as/ejb3/deployment/processors/SessionBeanHomeProcessor.java +++ b/ejb3/src/main/java/org/jboss/as/ejb3/deployment/processors/SessionBeanHomeProcessor.java @@ -37,15 +37,18 @@ import org.jboss.as.ee.component.interceptors.InterceptorOrder; import org.jboss.as.ejb3.component.EJBComponentDescription; import org.jboss.as.ejb3.component.EJBViewDescription; +import org.jboss.as.ejb3.component.interceptors.EjbMetadataInterceptorFactory; +import org.jboss.as.ejb3.component.interceptors.SessionBeanHomeInterceptorFactory; import org.jboss.as.ejb3.component.session.SessionBeanComponentDescription; -import org.jboss.as.ejb3.component.session.SessionBeanHomeInterceptorFactory; import org.jboss.as.ejb3.component.stateful.StatefulComponentDescription; import org.jboss.as.ejb3.component.stateless.StatelessComponentDescription; +import org.jboss.as.server.deployment.Attachments; import org.jboss.as.server.deployment.DeploymentPhaseContext; import org.jboss.as.server.deployment.DeploymentUnit; import org.jboss.as.server.deployment.DeploymentUnitProcessingException; import org.jboss.as.server.deployment.annotation.CompositeIndex; import org.jboss.as.server.deployment.reflect.ClassReflectionIndex; +import org.jboss.as.server.deployment.reflect.DeploymentClassIndex; import org.jboss.as.server.deployment.reflect.DeploymentReflectionIndex; import org.jboss.msc.service.ServiceBuilder; @@ -86,9 +89,11 @@ public void configure(final DeploymentPhaseContext context, final ComponentConfi configuration.addClientPostConstructInterceptor(org.jboss.invocation.Interceptors.getTerminalInterceptorFactory(), InterceptorOrder.ClientPostConstruct.TERMINAL_INTERCEPTOR); configuration.addClientPreDestroyInterceptor(org.jboss.invocation.Interceptors.getTerminalInterceptorFactory(), InterceptorOrder.ClientPreDestroy.TERMINAL_INTERCEPTOR); + final DeploymentClassIndex classIndex = phaseContext.getDeploymentUnit().getAttachment(Attachments.CLASS_INDEX); + //loop over methods looking for create methods: - final ClassReflectionIndex classIndex = reflectionIndex.getClassIndex(configuration.getViewClass()); - for (Method method : classIndex.getMethods()) { + final ClassReflectionIndex index = reflectionIndex.getClassIndex(configuration.getViewClass()); + for (Method method : index.getMethods()) { if (method.getName().startsWith("create")) { //we have a create method if(ejbObjectView == null) { @@ -109,6 +114,27 @@ public void configureDependency(final ServiceBuilder serviceBuilder, final Co configuration.addClientInterceptor(method, ViewDescription.CLIENT_DISPATCHER_INTERCEPTOR_FACTORY, InterceptorOrder.Client.CLIENT_DISPATCHER); configuration.addViewInterceptor(method, factory, InterceptorOrder.View.HOME_CREATE_INTERCEPTOR); + } else if(method.getName().equals("getEJBMetaData") && method.getParameterTypes().length == 0) { + + final Class ejbObjectClass; + try { + ejbObjectClass = classIndex.classIndex(ejbObjectView.getViewClassName()).getModuleClass(); + } catch (ClassNotFoundException e) { + throw new DeploymentUnitProcessingException("Could not load view class for " + componentDescription.getComponentName(), e); + } + final EjbMetadataInterceptorFactory factory = new EjbMetadataInterceptorFactory(ejbObjectClass, configuration.getViewClass(), null, true, componentDescription instanceof StatelessComponentDescription); + + //add a dependency on the view to create + componentConfiguration.getStartDependencies().add(new DependencyConfigurator() { + @Override + public void configureDependency(final ServiceBuilder serviceBuilder, final ComponentStartService service) throws DeploymentUnitProcessingException { + serviceBuilder.addDependency(configuration.getViewServiceName(), ComponentView.class, factory.getHomeView()); + } + }); + //add the interceptor + configuration.addClientInterceptor(method, ViewDescription.CLIENT_DISPATCHER_INTERCEPTOR_FACTORY, InterceptorOrder.Client.CLIENT_DISPATCHER); + configuration.addViewInterceptor(method, factory, InterceptorOrder.View.HOME_CREATE_INTERCEPTOR); + } } } diff --git a/ejb3/src/main/java/org/jboss/as/ejb3/iiop/EjbIIOPService.java b/ejb3/src/main/java/org/jboss/as/ejb3/iiop/EjbIIOPService.java index 19533ead0f1c..1059e3b572d6 100644 --- a/ejb3/src/main/java/org/jboss/as/ejb3/iiop/EjbIIOPService.java +++ b/ejb3/src/main/java/org/jboss/as/ejb3/iiop/EjbIIOPService.java @@ -33,6 +33,7 @@ import org.jacorb.ssl.SSLPolicyValueHelper; import org.jboss.as.ee.component.ComponentView; import org.jboss.as.ejb3.component.EJBComponent; +import org.jboss.as.ejb3.component.EJBMetaDataImp; import org.jboss.as.ejb3.component.entity.EntityBeanComponent; import org.jboss.as.ejb3.component.stateless.StatelessSessionComponent; import org.jboss.as.ejb3.deployment.DeploymentRepository; @@ -143,7 +144,7 @@ public class EjbIIOPService implements Service { /** * EJBMetaData the enterprise bean in the container. */ - private EJBMetaDataImplIIOP ejbMetaData; + private EJBMetaDataImp ejbMetaData; /** * Mapping from bean methods to SkeletonStrategy instances. @@ -333,16 +334,16 @@ public synchronized void start(final StartContext startContext) throws StartExce beanServantRegistry = poaRegistry.getValue().getRegistryWithPersistentPOAPerServant(); final EntityBeanComponent entityBeanComponent = (EntityBeanComponent) component; final Class pkClass = entityBeanComponent.getPrimaryKeyClass(); - ejbMetaData = new EJBMetaDataImplIIOP(entityBeanComponent.getRemoteClass(), entityBeanComponent.getHomeClass(), pkClass, false, false, ejbHome); + ejbMetaData = new EJBMetaDataImp(entityBeanComponent.getRemoteClass(), entityBeanComponent.getHomeClass(), pkClass, false, false, ejbHome); } else { // This is a session bean (lifespan: transient) beanServantRegistry = poaRegistry.getValue().getRegistryWithTransientPOAPerServant(); if (component instanceof StatelessSessionComponent) { // Stateless session bean - ejbMetaData = new EJBMetaDataImplIIOP(remoteView.getValue().getViewClass(), homeView.getValue().getViewClass(), null, true, true, ejbHome); + ejbMetaData = new EJBMetaDataImp(remoteView.getValue().getViewClass(), homeView.getValue().getViewClass(), null, true, true, ejbHome); } else { // Stateful session bean - ejbMetaData = new EJBMetaDataImplIIOP(remoteView.getValue().getViewClass(), homeView.getValue().getViewClass(), null, true, false, ejbHome); + ejbMetaData = new EJBMetaDataImp(remoteView.getValue().getViewClass(), homeView.getValue().getViewClass(), null, true, false, ejbHome); } }