/* * JBoss, Home of Professional Open Source. * Copyright 2006, 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.deployers.tmp; import java.util.Iterator; import javax.naming.NameNotFoundException; import org.jboss.ejb3.Container; import org.jboss.ejb3.DeploymentScope; import org.jboss.ejb3.EJBContainer; import org.jboss.ejb3.Ejb3Deployment; import org.jboss.ejb3.Ejb3Registry; import org.jboss.ejb3.proxy.factory.ProxyFactoryHelper; import org.jboss.logging.Logger; /** * Class to resolve EJB containers from ejb-ref or @EJB metadata * This class is overriden for specific behaviors, specifically whether or not * to resolve the EJB internally in a specific deployment or not. There will be one for * an EJB jar deployment and a WAR deployment and any other deployment package that needs to * use @EJB. * * @author <a href="mailto:bill@jboss.org">Bill Burke</a> * @version $Revision: 72637 $ */ public abstract class DeploymentEjbResolver { private static final Logger log = Logger.getLogger(DeploymentEjbResolver.class); protected DeploymentScope deploymentScope; protected String errorName; protected DeploymentEjbResolver(DeploymentScope deploymentScope, String errorName) { this.deploymentScope = deploymentScope; this.errorName = errorName; } protected abstract EJBContainer searchDeploymentInternally(String ejbLink, Class businessIntf); public EJBContainer getEjbContainer(String ejbLink, Class businessIntf) { int hashIndex = ejbLink.indexOf('#'); if (hashIndex != -1) { if (deploymentScope == null) { log.warn("ejb link '" + ejbLink + "' is relative, but no deployment scope found"); return null; } String relativePath = ejbLink.substring(0, hashIndex); Ejb3Deployment dep = deploymentScope.findRelativeDeployment(relativePath); if (dep == null) { log.warn("can't find a deployment for path '" + relativePath + "' of ejb link '" + ejbLink + "'"); return null; } String ejbName = ejbLink.substring(hashIndex + 1); return dep.getEjbContainer(ejbName, businessIntf); } // look internally EJBContainer ejb = searchDeploymentInternally(ejbLink, businessIntf); if (ejb != null) return ejb; for (Object obj : Ejb3Registry.getContainers()) { EJBContainer container = (EJBContainer) obj; if (container.getEjbName().equals(ejbLink)) { return container; } } return null; } public String getEjbJndiName(String ejbLink, Class businessIntf) { EJBContainer container = getEjbContainer(ejbLink, businessIntf); if (container == null) { return null; } return ProxyFactoryHelper.getJndiName(container, businessIntf); } public EJBContainer getEjbContainer(Ejb3Deployment deployment, Class businessIntf) throws NameNotFoundException { EJBContainer container = null; // search in myself for (Object obj : deployment.getEjbContainers().values()) { EJBContainer newContainer = (EJBContainer) obj; if (container == newContainer) continue; if (ProxyFactoryHelper.publishesInterface(newContainer, businessIntf)) { if (container != null) throw new NameNotFoundException("duplicated in " + errorName); container = newContainer; } } return container; } public EJBContainer getEjbContainer(Class businessIntf) throws NameNotFoundException { EJBContainer rtnContainer = null; // search in deployment first rtnContainer = searchForEjbContainerInternally(businessIntf); if (rtnContainer != null) return rtnContainer; // search in EAR String jarName = null; if (deploymentScope != null) { for (Ejb3Deployment deployment : deploymentScope.getEjbDeployments()) { EJBContainer newContainer = getEjbContainer(deployment, businessIntf); if (rtnContainer == newContainer) continue; // don't check self if (rtnContainer != null && newContainer != null) { throw new NameNotFoundException("duplicated in .ear within " + jarName + " and " + deployment.getDeploymentUnit().getShortName()); } if (newContainer != null) { rtnContainer = newContainer; jarName = deployment.getDeploymentUnit().getShortName(); } } } if (rtnContainer != null) { return rtnContainer; } // search everywhere Iterator containers = Ejb3Registry.getContainers().iterator(); while (containers.hasNext()) { Container container = (Container)containers.next(); EJBContainer ejbContainer = (EJBContainer) container; if (ejbContainer == rtnContainer) continue; if (ProxyFactoryHelper.publishesInterface(container, businessIntf)) { if (rtnContainer != null) { throw new NameNotFoundException("duplicated in " + ejbContainer.getDeployment().getDeploymentUnit().getShortName() + " and " + jarName); } rtnContainer = ejbContainer; jarName = ejbContainer.getDeployment().getDeploymentUnit().getShortName(); } } if (rtnContainer != null) return rtnContainer; throw new NameNotFoundException("not used by any EJBs"); } protected abstract EJBContainer searchForEjbContainerInternally(Class businessIntf) throws NameNotFoundException; public String getEjbJndiName(Class businessIntf) throws NameNotFoundException { EJBContainer container = getEjbContainer(businessIntf); String jndiName = ProxyFactoryHelper.getJndiName(container, businessIntf); if (jndiName == null) throw new NameNotFoundException("not used by any EJBs"); return jndiName; } }