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.Collections;
022 import java.util.HashMap;
023 import java.util.HashSet;
024 import java.util.Iterator;
025 import java.util.Map;
026 import java.util.Set;
027
028 import javax.xml.namespace.QName;
029
030 import org.apache.geronimo.common.DeploymentException;
031 import org.apache.geronimo.deployment.service.EnvironmentBuilder;
032 import org.apache.geronimo.gbean.AbstractName;
033 import org.apache.geronimo.gbean.AbstractNameQuery;
034 import org.apache.geronimo.j2ee.deployment.Module;
035 import org.apache.geronimo.j2ee.deployment.NamingBuilder;
036 import org.apache.geronimo.kernel.config.Configuration;
037 import org.apache.geronimo.kernel.repository.Artifact;
038 import org.apache.geronimo.kernel.repository.Environment;
039 import org.apache.geronimo.schema.NamespaceElementConverter;
040 import org.apache.geronimo.xbeans.geronimo.naming.GerPatternType;
041 import org.apache.xmlbeans.QNameSet;
042 import org.apache.xmlbeans.SchemaType;
043 import org.apache.xmlbeans.XmlCursor;
044 import org.apache.xmlbeans.XmlObject;
045
046 /**
047 * @version $Rev: 470597 $ $Date: 2006-11-02 15:30:55 -0800 (Thu, 02 Nov 2006) $
048 */
049 public abstract class AbstractNamingBuilder implements NamingBuilder {
050 protected static final String J2EE_NAMESPACE = "http://java.sun.com/xml/ns/j2ee";
051 protected static final String JEE_NAMESPACE = "http://java.sun.com/xml/ns/javaee";
052 protected static final NamespaceElementConverter J2EE_CONVERTER = new NamespaceElementConverter(J2EE_NAMESPACE);
053
054 private final Environment defaultEnvironment;
055
056 protected AbstractNamingBuilder() {
057 defaultEnvironment = null;
058 }
059
060 protected AbstractNamingBuilder(Environment defaultEnvironment) {
061 this.defaultEnvironment = defaultEnvironment;
062 }
063
064 public void buildEnvironment(XmlObject specDD, XmlObject plan, Environment environment) {
065 if (willMergeEnvironment(specDD, plan)) {
066 EnvironmentBuilder.mergeEnvironments(environment, defaultEnvironment);
067 }
068 }
069
070 protected boolean willMergeEnvironment(XmlObject specDD, XmlObject plan) {
071 return false;
072 }
073
074 public void initContext(XmlObject specDD, XmlObject plan, Configuration localConfiguration, Configuration remoteConfiguration, Module module) throws DeploymentException {
075 }
076
077 protected Map getJndiContextMap(Map sharedContext) {
078 return (Map)sharedContext.get(JNDI_KEY);
079 }
080
081 protected AbstractName getGBeanName(Map sharedContext) {
082 return (AbstractName)sharedContext.get(GBEAN_NAME_KEY);
083 }
084
085 protected static QNameSet buildQNameSet(String[] eeNamespaces, String localPart) {
086 Set qnames = new HashSet(eeNamespaces.length);
087 for (int i = 0; i < eeNamespaces.length; i++) {
088 String namespace = eeNamespaces[i];
089 qnames.add(new QName(namespace, localPart));
090 }
091 //xmlbeans 2.0 has a bug so forArray doesn't work. Don't know if it's fixed in later xmlbeans versions
092 //return QNameSet.forArray(qnames);
093 return QNameSet.forSets(null, Collections.EMPTY_SET, Collections.EMPTY_SET, qnames);
094 }
095
096 protected XmlObject[] convert(XmlObject[] xmlObjects, NamespaceElementConverter converter, SchemaType type) {
097 //bizarre ArrayStoreException if xmlObjects is loaded by the wrong classloader
098 XmlObject[] converted = new XmlObject[xmlObjects.length];
099 for (int i = 0; i < xmlObjects.length; i++) {
100 XmlObject xmlObject = xmlObjects[i];
101 if (xmlObject.schemaType() != type) {
102 xmlObject = xmlObject.copy();
103 XmlCursor start =xmlObject.newCursor();
104 XmlCursor end = xmlObject.newCursor();
105
106 try {
107 converter.convertElement(start, end);
108 } finally {
109 start.dispose();
110 end.dispose();
111 }
112 converted[i] = xmlObject.changeType(type);
113 } else {
114 converted[i] = xmlObject;
115 }
116 }
117 return converted;
118 }
119 protected static String getStringValue(org.apache.geronimo.xbeans.j2ee.String string) {
120 if (string == null) {
121 return null;
122 }
123 String s = string.getStringValue();
124 return s == null ? null : s.trim();
125 }
126
127 public static AbstractNameQuery buildAbstractNameQuery(GerPatternType pattern, String type, String moduleType, Set interfaceTypes) {
128 String groupId = pattern.isSetGroupId() ? pattern.getGroupId().trim() : null;
129 String artifactid = pattern.isSetArtifactId() ? pattern.getArtifactId().trim() : null;
130 String version = pattern.isSetVersion() ? pattern.getVersion().trim() : null;
131 String module = pattern.isSetModule() ? pattern.getModule().trim() : null;
132 String name = pattern.getName().trim();
133
134 Artifact artifact = artifactid != null ? new Artifact(groupId, artifactid, version, null) : null;
135 Map nameMap = new HashMap();
136 nameMap.put("name", name);
137 if (type != null) {
138 nameMap.put("j2eeType", type);
139 }
140 if (module != null && moduleType != null) {
141 nameMap.put(moduleType, module);
142 }
143 if(interfaceTypes != null) {
144 Set trimmed = new HashSet();
145 for (Iterator it = interfaceTypes.iterator(); it.hasNext();) {
146 String intf = (String) it.next();
147 trimmed.add(intf == null ? null : intf.trim());
148 }
149 interfaceTypes = trimmed;
150 }
151 return new AbstractNameQuery(artifact, nameMap, interfaceTypes);
152 }
153
154 public static AbstractNameQuery buildAbstractNameQuery(Artifact configId, String module, String name, String type, String moduleType) {
155 Map nameMap = new HashMap();
156 nameMap.put("name", name);
157 if (type != null) {
158 nameMap.put("j2eeType", type);
159 }
160 if (module != null) {
161 nameMap.put(moduleType, module);
162 }
163 return new AbstractNameQuery(configId, nameMap);
164 }
165
166 public static Class assureInterface(String interfaceName, String superInterfaceName, String interfaceType, ClassLoader cl) throws DeploymentException {
167 if (interfaceName == null || interfaceName.equals("")) {
168 throw new DeploymentException("interface name cannot be blank");
169 }
170 Class clazz;
171 try {
172 clazz = cl.loadClass(interfaceName);
173 } catch (ClassNotFoundException e) {
174 throw new DeploymentException(interfaceType + " interface class not found: " + interfaceName);
175 }
176 if (!clazz.isInterface()) {
177 throw new DeploymentException(interfaceType + " interface is not an interface: " + interfaceName);
178 }
179 Class superInterface;
180 try {
181 superInterface = cl.loadClass(superInterfaceName);
182 } catch (ClassNotFoundException e) {
183 throw new DeploymentException("Class " + superInterfaceName + " could not be loaded");
184 }
185 if (!superInterface.isAssignableFrom(clazz)) {
186 throw new DeploymentException(interfaceType + " interface does not extend " + superInterfaceName + ": " + interfaceName);
187 }
188 return clazz;
189 }
190
191
192 }