| /* |
| * 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.openejb.assembler.classic; |
| |
| import org.apache.openejb.Injection; |
| import org.apache.openejb.InterfaceType; |
| import org.apache.openejb.OpenEJBException; |
| import org.apache.openejb.SystemException; |
| import org.apache.openejb.core.CoreUserTransaction; |
| import org.apache.openejb.core.JndiFactory; |
| import org.apache.openejb.core.ParentClassLoaderFinder; |
| import org.apache.openejb.core.TransactionSynchronizationRegistryWrapper; |
| import org.apache.openejb.core.ivm.naming.ClassReference; |
| import org.apache.openejb.core.ivm.naming.CrossClassLoaderJndiReference; |
| import org.apache.openejb.core.ivm.naming.IntraVmJndiReference; |
| import org.apache.openejb.core.ivm.naming.JaxWsServiceReference; |
| import org.apache.openejb.core.ivm.naming.JndiReference; |
| import org.apache.openejb.core.ivm.naming.JndiUrlReference; |
| import org.apache.openejb.core.ivm.naming.LazyObjectReference; |
| import org.apache.openejb.core.ivm.naming.MapObjectReference; |
| import org.apache.openejb.core.ivm.naming.ObjectReference; |
| import org.apache.openejb.core.ivm.naming.PersistenceContextReference; |
| import org.apache.openejb.core.ivm.naming.Reference; |
| import org.apache.openejb.core.ivm.naming.SystemComponentReference; |
| import org.apache.openejb.core.ivm.naming.URLReference; |
| import org.apache.openejb.core.webservices.HandlerChainData; |
| import org.apache.openejb.core.webservices.PortRefData; |
| import org.apache.openejb.core.webservices.ServiceRefData; |
| import org.apache.openejb.loader.SystemInstance; |
| import org.apache.openejb.persistence.JtaEntityManager; |
| import org.apache.openejb.persistence.JtaEntityManagerRegistry; |
| import org.apache.openejb.rest.ThreadLocalContextManager; |
| import org.apache.openejb.spi.ContainerSystem; |
| import org.apache.openejb.util.Classes; |
| import org.apache.openejb.util.IntrospectionSupport; |
| import org.apache.openejb.util.LogCategory; |
| import org.apache.openejb.util.Logger; |
| import org.apache.webbeans.config.WebBeansContext; |
| import org.apache.webbeans.container.InjectableBeanManager; |
| |
| import javax.annotation.ManagedBean; |
| import javax.ejb.EJBContext; |
| import javax.ejb.TimerService; |
| import javax.ejb.spi.HandleDelegate; |
| import javax.enterprise.inject.spi.BeanManager; |
| import javax.naming.Context; |
| import javax.naming.LinkRef; |
| import javax.naming.Name; |
| import javax.naming.NamingException; |
| import javax.persistence.EntityManagerFactory; |
| import javax.servlet.ServletConfig; |
| import javax.servlet.ServletContext; |
| import javax.servlet.ServletRequest; |
| import javax.servlet.http.HttpServletRequest; |
| import javax.servlet.http.HttpServletResponse; |
| import javax.transaction.TransactionManager; |
| import javax.transaction.UserTransaction; |
| import javax.validation.Validator; |
| import javax.validation.ValidatorFactory; |
| import javax.ws.rs.container.ResourceContext; |
| import javax.ws.rs.core.Application; |
| import javax.ws.rs.core.Configuration; |
| import javax.ws.rs.core.HttpHeaders; |
| import javax.ws.rs.core.Request; |
| import javax.ws.rs.core.SecurityContext; |
| import javax.ws.rs.core.UriInfo; |
| import javax.ws.rs.ext.ContextResolver; |
| import javax.ws.rs.ext.Providers; |
| import javax.xml.ws.Service; |
| import javax.xml.ws.WebServiceContext; |
| import java.io.Serializable; |
| import java.net.MalformedURLException; |
| import java.net.URI; |
| import java.net.URL; |
| import java.util.ArrayList; |
| import java.util.Collection; |
| import java.util.HashMap; |
| import java.util.List; |
| import java.util.Map; |
| import java.util.Properties; |
| import java.util.TreeMap; |
| import java.util.concurrent.Callable; |
| |
| /** |
| * TODO: This class is essentially an over glorified sym-linker. The names we were linking to are no longer guaranteed to be what we assume them to be. We need to come up with a |
| * different internal naming structure for the global JNDI and finally create the default which will be the default symlinked version of all the components. |
| */ |
| public class JndiEncBuilder { |
| public static final Logger logger = Logger.getInstance(LogCategory.OPENEJB_STARTUP, JndiEncBuilder.class.getPackage().getName()); |
| |
| public static enum JndiScope { |
| comp, |
| module, |
| app, |
| global, |
| } |
| |
| private final boolean beanManagedTransactions; |
| private final JndiEncInfo jndiEnc; |
| private final URI moduleUri; |
| private final String moduleId; |
| private final String uniqueId; |
| private final Collection<Injection> injections; |
| private final ClassLoader classLoader; |
| private final Properties properties; |
| |
| private boolean useCrossClassLoaderRef = true; |
| private boolean client; |
| |
| public JndiEncBuilder(final JndiEncInfo jndiEnc, final Collection<Injection> injections, final String moduleId, final URI moduleUri, |
| final String uniqueId, final ClassLoader classLoader, final Properties properties) throws OpenEJBException { |
| this(jndiEnc, injections, null, moduleId, moduleUri, uniqueId, classLoader, properties); |
| } |
| |
| public JndiEncBuilder(final JndiEncInfo jndiEnc, final Collection<Injection> injections, final String transactionType, |
| final String moduleId, final URI moduleUri, final String uniqueId, final ClassLoader classLoader, final Properties properties) throws OpenEJBException { |
| this.jndiEnc = jndiEnc; |
| this.properties = properties; |
| this.injections = injections; |
| beanManagedTransactions = transactionType != null && transactionType.equalsIgnoreCase("Bean"); |
| |
| this.moduleId = moduleId; |
| this.moduleUri = moduleUri; |
| |
| this.uniqueId = uniqueId; |
| this.classLoader = classLoader; |
| } |
| |
| public boolean isUseCrossClassLoaderRef() { |
| return useCrossClassLoaderRef; |
| } |
| |
| public void setUseCrossClassLoaderRef(final boolean useCrossClassLoaderRef) { |
| this.useCrossClassLoaderRef = useCrossClassLoaderRef; |
| } |
| |
| public boolean isClient() { |
| return client; |
| } |
| |
| public void setClient(final boolean client) { |
| this.client = client; |
| } |
| |
| public Context build(final JndiScope type) throws OpenEJBException { |
| final Map<String, Object> bindings = buildBindings(type); |
| |
| return build(bindings); |
| } |
| |
| public Context build(final Map<String, Object> bindings) throws SystemException { |
| final JndiFactory jndiFactory = SystemInstance.get().getComponent(JndiFactory.class); |
| |
| if (SystemInstance.get().hasProperty("openejb.geronimo")) { |
| return jndiFactory.createComponentContext(new HashMap()); |
| } |
| |
| return jndiFactory.createComponentContext(bindings); |
| } |
| |
| public Map<String, Object> buildBindings(final JndiScope type) throws OpenEJBException { |
| final Map<String, Object> bindings = buildMap(type); |
| switch (type) { |
| case comp: |
| addSpecialCompBindings(bindings); |
| break; |
| case module: |
| addSpecialModuleBindings(bindings); |
| break; |
| case app: |
| addSpecialAppBindings(bindings); |
| break; |
| case global: |
| addSpecialGlobalBindings(bindings); |
| break; |
| } |
| return bindings; |
| } |
| |
| public Map<String, Object> buildMap(final JndiScope scope) throws OpenEJBException { |
| final Map<String, Object> bindings = new TreeMap<>(); // let it be sorted for real binding |
| |
| // get JtaEntityManagerRegistry |
| final JtaEntityManagerRegistry jtaEntityManagerRegistry = SystemInstance.get().getComponent(JtaEntityManagerRegistry.class); |
| |
| for (final EjbReferenceInfo referenceInfo : jndiEnc.ejbReferences) { |
| |
| final Reference reference; |
| |
| if (referenceInfo.location != null) { |
| reference = buildReferenceLocation(referenceInfo.location); |
| } else if (referenceInfo.ejbDeploymentId == null) { |
| reference = new LazyEjbReference(new Ref(referenceInfo), moduleUri, useCrossClassLoaderRef); |
| } else { |
| final String jndiName = "openejb/Deployment/" + JndiBuilder.format(referenceInfo.ejbDeploymentId, referenceInfo.interfaceClassName, referenceInfo.localbean ? InterfaceType.LOCALBEAN : InterfaceType.BUSINESS_REMOTE); |
| if (useCrossClassLoaderRef && referenceInfo.externalReference) { |
| reference = new CrossClassLoaderJndiReference(jndiName); |
| } else { |
| reference = new IntraVmJndiReference(jndiName); |
| } |
| } |
| bindings.put(normalize(referenceInfo.referenceName), reference); |
| } |
| |
| for (final EjbReferenceInfo referenceInfo : jndiEnc.ejbLocalReferences) { |
| final Reference reference; |
| |
| if (referenceInfo.location != null) { |
| reference = buildReferenceLocation(referenceInfo.location); |
| } else if (referenceInfo.ejbDeploymentId == null) { |
| reference = new LazyEjbReference(new Ref(referenceInfo), moduleUri, false); |
| } else { |
| final String jndiName = "openejb/Deployment/" + JndiBuilder.format(referenceInfo.ejbDeploymentId, referenceInfo.interfaceClassName, referenceInfo.localbean ? InterfaceType.LOCALBEAN : InterfaceType.BUSINESS_LOCAL); |
| reference = new IntraVmJndiReference(jndiName); |
| } |
| bindings.put(normalize(referenceInfo.referenceName), reference); |
| } |
| |
| for (final EnvEntryInfo entry : jndiEnc.envEntries) { |
| |
| if (entry.location != null) { |
| final Reference reference = buildReferenceLocation(entry.location); |
| bindings.put(normalize(entry.referenceName), reference); |
| continue; |
| } |
| |
| //It is possible that the value and location are both null, as it is allowed to use @Resource(name="java:global/env/abc") with no value is specified in DD |
| if (entry.value == null) { |
| continue; |
| } |
| |
| try { |
| final Class type = Classes.deprimitivize(getType(entry.type, entry)); |
| final Object obj; |
| if (type == String.class) { |
| obj = new String(entry.value); |
| } else if (type == Double.class) { |
| obj = new Double(entry.value); |
| } else if (type == Integer.class) { |
| obj = new Integer(entry.value); |
| } else if (type == Long.class) { |
| obj = new Long(entry.value); |
| } else if (type == Float.class) { |
| obj = new Float(entry.value); |
| } else if (type == Short.class) { |
| obj = new Short(entry.value); |
| } else if (type == Boolean.class) { |
| obj = Boolean.valueOf(entry.value); |
| } else if (type == Byte.class) { |
| obj = new Byte(entry.value); |
| } else if (type == Character.class) { |
| final StringBuilder sb = new StringBuilder(entry.value + " "); |
| obj = sb.charAt(0); |
| } else if (type == URL.class) { |
| obj = new URL(entry.value); |
| } else if (type == Class.class) { |
| obj = new ClassReference(entry.value.trim()); |
| } else if (type.isEnum()) { |
| obj = Enum.valueOf(type, entry.value.trim()); |
| } else { |
| throw new IllegalArgumentException("Invalid env-entry-type " + type); |
| } |
| |
| bindings.put(normalize(entry.referenceName), obj); |
| } catch (final NumberFormatException e) { |
| throw new IllegalArgumentException("The env-entry-value for entry " + entry.referenceName + " was not recognizable as type " + entry.type + ". Received Message: " + e.getLocalizedMessage(), e); |
| } catch (final MalformedURLException e) { |
| throw new IllegalArgumentException("URL for reference " + entry.referenceName + " was not a valid URL: " + entry.value, e); |
| } |
| } |
| |
| for (final ResourceReferenceInfo referenceInfo : jndiEnc.resourceRefs) { |
| if (!(referenceInfo instanceof ContextReferenceInfo)) { |
| if (referenceInfo.location != null) { |
| final Reference reference = buildReferenceLocation(referenceInfo.location); |
| bindings.put(normalize(referenceInfo.referenceName), reference); |
| continue; |
| } |
| |
| final Class<?> type = getType(referenceInfo.referenceType, referenceInfo); |
| |
| final Object reference; |
| if (URL.class.equals(type)) { |
| reference = new URLReference(referenceInfo.resourceID); |
| } else if (type.isAnnotationPresent(ManagedBean.class)) { |
| final ManagedBean managed = type.getAnnotation(ManagedBean.class); |
| final String name = managed.value().length() == 0 ? type.getSimpleName() : managed.value(); |
| reference = new LinkRef("module/" + name); |
| } else if (referenceInfo.resourceID != null) { |
| final String jndiName = "openejb/Resource/" + referenceInfo.resourceID; |
| reference = new IntraVmJndiReference(jndiName); |
| } else { |
| final String jndiName = "openejb/Resource/" + referenceInfo.referenceName; |
| reference = new IntraVmJndiReference(jndiName); |
| } |
| |
| bindings.put(normalize(referenceInfo.referenceName), reference); |
| } else { |
| final Class<?> type = getType(referenceInfo.referenceType, referenceInfo); |
| final Object reference; |
| |
| if (Request.class.equals(type)) { |
| reference = new ObjectReference(ThreadLocalContextManager.REQUEST); |
| } else if (HttpServletRequest.class.equals(type)) { |
| reference = new ObjectReference(ThreadLocalContextManager.HTTP_SERVLET_REQUEST); |
| } else if (ServletRequest.class.equals(type)) { |
| reference = new ObjectReference(ThreadLocalContextManager.SERVLET_REQUEST); |
| } else if (UriInfo.class.equals(type)) { |
| reference = new ObjectReference(ThreadLocalContextManager.URI_INFO); |
| } else if (HttpHeaders.class.equals(type)) { |
| reference = new ObjectReference(ThreadLocalContextManager.HTTP_HEADERS); |
| } else if (SecurityContext.class.equals(type)) { |
| reference = new ObjectReference(ThreadLocalContextManager.SECURITY_CONTEXT); |
| } else if (ContextResolver.class.equals(type)) { |
| reference = new ObjectReference(ThreadLocalContextManager.CONTEXT_RESOLVER); |
| } else if (Providers.class.equals(type)) { |
| reference = new ObjectReference(ThreadLocalContextManager.PROVIDERS); |
| } else if (ServletConfig.class.equals(type)) { |
| reference = new ObjectReference(ThreadLocalContextManager.SERVLET_CONFIG); |
| } else if (ServletContext.class.equals(type)) { |
| reference = new ObjectReference(ThreadLocalContextManager.SERVLET_CONTEXT); |
| } else if (HttpServletResponse.class.equals(type)) { |
| reference = new ObjectReference(ThreadLocalContextManager.HTTP_SERVLET_RESPONSE); |
| } else if (javax.ws.rs.container.ResourceInfo.class.equals(type)) { |
| reference = new ObjectReference(ThreadLocalContextManager.RESOURCE_INFO); |
| } else if (ResourceContext.class.equals(type)) { |
| reference = new ObjectReference(ThreadLocalContextManager.RESOURCE_CONTEXT); |
| } else if (Configuration.class.equals(type)) { |
| reference = new ObjectReference(ThreadLocalContextManager.CONFIGURATION); |
| } else if (Application.class.equals(type)) { |
| reference = new ObjectReference(ThreadLocalContextManager.APPLICATION); |
| } else { |
| reference = new MapObjectReference(ThreadLocalContextManager.OTHERS, referenceInfo.referenceType); |
| } |
| bindings.put(normalize(referenceInfo.referenceName), reference); |
| } |
| } |
| |
| for (final ResourceEnvReferenceInfo referenceInfo : jndiEnc.resourceEnvRefs) { |
| |
| if (referenceInfo.location != null) { |
| final Reference reference = buildReferenceLocation(referenceInfo.location); |
| bindings.put(normalize(referenceInfo.referenceName), reference); |
| continue; |
| } |
| |
| final Class<?> type = getType(referenceInfo.resourceEnvRefType, referenceInfo); |
| final Object reference; |
| |
| if (EJBContext.class.isAssignableFrom(type)) { |
| final String jndiName = "comp/EJBContext"; |
| reference = new LinkRef(jndiName); |
| |
| // Let the container bind this into JNDI |
| if (jndiName.equals(referenceInfo.referenceName)) { |
| continue; |
| } |
| } else if (Validator.class.equals(type)) { |
| final String jndiName = "comp/Validator"; |
| reference = new LinkRef(jndiName); |
| } else if (ValidatorFactory.class.equals(type)) { |
| final String jndiName = "comp/ValidatorFactory"; |
| reference = new LinkRef(jndiName); |
| } else if (WebServiceContext.class.equals(type)) { |
| final String jndiName = "comp/WebServiceContext"; |
| reference = new LinkRef(jndiName); |
| } else if (TimerService.class.equals(type)) { |
| final String jndiName = "comp/TimerService"; |
| reference = new LinkRef(jndiName); |
| |
| } else if (BeanManager.class.equals(type)) { |
| reference = new LazyObjectReference<>(new BeanManagerLazyReference()); |
| |
| } else if (UserTransaction.class.equals(type)) { |
| reference = new IntraVmJndiReference("comp/UserTransaction"); |
| } else if (referenceInfo.resourceID != null) { |
| final String jndiName = "openejb/Resource/" + referenceInfo.resourceID; |
| reference = new IntraVmJndiReference(jndiName); |
| } else { |
| final String jndiName = "openejb/Resource/" + referenceInfo.referenceName; |
| reference = new IntraVmJndiReference(jndiName); |
| } |
| bindings.put(normalize(referenceInfo.referenceName), reference); |
| } |
| |
| for (final PersistenceUnitReferenceInfo referenceInfo : jndiEnc.persistenceUnitRefs) { |
| if (referenceInfo.location != null) { |
| final Reference reference = buildReferenceLocation(referenceInfo.location); |
| bindings.put(normalize(referenceInfo.referenceName), reference); |
| continue; |
| } |
| |
| final String jndiName = PersistenceBuilder.getOpenEJBJndiName(referenceInfo.unitId); |
| final Reference reference = new IntraVmJndiReference(jndiName); |
| bindings.put(normalize(referenceInfo.referenceName), reference); |
| } |
| |
| for (final PersistenceContextReferenceInfo contextInfo : jndiEnc.persistenceContextRefs) { |
| if (contextInfo.location != null) { |
| final Reference reference = buildReferenceLocation(contextInfo.location); |
| bindings.put(normalize(contextInfo.referenceName), reference); |
| continue; |
| } |
| |
| final Context context = SystemInstance.get().getComponent(ContainerSystem.class).getJNDIContext(); |
| final EntityManagerFactory factory; |
| try { |
| final String jndiName = PersistenceBuilder.getOpenEJBJndiName(contextInfo.unitId); |
| factory = (EntityManagerFactory) context.lookup(jndiName); |
| } catch (final NamingException e) { |
| throw new OpenEJBException("PersistenceUnit '" + contextInfo.unitId + "' not found for EXTENDED ref '" + contextInfo.referenceName + "'"); |
| } |
| |
| final JtaEntityManager jtaEntityManager = new JtaEntityManager( |
| contextInfo.persistenceUnitName, jtaEntityManagerRegistry, factory, contextInfo.properties, contextInfo.extended, contextInfo.synchronizationType); |
| final Reference reference = new PersistenceContextReference(jtaEntityManager); |
| bindings.put(normalize(contextInfo.referenceName), reference); |
| } |
| |
| for (final ServiceReferenceInfo referenceInfo : jndiEnc.serviceRefs) { |
| if (referenceInfo.location != null) { |
| final Reference reference = buildReferenceLocation(referenceInfo.location); |
| bindings.put(normalize(referenceInfo.referenceName), reference); |
| continue; |
| } |
| |
| // load service class which is used to construct the port |
| Class<? extends Service> serviceClass = Service.class; |
| if (referenceInfo.serviceType != null) { |
| try { |
| serviceClass = classLoader.loadClass(referenceInfo.serviceType).asSubclass(Service.class); |
| } catch (final Exception e) { |
| throw new OpenEJBException("Could not load service type class " + referenceInfo.serviceType, e); |
| } |
| } |
| |
| // load the reference class which is the ultimate type of the port |
| Class<?> referenceClass = null; |
| if (referenceInfo.referenceType != null) { |
| try { |
| referenceClass = classLoader.loadClass(referenceInfo.referenceType); |
| } catch (final Exception e) { |
| throw new OpenEJBException("Could not load reference type class " + referenceInfo.referenceType, e); |
| } |
| } |
| |
| // if ref class is a subclass of Service, use it for the service class |
| if (referenceClass != null && Service.class.isAssignableFrom(referenceClass)) { |
| serviceClass = referenceClass.asSubclass(Service.class); |
| } |
| |
| // determine the location of the wsdl file |
| URL wsdlUrl = null; |
| if (referenceInfo.wsdlFile != null) { |
| try { |
| wsdlUrl = new URL(referenceInfo.wsdlFile); |
| } catch (final MalformedURLException e) { |
| wsdlUrl = classLoader.getResource(referenceInfo.wsdlFile); |
| if (wsdlUrl == null) { |
| logger.warning("Error obtaining WSDL: " + referenceInfo.wsdlFile, e); |
| } |
| |
| } |
| } |
| |
| // port refs |
| final List<PortRefData> portRefs = new ArrayList<>(referenceInfo.portRefs.size()); |
| for (final PortRefInfo portRefInfo : referenceInfo.portRefs) { |
| final PortRefData portRef = new PortRefData(); |
| portRef.setQName(portRefInfo.qname); |
| portRef.setServiceEndpointInterface(portRefInfo.serviceEndpointInterface); |
| portRef.setEnableMtom(portRefInfo.enableMtom); |
| portRef.getProperties().putAll(portRefInfo.properties); |
| portRefs.add(portRef); |
| } |
| |
| // create the handle chains |
| List<HandlerChainData> handlerChains = null; |
| if (!referenceInfo.handlerChains.isEmpty()) { |
| handlerChains = WsBuilder.toHandlerChainData(referenceInfo.handlerChains, classLoader); |
| } |
| |
| if (!client) { |
| final Reference reference = new JaxWsServiceReference(referenceInfo.id, |
| referenceInfo.serviceQName, |
| serviceClass, referenceInfo.portQName, |
| referenceClass, |
| wsdlUrl, |
| portRefs, |
| handlerChains, |
| injections, |
| properties); |
| bindings.put(normalize(referenceInfo.referenceName), reference); |
| } else { |
| final ServiceRefData serviceRefData = new ServiceRefData(referenceInfo.id, |
| referenceInfo.serviceQName, |
| serviceClass, referenceInfo.portQName, |
| referenceClass, |
| wsdlUrl, |
| handlerChains, |
| portRefs); |
| bindings.put(normalize(referenceInfo.referenceName), serviceRefData); |
| } |
| } |
| |
| final OpenEjbConfiguration config = SystemInstance.get().getComponent(OpenEjbConfiguration.class); |
| |
| if (config != null) { |
| |
| for (final ResourceInfo resource : config.facilities.resources) { |
| final String jndiName = resource.jndiName; |
| if (jndiName != null && !jndiName.isEmpty() && isNotGobalOrIsHoldByThisApp(resource, scope)) { |
| final String refName = "openejb/Resource/" + resource.id; |
| final Object reference = new IntraVmJndiReference(refName); |
| final String boundName = normalize(jndiName); |
| bindings.put(boundName, reference); |
| } |
| } |
| |
| } |
| return bindings; |
| } |
| |
| // we don't want to bind globally a global resource multiple times in the Assembler |
| // if the datasource if defined globally in the currently deployed app originAppname hould not be null |
| private boolean isNotGobalOrIsHoldByThisApp(final ResourceInfo info, final JndiScope scope) { |
| return !info.jndiName.startsWith("global/") |
| || info.originAppName != null && info.originAppName.equals(moduleId) && JndiScope.global.equals(scope); |
| } |
| |
| private void addSpecialCompBindings(final Map<String, Object> bindings) { |
| // bind TransactionManager |
| final TransactionManager transactionManager = SystemInstance.get().getComponent(TransactionManager.class); |
| bindings.put("comp/TransactionManager", transactionManager); |
| |
| // bind TransactionSynchronizationRegistry |
| bindings.put("comp/TransactionSynchronizationRegistry", new TransactionSynchronizationRegistryWrapper()); |
| |
| try { |
| bindings.put("comp/ORB", new SystemComponentReference(ParentClassLoaderFinder.Helper.get().loadClass("org.omg.CORBA.ORB"))); |
| } catch (final NoClassDefFoundError | ClassNotFoundException e) { |
| // no corba, who does recall what it is today anyway :D |
| } |
| bindings.put("comp/HandleDelegate", new SystemComponentReference(HandleDelegate.class)); |
| |
| // bind bean validation objects |
| bindings.put("comp/ValidatorFactory", new IntraVmJndiReference(Assembler.VALIDATOR_FACTORY_NAMING_CONTEXT + uniqueId)); |
| bindings.put("comp/Validator", new IntraVmJndiReference(Assembler.VALIDATOR_NAMING_CONTEXT + uniqueId)); |
| |
| // bind UserTransaction if bean managed transactions |
| if (beanManagedTransactions) { |
| final UserTransaction userTransaction = new CoreUserTransaction(transactionManager); |
| bindings.put("comp/UserTransaction", userTransaction); |
| } |
| } |
| |
| private void addSpecialModuleBindings(final Map<String, Object> bindings) { |
| if (moduleId != null) { |
| bindings.put("module/ModuleName", moduleId); |
| } |
| // ensure the bindings will be non-empty |
| if (bindings.isEmpty()) { |
| bindings.put("module/dummy", "dummy"); |
| } |
| } |
| |
| private void addSpecialAppBindings(final Map<String, Object> bindings) { |
| if (moduleId != null) { |
| bindings.put("app/AppName", moduleId); |
| } |
| // ensure the bindings will be non-empty |
| if (bindings.isEmpty()) { |
| bindings.put("app/dummy", "dummy"); |
| } |
| } |
| |
| private void addSpecialGlobalBindings(final Map<String, Object> bindings) { |
| // ensure the bindings will be non-empty |
| if (bindings.isEmpty()) { |
| bindings.put("global/dummy", "dummy"); |
| } |
| } |
| |
| public static boolean bindingExists(final Context context, final Name contextName) { |
| try { |
| return context.lookup(contextName) != null; |
| } catch (final NamingException e) { |
| // no-op |
| } |
| return false; |
| } |
| |
| private Reference buildReferenceLocation(final ReferenceLocationInfo location) { |
| if (location.jndiProviderId != null) { |
| final String subContextName = "openejb/remote_jndi_contexts/" + location.jndiProviderId; |
| return new JndiReference(subContextName, location.jndiName); |
| } else { |
| return new JndiUrlReference(location.jndiName); |
| } |
| } |
| |
| private String normalize(final String name) { |
| //currently all names seem to be normalized properly |
| return name; |
| } |
| |
| private Class getType(final String type, final InjectableInfo injectable) throws OpenEJBException { |
| if (type != null) { |
| try { |
| return classLoader.loadClass(type.trim()); |
| } catch (final ClassNotFoundException e) { |
| throw new OpenEJBException("Unable to load type '" + type + "' for " + injectable.referenceName); |
| } |
| } |
| return inferType(injectable); |
| } |
| |
| private Class inferType(final InjectableInfo injectable) throws OpenEJBException { |
| for (final InjectionInfo injection : injectable.targets) { |
| try { |
| final Class<?> target = classLoader.loadClass(injection.className.trim()); |
| return IntrospectionSupport.getPropertyType(target, injection.propertyName.trim()); |
| } catch (final ClassNotFoundException | NoSuchFieldException e) { |
| // ignore |
| } |
| } |
| throw new OpenEJBException("Unable to infer type for " + injectable.referenceName); |
| } |
| |
| private static class Ref implements EjbResolver.Reference, Serializable { |
| private final EjbReferenceInfo info; |
| |
| public Ref(final EjbReferenceInfo info) { |
| this.info = info; |
| } |
| |
| public String getEjbLink() { |
| return info.link; |
| } |
| |
| public String getHome() { |
| return info.homeClassName; |
| } |
| |
| public String getInterface() { |
| return info.interfaceClassName; |
| } |
| |
| public String getMappedName() { |
| return null; |
| } |
| |
| public String getName() { |
| return info.referenceName; |
| } |
| |
| public EjbResolver.Type getRefType() { |
| if (info instanceof EjbLocalReferenceInfo) { |
| return EjbResolver.Type.LOCAL; |
| } else if (info.homeClassName != null) { |
| return EjbResolver.Type.REMOTE; |
| } else { |
| return EjbResolver.Type.UNKNOWN; |
| } |
| } |
| } |
| |
| public static class BeanManagerLazyReference implements Callable<BeanManager> { |
| @Override |
| public BeanManager call() throws Exception { |
| return new InjectableBeanManager(WebBeansContext.currentInstance().getBeanManagerImpl()); |
| } |
| } |
| } |