001    /*
002     * Licensed to the Apache Software Foundation (ASF) under one
003     * or more contributor license agreements.  See the NOTICE file
004     * distributed with this work for additional information
005     * regarding copyright ownership.  The ASF licenses this file
006     * to you under the Apache License, Version 2.0 (the
007     * "License"); you may not use this file except in compliance
008     * with the License.  You may obtain a copy of the License at
009     *
010     *  http://www.apache.org/licenses/LICENSE-2.0
011     *
012     * Unless required by applicable law or agreed to in writing,
013     * software distributed under the License is distributed on an
014     * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015     * KIND, either express or implied.  See the License for the
016     * specific language governing permissions and limitations
017     * under the License.
018     */
019    
020    
021    package org.apache.geronimo.naming.deployment;
022    
023    import java.util.Collections;
024    import java.util.Map;
025    import java.util.Set;
026    
027    import javax.xml.namespace.QName;
028    
029    import org.apache.geronimo.common.DeploymentException;
030    import org.apache.geronimo.deployment.service.EnvironmentBuilder;
031    import org.apache.geronimo.gbean.AbstractNameQuery;
032    import org.apache.geronimo.gbean.GBeanInfo;
033    import org.apache.geronimo.gbean.GBeanInfoBuilder;
034    import org.apache.geronimo.j2ee.deployment.Module;
035    import org.apache.geronimo.j2ee.deployment.NamingBuilder;
036    import org.apache.geronimo.j2ee.j2eeobjectnames.NameFactory;
037    import org.apache.geronimo.kernel.GBeanNotFoundException;
038    import org.apache.geronimo.kernel.config.Configuration;
039    import org.apache.geronimo.kernel.repository.Artifact;
040    import org.apache.geronimo.kernel.repository.Dependency;
041    import org.apache.geronimo.kernel.repository.Environment;
042    import org.apache.geronimo.kernel.repository.ImportType;
043    import org.apache.geronimo.naming.reference.EntityManagerFactoryReference;
044    import org.apache.geronimo.schema.NamespaceElementConverter;
045    import org.apache.geronimo.schema.SchemaConversionUtils;
046    import org.apache.geronimo.xbeans.geronimo.naming.GerEntityManagerFactoryRefDocument;
047    import org.apache.geronimo.xbeans.geronimo.naming.GerEntityManagerFactoryRefType;
048    import org.apache.geronimo.xbeans.geronimo.naming.GerPatternType;
049    import org.apache.xmlbeans.QNameSet;
050    import org.apache.xmlbeans.XmlObject;
051    
052    /**
053     * @version $Rev: 471685 $ $Date: 2006-11-06 02:35:00 -0800 (Mon, 06 Nov 2006) $
054     */
055    public class EntityManagerFactoryRefBuilder implements NamingBuilder {
056        private static final QName ENTITY_MANAGER_FACTORY_REF_QNAME = GerEntityManagerFactoryRefDocument.type.getDocumentElementName();
057        private static final QNameSet ENTITY_MANAGER_FACTORY_REF_QNAME_SET = QNameSet.singleton(EntityManagerFactoryRefBuilder.ENTITY_MANAGER_FACTORY_REF_QNAME);
058    
059        private final Environment defaultEnvironment = new Environment();
060    
061        public EntityManagerFactoryRefBuilder() {
062            defaultEnvironment.addDependency(new Dependency(new Artifact("org.apache.geronimo.modules", "geronimo-persistence-jpa10", (String)null, "jar"), ImportType.CLASSES));
063        }
064    
065        public void buildEnvironment(XmlObject specDD, XmlObject plan, Environment environment) {
066            if (getEntityManagerFactoryRefs(plan).length > 0) {
067                EnvironmentBuilder.mergeEnvironments(environment, defaultEnvironment);
068            }
069        }
070    
071        public void initContext(XmlObject specDD, XmlObject plan, Configuration localConfiguration, Configuration remoteConfiguration, Module module) throws DeploymentException {
072        }
073    
074        public void buildNaming(XmlObject specDD, XmlObject plan, Configuration localConfiguration, Configuration remoteConfiguration, Module module, Map componentContext) throws DeploymentException {
075            XmlObject[] EntityManagerFactoryRefsUntyped = getEntityManagerFactoryRefs(plan);
076            for (int i = 0; i < EntityManagerFactoryRefsUntyped.length; i++) {
077                XmlObject EntityManagerFactoryRefUntyped = EntityManagerFactoryRefsUntyped[i];
078                GerEntityManagerFactoryRefType EntityManagerFactoryRef = (GerEntityManagerFactoryRefType) EntityManagerFactoryRefUntyped.copy().changeType(GerEntityManagerFactoryRefType.type);
079                if (EntityManagerFactoryRef == null) {
080                    throw new DeploymentException("Could not read EntityManagerFactoryRef " + EntityManagerFactoryRefUntyped + " as the correct xml type");
081                }
082                String EntityManagerFactoryRefName = EntityManagerFactoryRef.getEntityManagerFactoryRefName();
083    
084                Set interfaceTypes = Collections.singleton("org.apache.geronimo.persistence.PersistenceUnitGBean");
085                AbstractNameQuery persistenceUnitNameQuery;
086                if (EntityManagerFactoryRef.isSetPersistenceUnitName()) {
087                    String persistenceUnitName = EntityManagerFactoryRef.getPersistenceUnitName();
088                    persistenceUnitNameQuery = new AbstractNameQuery(null, Collections.singletonMap("name", persistenceUnitName), interfaceTypes);
089                } else {
090                    GerPatternType gbeanLocator = EntityManagerFactoryRef.getPattern();
091    
092                    persistenceUnitNameQuery = ENCConfigBuilder.buildAbstractNameQuery(gbeanLocator, null, null, interfaceTypes);
093                }
094    
095                try {
096                    localConfiguration.findGBeanData(persistenceUnitNameQuery);
097                } catch (GBeanNotFoundException e) {
098                    throw new DeploymentException("Could not resolve reference at deploy time for query " + persistenceUnitNameQuery, e);
099                }
100    
101                EntityManagerFactoryReference reference = new EntityManagerFactoryReference(localConfiguration.getId(), persistenceUnitNameQuery);
102    
103                ((Map)componentContext.get(JNDI_KEY)).put(ENV + EntityManagerFactoryRefName, reference);
104    
105            }
106        }
107    
108        public QNameSet getSpecQNameSet() {
109            SchemaConversionUtils.registerNamespaceConversions(Collections.singletonMap(EntityManagerFactoryRefBuilder.ENTITY_MANAGER_FACTORY_REF_QNAME.getLocalPart(), new NamespaceElementConverter(EntityManagerFactoryRefBuilder.ENTITY_MANAGER_FACTORY_REF_QNAME.getNamespaceURI())));
110            return QNameSet.EMPTY;
111        }
112    
113        public QNameSet getPlanQNameSet() {
114            return EntityManagerFactoryRefBuilder.ENTITY_MANAGER_FACTORY_REF_QNAME_SET;
115        }
116    
117        private XmlObject[] getEntityManagerFactoryRefs(XmlObject plan) {
118            return plan == null? NO_REFS: plan.selectChildren(EntityManagerFactoryRefBuilder.ENTITY_MANAGER_FACTORY_REF_QNAME_SET);
119        }
120    
121        public static final GBeanInfo GBEAN_INFO;
122    
123        static {
124            GBeanInfoBuilder infoBuilder = GBeanInfoBuilder.createStatic(EntityManagerFactoryRefBuilder.class, NameFactory.MODULE_BUILDER);
125    
126            GBEAN_INFO = infoBuilder.getBeanInfo();
127        }
128    
129        public static GBeanInfo getGBeanInfo() {
130            return EntityManagerFactoryRefBuilder.GBEAN_INFO;
131        }
132    }