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