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.corba.deployment; 022 023 import java.net.URI; 024 import java.util.Map; 025 026 import javax.xml.namespace.QName; 027 028 import org.apache.geronimo.common.DeploymentException; 029 import org.apache.geronimo.gbean.AbstractName; 030 import org.apache.geronimo.gbean.AbstractNameQuery; 031 import org.apache.geronimo.gbean.GBeanData; 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.j2eeobjectnames.NameFactory; 036 import org.apache.geronimo.kernel.GBeanAlreadyExistsException; 037 import org.apache.geronimo.kernel.GBeanNotFoundException; 038 import org.apache.geronimo.kernel.repository.Environment; 039 import org.apache.geronimo.naming.deployment.AbstractNamingBuilder; 040 import org.apache.geronimo.naming.deployment.ENCConfigBuilder; 041 import org.apache.geronimo.xbeans.geronimo.naming.GerPatternType; 042 import org.apache.geronimo.corba.TSSLinkGBean; 043 import org.apache.geronimo.corba.xbeans.csiv2.tss.TSSTssDocument; 044 import org.apache.xmlbeans.QNameSet; 045 import org.apache.xmlbeans.XmlObject; 046 import org.apache.xmlbeans.XmlString; 047 048 /** 049 * @version $Rev: 706640 $ $Date: 2008-10-21 14:44:05 +0000 (Tue, 21 Oct 2008) $ 050 */ 051 public class TSSLinkBuilder extends AbstractNamingBuilder { 052 private static final String TSS_NAMESPACE = TSSTssDocument.type.getDocumentElementName().getNamespaceURI(); 053 private static final QName TSS_LINK_QNAME = new QName(TSS_NAMESPACE, "tss-link"); 054 private static final QName TSS_QNAME = new QName(TSS_NAMESPACE, "tss"); 055 private static final QName JNDI_NAME_QNAME = new QName(TSS_NAMESPACE, "jndi-name"); 056 057 public TSSLinkBuilder() { 058 } 059 060 public TSSLinkBuilder(Environment defaultEnvironment) { 061 super(defaultEnvironment); 062 } 063 064 protected boolean willMergeEnvironment(XmlObject specDD, XmlObject plan) { 065 return true; 066 // return hasTssLinks(plan); 067 } 068 069 // static boolean hasTssLinks(XmlObject plan) { 070 // return plan != null && (plan.selectChildren(TSS_LINK_QNAME).length > 0 || 071 // plan.selectChildren(TSS_QNAME).length > 0); 072 // } 073 074 public void buildNaming(XmlObject specDD, XmlObject plan, Module module, Map componentContext) throws DeploymentException { 075 if (plan == null) { 076 return; 077 } 078 079 AbstractName ejbName = getGBeanName(componentContext); 080 081 String[] tssLinks = toStringArray(plan.selectChildren(TSS_LINK_QNAME)); 082 XmlObject[] tsss = plan.selectChildren(TSS_QNAME); 083 String[] jndiNames = toStringArray(plan.selectChildren(JNDI_NAME_QNAME)); 084 for (int i = 0; i < tssLinks.length; i++) { 085 String tssLink = tssLinks[i]; 086 URI moduleURI = module.getModuleURI(); 087 String moduleString = moduleURI == null ? null : moduleURI.toString(); 088 AbstractNameQuery tssBeanName = ENCConfigBuilder.buildAbstractNameQuery(null, moduleString, tssLink, NameFactory.EJB_MODULE, NameFactory.EJB_MODULE); 089 try { 090 module.getEarContext().findGBean(tssBeanName); 091 } catch (GBeanNotFoundException e) { 092 tssBeanName = ENCConfigBuilder.buildAbstractNameQuery(null, null, tssLink, null, NameFactory.EJB_MODULE); 093 try { 094 module.getEarContext().findGBean(tssBeanName); 095 } catch (GBeanNotFoundException e1) { 096 throw new DeploymentException("No tss bean found", e); 097 } 098 } 099 AbstractName tssLinkName = module.getEarContext().getNaming().createChildName(ejbName, "tssLink" + i, "TSSLink"); 100 GBeanData tssLinkData = new GBeanData(tssLinkName, TSSLinkGBean.GBEAN_INFO); 101 tssLinkData.setAttribute("jndiNames", jndiNames); 102 tssLinkData.setReferencePattern("EJB", ejbName); 103 tssLinkData.setReferencePattern("TSSBean", tssBeanName); 104 try { 105 module.getEarContext().addGBean(tssLinkData); 106 } catch (GBeanAlreadyExistsException e) { 107 throw new DeploymentException("tss link gbean already present", e); 108 } 109 } 110 for (int i = 0; i < tsss.length; i++) { 111 GerPatternType tss = (GerPatternType) tsss[i]; 112 AbstractNameQuery tssBeanName = ENCConfigBuilder.buildAbstractNameQuery(tss, NameFactory.CORBA_TSS, NameFactory.EJB_MODULE, null); 113 AbstractName tssLinkName = module.getEarContext().getNaming().createChildName(ejbName, "tssRef" + i, "TSSLink"); 114 GBeanData tssLinkData = new GBeanData(tssLinkName, TSSLinkGBean.GBEAN_INFO); 115 tssLinkData.setAttribute("jndiNames", jndiNames); 116 tssLinkData.setReferencePattern("EJB", ejbName); 117 tssLinkData.setReferencePattern("TSSBean", tssBeanName); 118 try { 119 module.getEarContext().addGBean(tssLinkData); 120 } catch (GBeanAlreadyExistsException e) { 121 throw new DeploymentException("tss link gbean already present", e); 122 } 123 } 124 125 } 126 127 public QNameSet getSpecQNameSet() { 128 return QNameSet.EMPTY; 129 } 130 131 public QNameSet getPlanQNameSet() { 132 return QNameSet.singleton(TSS_LINK_QNAME); 133 } 134 135 private String[] toStringArray(XmlObject[] xmlObjects) { 136 String[] result = new String[xmlObjects.length]; 137 for (int i = 0; i < result.length; i++) { 138 // toString() and xmlText() insert tags around the value, which 139 // is most definitely NOT what we want. 140 result[i] = ((XmlString)xmlObjects[i]).getStringValue(); 141 } 142 return result; 143 } 144 145 public static final GBeanInfo GBEAN_INFO; 146 147 static { 148 GBeanInfoBuilder infoBuilder = GBeanInfoBuilder.createStatic(TSSLinkBuilder.class, NameFactory.MODULE_BUILDER); //TODO decide what type this should be 149 infoBuilder.addAttribute("defaultEnvironment", Environment.class, true, true); 150 151 infoBuilder.setConstructor(new String[] {"defaultEnvironment"}); 152 153 GBEAN_INFO = infoBuilder.getBeanInfo(); 154 } 155 156 public static GBeanInfo getGBeanInfo() { 157 return GBEAN_INFO; 158 } 159 160 } 161 162