001 /** 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017 018 package org.apache.geronimo.naming.deployment; 019 020 import java.util.Arrays; 021 import java.util.HashSet; 022 import java.util.Map; 023 import java.util.Set; 024 025 import javax.xml.namespace.QName; 026 027 import org.apache.geronimo.common.DeploymentException; 028 import org.apache.geronimo.gbean.AbstractNameQuery; 029 import org.apache.geronimo.gbean.GBeanData; 030 import org.apache.geronimo.gbean.GBeanInfo; 031 import org.apache.geronimo.gbean.GBeanInfoBuilder; 032 import org.apache.geronimo.j2ee.deployment.Module; 033 import org.apache.geronimo.j2ee.deployment.NamingBuilder; 034 import org.apache.geronimo.j2ee.j2eeobjectnames.NameFactory; 035 import org.apache.geronimo.kernel.ClassLoading; 036 import org.apache.geronimo.kernel.GBeanNotFoundException; 037 import org.apache.geronimo.naming.reference.GBeanReference; 038 import org.apache.geronimo.xbeans.geronimo.naming.GerGbeanRefDocument; 039 import org.apache.geronimo.xbeans.geronimo.naming.GerGbeanRefType; 040 import org.apache.geronimo.xbeans.geronimo.naming.GerPatternType; 041 import org.apache.xmlbeans.QNameSet; 042 import org.apache.xmlbeans.XmlObject; 043 044 /** 045 * @version $Rev: 535381 $ $Date: 2007-05-04 17:04:18 -0400 (Fri, 04 May 2007) $ 046 */ 047 public class GBeanRefBuilder extends AbstractNamingBuilder { 048 private static final QName GBEAN_REF_QNAME = GerGbeanRefDocument.type.getDocumentElementName(); 049 private static final QNameSet GBEAN_REF_QNAME_SET = QNameSet.singleton(GBEAN_REF_QNAME); 050 051 public void buildNaming(XmlObject specDD, XmlObject plan, Module module, Map componentContext) throws DeploymentException { 052 if (plan == null) { 053 return; 054 } 055 XmlObject[] gbeanRefsUntyped = plan.selectChildren(GBEAN_REF_QNAME_SET); 056 for (XmlObject gbeanRefUntyped : gbeanRefsUntyped) { 057 GerGbeanRefType gbeanRef = (GerGbeanRefType) gbeanRefUntyped.copy().changeType(GerGbeanRefType.type); 058 if (gbeanRef == null) { 059 throw new DeploymentException("Could not read gbeanRef " + gbeanRefUntyped + " as the correct xml type"); 060 } 061 GerPatternType[] gbeanLocatorArray = gbeanRef.getPatternArray(); 062 063 String[] interfaceTypesArray = gbeanRef.getRefTypeArray(); 064 Set<String> interfaceTypes = new HashSet<String>(Arrays.asList(interfaceTypesArray)); 065 Set<AbstractNameQuery> queries = new HashSet<AbstractNameQuery>(); 066 for (GerPatternType patternType : gbeanLocatorArray) { 067 AbstractNameQuery abstractNameQuery = ENCConfigBuilder.buildAbstractNameQuery(patternType, null, null, interfaceTypes); 068 queries.add(abstractNameQuery); 069 } 070 071 GBeanData gBeanData; 072 try { 073 gBeanData = module.getEarContext().getConfiguration().findGBeanData(queries); 074 } catch (GBeanNotFoundException e) { 075 throw new DeploymentException("Could not resolve reference at deploy time for queries " + queries, e); 076 } 077 078 if (interfaceTypes.isEmpty()) { 079 interfaceTypes.add(gBeanData.getGBeanInfo().getClassName()); 080 } 081 ClassLoader cl = module.getEarContext().getClassLoader(); 082 Class gBeanType; 083 try { 084 gBeanType = ClassLoading.loadClass(gBeanData.getGBeanInfo().getClassName(), cl); 085 } catch (ClassNotFoundException e) { 086 throw new DeploymentException("Cannot load GBean class", e); 087 } 088 089 String refName = gbeanRef.getRefName(); 090 091 NamingBuilder.JNDI_KEY.get(componentContext).put(ENV + refName, new GBeanReference(module.getConfigId(), queries, gBeanType)); 092 093 } 094 } 095 096 public QNameSet getSpecQNameSet() { 097 return QNameSet.EMPTY; 098 } 099 100 public QNameSet getPlanQNameSet() { 101 return GBEAN_REF_QNAME_SET; 102 } 103 104 public static final GBeanInfo GBEAN_INFO; 105 106 static { 107 GBeanInfoBuilder infoBuilder = GBeanInfoBuilder.createStatic(GBeanRefBuilder.class, NameFactory.MODULE_BUILDER); 108 109 GBEAN_INFO = infoBuilder.getBeanInfo(); 110 } 111 112 public static GBeanInfo getGBeanInfo() { 113 return GBEAN_INFO; 114 } 115 116 }