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.HashMap; 021 import java.util.Map; 022 import javax.enterprise.deploy.model.DDBean; 023 import javax.enterprise.deploy.spi.DConfigBean; 024 import javax.enterprise.deploy.spi.exceptions.BeanNotFoundException; 025 import javax.enterprise.deploy.spi.exceptions.ConfigurationException; 026 027 import org.apache.geronimo.xbeans.geronimo.naming.GerEjbLocalRefType; 028 import org.apache.geronimo.xbeans.geronimo.naming.GerEjbRefType; 029 import org.apache.geronimo.xbeans.geronimo.naming.GerResourceEnvRefType; 030 import org.apache.geronimo.xbeans.geronimo.naming.GerResourceRefType; 031 import org.apache.xmlbeans.SchemaTypeLoader; 032 import org.apache.xmlbeans.XmlBeans; 033 034 /** 035 * @version $Rev: 495635 $ $Date: 2007-01-12 11:46:40 -0500 (Fri, 12 Jan 2007) $ 036 */ 037 public class ENCHelper { 038 static final SchemaTypeLoader SCHEMA_TYPE_LOADER = XmlBeans.typeLoaderUnion(new SchemaTypeLoader[]{ 039 XmlBeans.typeLoaderForClassLoader(org.apache.geronimo.xbeans.javaee.String.class.getClassLoader()), 040 }); 041 042 043 public static final String[][] ENC_XPATHS = { 044 {"ejb-ref"}, 045 {"ejb-local-ref"}, 046 {"resource-env-ref"}, 047 {"resource-ref"}, 048 }; 049 050 public static final String[][] NAME_XPATHS = { 051 {"ejb-ref-name"}, 052 {"ejb-ref-name"}, 053 {"resource-env-ref-name"}, 054 {"res-ref-name"} 055 }; 056 057 058 private final String[] xpaths; 059 private final String[] namePaths; 060 061 private RemoteRefDConfigBean[] ejbRefs; 062 063 private LocalRefDConfigBean[] ejbLocalRefs; 064 private LocalRefDConfigBean[] resourceEnvRefs; 065 private LocalRefDConfigBean[] resourceRefs; 066 067 public ENCHelper(DDBean ddBean, XmlEnvRefs envRefs, String[] xpaths, String[] namePaths) { 068 this.xpaths = xpaths; 069 this.namePaths = namePaths; 070 DDBean[] ddEjbRefs = ddBean.getChildBean(xpaths[0]); 071 if (ddEjbRefs == null) { 072 ddEjbRefs = new DDBean[0]; 073 } 074 ejbRefs = new RemoteRefDConfigBean[ddEjbRefs.length]; 075 GerEjbRefType[] xmlEjbRefs = envRefs.getEjbRefs(); 076 Map ejbRefMap = new HashMap(); 077 for (int i = 0; i < xmlEjbRefs.length; i++) { 078 GerEjbRefType refAdapter = xmlEjbRefs[i]; 079 ejbRefMap.put(refAdapter.getRefName(), refAdapter); 080 // envRefs.removeEjbRef(0); 081 } 082 // for (int i = 0; i < ddEjbRefs.length; i++) { 083 // DDBean ddRef = ddEjbRefs[i]; 084 // String name = ddRef.getText(namePaths[0])[0]; 085 // GerRemoteRefType refAdapter; 086 // if (ejbRefMap.get(name) == null) { 087 // refAdapter = envRefs.addNewEjbRef(); 088 // refAdapter.setRefName(name); 089 // } else { 090 // refAdapter = (GerRemoteRefType) ejbRefMap.get(name); 091 // envRefs.setEjbRef(i, refAdapter); 092 // } 093 // ejbRefs[i] = new RemoteRefDConfigBean(ddRef, refAdapter, namePaths[0]); 094 // } 095 // 096 // DDBean[] ddEjbLocalRefs = ddBean.getChildBean(xpaths[1]); 097 // if (ddEjbLocalRefs == null) { 098 // ddEjbLocalRefs = new DDBean[0]; 099 // } 100 // ejbLocalRefs = new LocalRefDConfigBean[ddEjbLocalRefs.length]; 101 // GerLocalRefType[] xmlEjbLocalRefs = envRefs.getEjbLocalRefs(); 102 // Map ejbLocalRefMap = new HashMap(); 103 // for (int i = 0; i < xmlEjbLocalRefs.length; i++) { 104 // GerLocalRefType refAdapter = xmlEjbLocalRefs[i]; 105 // ejbLocalRefMap.put(refAdapter.getRefName(), refAdapter); 106 // envRefs.removeEjbLocalRef(0); 107 // } 108 // for (int i = 0; i < ddEjbLocalRefs.length; i++) { 109 // DDBean ddRef = ddEjbLocalRefs[i]; 110 // String name = ddRef.getText(namePaths[1])[0]; 111 // GerLocalRefType refAdapter; 112 // if (ejbLocalRefMap.get(name) == null) { 113 // refAdapter = envRefs.addNewEjbLocalRef(); 114 // refAdapter.setRefName(name); 115 // } else { 116 // refAdapter = (GerLocalRefType) ejbLocalRefMap.get(name); 117 // envRefs.setEjbLocalRef(i, refAdapter); 118 // } 119 // ejbLocalRefs[i] = new LocalRefDConfigBean(ddRef, refAdapter, namePaths[1]); 120 // } 121 // 122 // 123 // DDBean[] ddResourceEnvRefs = ddBean.getChildBean(xpaths[2]); 124 // if (ddResourceEnvRefs == null) { 125 // ddResourceEnvRefs = new DDBean[0]; 126 // } 127 // resourceEnvRefs = new LocalRefDConfigBean[ddResourceEnvRefs.length]; 128 // GerLocalRefType[] xmlResourceEnvRefs = envRefs.getResourceEnvRefs(); 129 // Map resourceEnvRefMap = new HashMap(); 130 // for (int i = 0; i < xmlResourceEnvRefs.length; i++) { 131 // GerLocalRefType refAdapter = xmlResourceEnvRefs[i]; 132 // resourceEnvRefMap.put(refAdapter.getRefName(), refAdapter); 133 // envRefs.removeResourceEnvRef(0); 134 // } 135 // for (int i = 0; i < ddResourceEnvRefs.length; i++) { 136 // DDBean ddRef = ddResourceEnvRefs[i]; 137 // String name = ddRef.getText(namePaths[2])[0]; 138 // GerLocalRefType refAdapter; 139 // if (resourceEnvRefMap.get(name) == null) { 140 // refAdapter = envRefs.addNewResourceEnvRef(); 141 // refAdapter.setRefName(name); 142 // } else { 143 // refAdapter = (GerLocalRefType) resourceEnvRefMap.get(name); 144 // envRefs.setResourceEnvRef(i, refAdapter); 145 // } 146 // resourceEnvRefs[i] = new LocalRefDConfigBean(ddRef, refAdapter, namePaths[2]); 147 // } 148 // 149 // DDBean[] ddResourceRefs = ddBean.getChildBean(xpaths[3]); 150 // if (ddResourceRefs == null) { 151 // ddResourceRefs = new DDBean[0]; 152 // } 153 // resourceRefs = new LocalRefDConfigBean[ddResourceRefs.length]; 154 // GerLocalRefType[] xmlResourceRefs = envRefs.getResourceRefs(); 155 // Map resourceRefMap = new HashMap(); 156 // for (int i = 0; i < xmlResourceRefs.length; i++) { 157 // GerLocalRefType refAdapter = xmlResourceRefs[i]; 158 // resourceRefMap.put(refAdapter.getRefName(), refAdapter); 159 // envRefs.removeResourceRef(0); 160 // } 161 // for (int i = 0; i < ddResourceRefs.length; i++) { 162 // DDBean ddRef = ddResourceRefs[i]; 163 // String name = ddRef.getText(namePaths[3])[0]; 164 // GerLocalRefType refAdapter; 165 // if (resourceRefMap.get(name) == null) { 166 // refAdapter = envRefs.addNewResourceRef(); 167 // refAdapter.setRefName(name); 168 // } else { 169 // refAdapter = (GerLocalRefType) resourceRefMap.get(name); 170 // envRefs.setResourceRef(i, refAdapter); 171 // } 172 // resourceRefs[i] = new LocalRefDConfigBean(ddRef, refAdapter, namePaths[3]); 173 // } 174 175 } 176 177 public DConfigBean getDConfigBean(DDBean ddBean) throws ConfigurationException { 178 String xpath = ddBean.getXpath(); 179 if (xpath.equals(xpaths[0])) { 180 String name = ddBean.getText(namePaths[0])[0]; 181 for (int i = 0; i < ejbRefs.length; i++) { 182 RemoteRefDConfigBean ejbRef = ejbRefs[i]; 183 if (ejbRef.getRefName().equals(name)) { 184 return ejbRef; 185 } 186 } 187 throw new ConfigurationException("no such ejb-ref-name" + name); 188 } else if (xpath.equals(xpaths[1])) { 189 String name = ddBean.getText(namePaths[1])[0]; 190 for (int i = 0; i < ejbLocalRefs.length; i++) { 191 LocalRefDConfigBean ejbLocalRef = ejbLocalRefs[i]; 192 if (ejbLocalRef.getRefName().equals(name)) { 193 return ejbLocalRef; 194 } 195 } 196 throw new ConfigurationException("no such ejb-ref-name" + name); 197 } else if (xpath.equals(xpaths[2])) { 198 String name = ddBean.getText(namePaths[2])[0]; 199 for (int i = 0; i < resourceEnvRefs.length; i++) { 200 LocalRefDConfigBean resourceEnvRef = resourceEnvRefs[i]; 201 if (resourceEnvRef.getRefName().equals(name)) { 202 return resourceEnvRef; 203 } 204 } 205 throw new ConfigurationException("no such ejb-ref-name" + name); 206 } else if (xpath.equals(xpaths[3])) { 207 String name = ddBean.getText(namePaths[3])[0]; 208 for (int i = 0; i < resourceRefs.length; i++) { 209 LocalRefDConfigBean resourceRef = resourceRefs[i]; 210 if (resourceRef.getRefName().equals(name)) { 211 return resourceRef; 212 } 213 } 214 throw new ConfigurationException("no such res-ref-name" + name); 215 } else { 216 throw new ConfigurationException("Unrecognized XPath: " + ddBean.getXpath()); 217 } 218 } 219 220 public void removeDConfigBean(DConfigBean dcBean) throws BeanNotFoundException { 221 // DDBean ddBean = dcBean.getDDBean(); 222 // String xpath = ddBean.getXpath(); 223 // String name = ddBean.getText(); 224 /* 225 if (xpath.endsWith("ejb-ref/ejb-ref-name")) { 226 if (ejbRefs.remove(name) == null) { 227 throw new BeanNotFoundException("No DConfigBean found with name: " + name); 228 } 229 } else if (xpath.endsWith("ejb-local-ref/ejb-ref-name")) { 230 if (ejbLocalRefs.remove(name) == null) { 231 throw new BeanNotFoundException("No DConfigBean found with name: " + name); 232 } 233 } else if (xpath.endsWith("service-ref/service-ref-name")) { 234 if (serviceRefs.remove(name) == null) { 235 throw new BeanNotFoundException("No DConfigBean found with name: " + name); 236 } 237 } else if (xpath.endsWith("resource-ref/res-ref-name")) { 238 if (resourceRefs.remove(name) == null) { 239 throw new BeanNotFoundException("No DConfigBean found with name: " + name); 240 } 241 } else { 242 throw new BeanNotFoundException("Unrecognized XPath: " + xpath); 243 } 244 */ 245 } 246 247 248 public static class XmlEnvRefs { 249 private final GerEjbRefType[] ejbRefs; 250 private final GerEjbLocalRefType[] ejbLocalRefs; 251 private final GerResourceRefType[] resourceRefs; 252 private final GerResourceEnvRefType[] resourceEnvRefs; 253 254 public XmlEnvRefs(GerEjbRefType[] ejbRefs, GerEjbLocalRefType[] ejbLocalRefs, GerResourceRefType[] resourceRefs, GerResourceEnvRefType[] resourceEnvRefs) { 255 this.ejbRefs = ejbRefs; 256 this.ejbLocalRefs = ejbLocalRefs; 257 this.resourceRefs = resourceRefs; 258 this.resourceEnvRefs = resourceEnvRefs; 259 } 260 261 public GerEjbRefType[] getEjbRefs() { 262 return ejbRefs; 263 } 264 265 public GerEjbLocalRefType[] getEjbLocalRefs() { 266 return ejbLocalRefs; 267 } 268 269 public GerResourceRefType[] getResourceRefs() { 270 return resourceRefs; 271 } 272 273 public GerResourceEnvRefType[] getResourceEnvRefs() { 274 return resourceEnvRefs; 275 } 276 277 } 278 }