All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.openejb.config.MergeWebappJndiContext Maven / Gradle / Ivy

The newest version!
/*
 * 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.config;

import org.apache.openejb.OpenEJBException;
import org.apache.openejb.jee.EjbJar;
import org.apache.openejb.jee.EnterpriseBean;
import org.apache.openejb.jee.EnvEntry;
import org.apache.openejb.jee.JndiConsumer;
import org.apache.openejb.jee.JndiReference;
import org.apache.openejb.jee.PersistenceContextRef;
import org.apache.openejb.jee.PersistenceContextType;
import org.apache.openejb.jee.ResourceEnvRef;
import org.apache.openejb.jee.ResourceRef;
import org.apache.openejb.jee.SessionBean;
import org.apache.openejb.jee.TransactionType;

import javax.ejb.EJBContext;
import javax.ejb.EntityContext;
import javax.ejb.MessageDrivenContext;
import javax.ejb.SessionContext;
import javax.transaction.UserTransaction;
import java.util.Map;

/**
 * In a webapp all ejbs will share the JNDI namespace of the servlets
 * This means no private namespace for each EJB.
 * 

* To make this happen we merge the JNDI entries of each ejb into * * @version $Rev$ $Date$ */ public class MergeWebappJndiContext implements DynamicDeployer { @Override public AppModule deploy(final AppModule appModule) throws OpenEJBException { for (final WebModule webModule : appModule.getWebModules()) { if (webModule.getFinder() == null) { continue; } for (final EjbModule ejbModule : appModule.getEjbModules()) { // If they are the same module, they'll have the same finder if (ejbModule.getFinder() != webModule.getFinder()) { continue; } merge(ejbModule, webModule); } } return appModule; } private void merge(final EjbModule ejbModule, final WebModule webModule) { final JndiConsumer webApp = webModule.getWebApp(); final EjbJar ejbJar = ejbModule.getEjbJar(); for (final EnterpriseBean bean : ejbJar.getEnterpriseBeans()) { merge(bean.getEnvEntryMap(), webApp.getEnvEntryMap()); merge(bean.getEjbRefMap(), webApp.getEjbRefMap()); merge(bean.getEjbLocalRefMap(), webApp.getEjbLocalRefMap()); merge(bean.getServiceRefMap(), webApp.getServiceRefMap()); merge(bean.getResourceRefMap(), webApp.getResourceRefMap()); merge(bean.getResourceEnvRefMap(), webApp.getResourceEnvRefMap()); merge(bean.getMessageDestinationRefMap(), webApp.getMessageDestinationRefMap()); merge(bean.getPersistenceContextRefMap(), webApp.getPersistenceContextRefMap()); merge(bean.getPersistenceUnitRefMap(), webApp.getPersistenceUnitRefMap()); mergeUserTransaction(bean.getResourceRefMap(), webApp.getResourceRefMap(), webApp); mergeUserTransaction(bean.getResourceEnvRefMap(), webApp.getResourceEnvRefMap(), webApp); mergeUserTransaction(webApp.getResourceRefMap(), bean.getResourceRefMap(), bean); mergeUserTransaction(webApp.getResourceEnvRefMap(), bean.getResourceEnvRefMap(), bean); } final SessionBean aggregator = new SessionBean(); // easy way to get a JndiConsumer for (final EnterpriseBean a : ejbJar.getEnterpriseBeans()) { aggregator.getEnvEntryMap().putAll(a.getEnvEntryMap()); aggregator.getEjbRefMap().putAll(a.getEjbRefMap()); aggregator.getEjbLocalRefMap().putAll(a.getEjbLocalRefMap()); aggregator.getServiceRefMap().putAll(a.getServiceRefMap()); aggregator.getResourceRefMap().putAll(a.getResourceRefMap()); aggregator.getResourceEnvRefMap().putAll(a.getResourceEnvRefMap()); aggregator.getMessageDestinationRefMap().putAll(a.getMessageDestinationRefMap()); aggregator.getPersistenceContextRefMap().putAll(a.getPersistenceContextRefMap()); aggregator.getPersistenceUnitRefMap().putAll(a.getPersistenceUnitRefMap()); } for (final EnterpriseBean a : ejbJar.getEnterpriseBeans()) { copy(aggregator.getEnvEntryMap(), a.getEnvEntryMap()); copy(aggregator.getEjbRefMap(), a.getEjbRefMap()); copy(aggregator.getEjbLocalRefMap(), a.getEjbLocalRefMap()); copy(aggregator.getServiceRefMap(), a.getServiceRefMap()); copy(aggregator.getResourceRefMap(), a.getResourceRefMap()); copy(aggregator.getResourceEnvRefMap(), a.getResourceEnvRefMap()); copy(aggregator.getMessageDestinationRefMap(), a.getMessageDestinationRefMap()); copy(aggregator.getPersistenceContextRefMap(), a.getPersistenceContextRefMap()); copy(aggregator.getPersistenceUnitRefMap(), a.getPersistenceUnitRefMap()); mergeUserTransaction(aggregator.getResourceRefMap(), a.getResourceRefMap(), a); mergeUserTransaction(aggregator.getResourceEnvRefMap(), a.getResourceEnvRefMap(), a); } } /** * Bidirectional a-b merge */ private void merge(final Map a, final Map b) { copy(a, b); copy(b, a); } private void copy(final Map from, final Map to) { for (final R a : from.values()) { if (isPrivateReference(a)) { continue; } final R b = to.get(a.getKey()); // New entry if (b == null) { if (!isExtendedPersistenceContext(a)) { to.put(a.getKey(), a); } continue; } // Update existing entry // merge injection points b.getInjectionTarget().addAll(a.getInjectionTarget()); // merge env-entry values if (b instanceof EnvEntry && a instanceof EnvEntry) { final EnvEntry eb = (EnvEntry) b; final EnvEntry ea = (EnvEntry) a; if (eb.getEnvEntryValue() == null) { eb.setEnvEntryValue(ea.getEnvEntryValue()); } if (eb.getEnvEntryType() == null) { eb.setEnvEntryType(ea.getEnvEntryType()); } } } } private static boolean isExtendedPersistenceContext(final R b) { return b instanceof PersistenceContextRef && PersistenceContextType.EXTENDED.equals(((PersistenceContextRef) b).getPersistenceContextType()); } private boolean isPrivateReference(final R a) { if (!isResourceRef(a)) { return false; } final Class[] types = {EJBContext.class, EntityContext.class, SessionContext.class, MessageDrivenContext.class, UserTransaction.class}; for (final Class type : types) { if (type.getName().equals(a.getType())) { return true; } } return false; } private boolean isResourceRef(final R a) { return a instanceof ResourceRef || a instanceof ResourceEnvRef; } private void mergeUserTransaction(final Map from, final Map to, final JndiConsumer consumer) { if (consumer instanceof EnterpriseBean) { final EnterpriseBean enterpriseBean = (EnterpriseBean) consumer; if (enterpriseBean.getTransactionType() != TransactionType.BEAN) { return; } } for (final R a : from.values()) { if (!UserTransaction.class.getName().equals(a.getType())) { continue; } final R b = to.get(a.getKey()); // New entry if (b == null) { to.put(a.getKey(), a); continue; } // Update existing entry // merge injection points b.getInjectionTarget().addAll(a.getInjectionTarget()); } } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy