You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by da...@apache.org on 2007/01/17 21:03:29 UTC

svn commit: r497146 [2/5] - in /geronimo/server/trunk: ./ assemblies/geronimo-jetty6-jee5/ assemblies/geronimo-jetty6-jee5/src/main/var/config/ assemblies/geronimo-tomcat6-jee5/ assemblies/geronimo-tomcat6-jee5/src/main/var/config/ configs/ configs/jee...

Added: geronimo/server/trunk/modules/geronimo-openejb-builder/src/main/java/org/apache/geronimo/openejb/deployment/SecurityBuilder.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/modules/geronimo-openejb-builder/src/main/java/org/apache/geronimo/openejb/deployment/SecurityBuilder.java?view=auto&rev=497146
==============================================================================
--- geronimo/server/trunk/modules/geronimo-openejb-builder/src/main/java/org/apache/geronimo/openejb/deployment/SecurityBuilder.java (added)
+++ geronimo/server/trunk/modules/geronimo-openejb-builder/src/main/java/org/apache/geronimo/openejb/deployment/SecurityBuilder.java Wed Jan 17 12:03:23 2007
@@ -0,0 +1,255 @@
+/**
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.geronimo.openejb.deployment;
+
+import java.security.Permission;
+import java.security.PermissionCollection;
+import java.security.Permissions;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.Map;
+import javax.security.jacc.EJBMethodPermission;
+import javax.security.jacc.EJBRoleRefPermission;
+
+import org.apache.geronimo.common.DeploymentException;
+import org.apache.geronimo.security.jacc.ComponentPermissions;
+import org.apache.openejb.jee.AssemblyDescriptor;
+import org.apache.openejb.jee.ExcludeList;
+import org.apache.openejb.jee.Method;
+import org.apache.openejb.jee.MethodPermission;
+import org.apache.openejb.jee.SecurityRoleRef;
+
+public class SecurityBuilder {
+    /**
+     * Fill the container moduleBuilder with the security information that it needs
+     * to create the proper interceptors.  A <code>SecurityConfiguration</code>
+     * is also filled with permissions that need to be used to fill the JACC
+     * policy configuration.
+     *
+     * @param notAssigned the set of all possible permissions.  These will be
+     * culled so that all that are left are those that have
+     * not been assigned roles.
+     * @param assemblyDescriptor the assembly descriptor
+     * @param ejbName the name of the EJB
+     * @param securityRoleRefs the EJB's role references
+     * @throws DeploymentException if any constraints are violated
+     */
+    public void addComponentPermissions(String defaultRole,
+            Permissions notAssigned,
+            AssemblyDescriptor assemblyDescriptor,
+            String ejbName,
+            List<SecurityRoleRef> securityRoleRefs,
+            ComponentPermissions componentPermissions) throws DeploymentException {
+
+        PermissionCollection uncheckedPermissions = componentPermissions.getUncheckedPermissions();
+        PermissionCollection excludedPermissions = componentPermissions.getExcludedPermissions();
+        Map rolePermissions = componentPermissions.getRolePermissions();
+
+        //this can occur in an ear when one ejb module has security and one doesn't.  In this case we still need
+        //to make the non-secure one completely unchecked.
+        if (assemblyDescriptor != null) {
+            /**
+             * JACC v1.0 section 3.1.5.1
+             */
+            for (MethodPermission methodPermission : assemblyDescriptor.getMethodPermission()) {
+                List<String> roleNames = methodPermission.getRoleName();
+                boolean unchecked = methodPermission.getUnchecked() != null;
+
+                for (Method method : methodPermission.getMethod()) {
+                    if (!ejbName.equals(method.getEjbName())) {
+                        continue;
+                    }
+
+                    // method name
+                    String methodName = method.getMethodName();
+                    if ("*".equals(methodName)) {
+                        // jacc uses null instead of *
+                        methodName = null;
+                    }
+
+                    // method interface
+                    String methodIntf = method.getMethodIntf().toString();
+
+                    // method parameters
+                    String[] methodParams;
+                    if (method.getMethodParams() != null) {
+                        List<String> paramList = method.getMethodParams().getMethodParam();
+                        methodParams = paramList.toArray(new String[paramList.size()]);
+                    } else {
+                        methodParams = null;
+                    }
+
+                    // create the permission object
+                    EJBMethodPermission permission = new EJBMethodPermission(ejbName, methodName, methodIntf, methodParams);
+                    notAssigned = cullPermissions(notAssigned, permission);
+
+                    // if this is unchecked, mark it as unchecked; otherwise assign the roles
+                    if (unchecked) {
+                        uncheckedPermissions.add(permission);
+                    } else {
+                        for (String roleName : roleNames) {
+                            Permissions permissions = (Permissions) rolePermissions.get(roleName);
+                            if (permissions == null) {
+                                permissions = new Permissions();
+                                rolePermissions.put(roleName, permissions);
+                            }
+                            permissions.add(permission);
+                        }
+                    }
+                }
+
+            }
+
+            /**
+             * JACC v1.0 section 3.1.5.2
+             */
+            ExcludeList excludeList = assemblyDescriptor.getExcludeList();
+            if (excludeList != null) {
+                for (Method method : excludeList.getMethod()) {
+                    if (!ejbName.equals(method.getEjbName())) {
+                        continue;
+                    }
+
+                    // method name
+                    String methodName = method.getMethodName();
+                    // method interface
+                    String methodIntf = method.getMethodIntf().toString();
+
+                    // method parameters
+                    String[] methodParams;
+                    if (method.getMethodParams() != null) {
+                        List<String> paramList = method.getMethodParams().getMethodParam();
+                        methodParams = paramList.toArray(new String[paramList.size()]);
+                    } else {
+                        methodParams = null;
+                    }
+
+                    // create the permission object
+                    EJBMethodPermission permission = new EJBMethodPermission(ejbName, methodName, methodIntf, methodParams);
+
+                    excludedPermissions.add(permission);
+                    notAssigned = cullPermissions(notAssigned, permission);
+                }
+            }
+
+            /**
+             * JACC v1.0 section 3.1.5.3
+             */
+            for (SecurityRoleRef securityRoleRef : securityRoleRefs) {
+                if (securityRoleRef.getRoleLink() == null) {
+                    throw new DeploymentException("Missing role-link");
+                }
+
+                String roleLink = securityRoleRef.getRoleLink();
+
+                PermissionCollection roleLinks = (PermissionCollection) rolePermissions.get(roleLink);
+                if (roleLinks == null) {
+                    roleLinks = new Permissions();
+                    rolePermissions.put(roleLink, roleLinks);
+
+                }
+                roleLinks.add(new EJBRoleRefPermission(ejbName, securityRoleRef.getRoleName()));
+            }
+        }
+
+        /**
+         * EJB v2.1 section 21.3.2
+         * <p/>
+         * It is possible that some methods are not assigned to any security
+         * roles nor contained in the <code>exclude-list</code> element. In
+         * this case, it is the responsibility of the Deployer to assign method
+         * permissions for all of the unspecified methods, either by assigning
+         * them to security roles, or by marking them as <code>unchecked</code>.
+         */
+        PermissionCollection permissions;
+        if (defaultRole == null) {
+            permissions = uncheckedPermissions;
+        } else {
+            permissions = (PermissionCollection) rolePermissions.get(defaultRole);
+            if (permissions == null) {
+                permissions = new Permissions();
+                rolePermissions.put(defaultRole, permissions);
+            }
+        }
+
+        Enumeration e = notAssigned.elements();
+        while (e.hasMoreElements()) {
+            Permission p = (Permission) e.nextElement();
+            permissions.add(p);
+        }
+
+    }
+
+    /**
+     * Generate all the possible permissions for a bean's interface.
+     * <p/>
+     * Method permissions are defined in the deployment descriptor as a binary
+     * relation from the set of security roles to the set of methods of the
+     * home, component, and/or web service endpoint interfaces of session and
+     * entity beans, including all their superinterfaces (including the methods
+     * of the <code>EJBHome</code> and <code>EJBObject</code> interfaces and/or
+     * <code>EJBLocalHome</code> and <code>EJBLocalObject</code> interfaces).
+     *
+     * @param permissions the permission set to be extended
+     * @param ejbName the name of the EJB
+     * @param methodInterface the EJB method interface
+     * @param interfaceClass the class name of the interface to be used to generate the permissions
+     * @param classLoader the class loader to be used in obtaining the interface class
+     */
+    public void addToPermissions(Permissions permissions,
+            String ejbName,
+            String methodInterface,
+            String interfaceClass,
+            ClassLoader classLoader) throws DeploymentException {
+
+        if (interfaceClass == null) {
+            return;
+        }
+
+        try {
+            Class clazz = Class.forName(interfaceClass, false, classLoader);
+            for (java.lang.reflect.Method method : clazz.getMethods()) {
+                permissions.add(new EJBMethodPermission(ejbName, methodInterface, method));
+            }
+        } catch (ClassNotFoundException e) {
+            throw new DeploymentException(e);
+        }
+
+    }
+
+    /**
+     * Removes permissions from <code>toBeChecked</code> that are implied by
+     * <code>permission</code>.
+     *
+     * @param toBeChecked the permissions that are to be checked and possibly culled
+     * @param permission the permission that is to be used for culling
+     * @return the culled set of permissions that are not implied by <code>permission</code>
+     */
+    private Permissions cullPermissions(Permissions toBeChecked, Permission permission) {
+        Permissions result = new Permissions();
+
+        for (Enumeration e = toBeChecked.elements(); e.hasMoreElements();) {
+            Permission test = (Permission) e.nextElement();
+            if (!permission.implies(test)) {
+                result.add(test);
+            }
+        }
+
+        return result;
+    }
+}

Added: geronimo/server/trunk/modules/geronimo-openejb-builder/src/main/java/org/apache/geronimo/openejb/deployment/XmlUtil.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/modules/geronimo-openejb-builder/src/main/java/org/apache/geronimo/openejb/deployment/XmlUtil.java?view=auto&rev=497146
==============================================================================
--- geronimo/server/trunk/modules/geronimo-openejb-builder/src/main/java/org/apache/geronimo/openejb/deployment/XmlUtil.java (added)
+++ geronimo/server/trunk/modules/geronimo-openejb-builder/src/main/java/org/apache/geronimo/openejb/deployment/XmlUtil.java Wed Jan 17 12:03:23 2007
@@ -0,0 +1,355 @@
+/**
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.geronimo.openejb.deployment;
+
+import java.net.URL;
+import java.util.jar.JarFile;
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.ByteArrayOutputStream;
+import javax.xml.bind.ValidationEvent;
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.Unmarshaller;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Marshaller;
+import javax.xml.namespace.QName;
+
+import org.apache.geronimo.openejb.xbeans.ejbjar.OpenejbEjbJarDocument;
+import org.apache.geronimo.openejb.xbeans.ejbjar.OpenejbGeronimoEjbJarType;
+import org.apache.geronimo.deployment.util.DeploymentUtil;
+import org.apache.geronimo.deployment.xmlbeans.XmlBeansUtil;
+import org.apache.geronimo.deployment.xbeans.EnvironmentType;
+import org.apache.geronimo.deployment.xbeans.ArtifactType;
+import org.apache.geronimo.common.DeploymentException;
+import org.apache.geronimo.schema.SchemaConversionUtils;
+import org.apache.geronimo.xbeans.javaee.EjbJarDocument;
+import org.apache.geronimo.xbeans.javaee.EjbJarType;
+import org.apache.xmlbeans.XmlObject;
+import org.apache.xmlbeans.XmlException;
+import org.apache.xmlbeans.XmlCursor;
+import org.apache.xmlbeans.XmlDocumentProperties;
+import org.apache.openejb.jee.EjbJar;
+
+public final class XmlUtil {
+    public static final QName OPENEJBJAR_QNAME = OpenejbEjbJarDocument.type.getDocumentElementName();
+    private static final QName CMP_VERSION = new QName(SchemaConversionUtils.J2EE_NAMESPACE, "cmp-version");
+
+    private XmlUtil() {
+    }
+
+    public static String loadEjbJarXml(URL ejbJarUrl, JarFile moduleFile) {
+        String ejbJarXml;
+        try {
+            if (ejbJarUrl == null) {
+                ejbJarUrl = DeploymentUtil.createJarURL(moduleFile, "META-INF/ejb-jar.xml");
+            }
+
+            // read in the entire specDD as a string, we need this for getDeploymentDescriptor
+            // on the J2ee management object
+            ejbJarXml = DeploymentUtil.readAll(ejbJarUrl);
+            return ejbJarXml;
+        } catch (Exception e) {
+            return null;
+        }
+    }
+
+    @SuppressWarnings({"unchecked"})
+    public static <T> T unmarshal(Class<T> type, String xml) throws DeploymentException {
+        try {
+            JAXBContext ctx = JAXBContext.newInstance(type);
+            Unmarshaller unmarshaller = ctx.createUnmarshaller();
+
+            Object object = unmarshaller.unmarshal(new ByteArrayInputStream(xml.getBytes()));
+            unmarshaller.setEventHandler(new ValidationEventHandler());
+            return (T) object;
+        } catch (JAXBException e) {
+            throw new DeploymentException(e);
+        }
+    }
+
+    public static <T> String marshal(T object) throws DeploymentException {
+        try {
+            JAXBContext ctx = JAXBContext.newInstance(object.getClass());
+            Marshaller marshaller = ctx.createMarshaller();
+            marshaller.setProperty("jaxb.formatted.output", true);
+
+            ByteArrayOutputStream baos = new ByteArrayOutputStream();
+            marshaller.marshal(object, baos);
+
+            String xml = new String(baos.toByteArray());
+            return xml;
+        } catch (JAXBException e) {
+            throw new DeploymentException(e);
+        }
+    }
+
+    public static String loadOpenejbJarXml(XmlObject xmlObject, JarFile moduleFile) throws DeploymentException {
+        // load the openejb-jar.xml from either the supplied plan or from the earFile
+        try {
+            String openejbJarXml;
+            if (xmlObject instanceof XmlObject) {
+                openejbJarXml = xmlObject.xmlText();
+            } else {
+                if (xmlObject != null) {
+                    xmlObject = XmlBeansUtil.parse(((File) xmlObject).toURL(), XmlUtil.class.getClassLoader());
+                    openejbJarXml = xmlObject.xmlText();
+                } else {
+                    URL path = DeploymentUtil.createJarURL(moduleFile, "META-INF/openejb-jar.xml");
+                    openejbJarXml = DeploymentUtil.readAll(path);
+                }
+            }
+            return openejbJarXml;
+        } catch (IOException e) {
+            return null;
+        } catch (XmlException e) {
+            throw new DeploymentException(e);
+        }
+    }
+
+    public static EjbJarType convertToXmlbeans(EjbJar ejbJar) throws DeploymentException {
+        //
+        // it would be nice if Jaxb had a way to convert the object to a
+        // sax reader that could be fed directly into xmlbeans
+        //
+
+        // marshal to xml
+        String xml = marshal(ejbJar);
+        try {
+            // parse the xml
+            EjbJarDocument ejbJarDoc = convertToEJBSchema(XmlBeansUtil.parse(xml));
+            EjbJarType ejbJarType = ejbJarDoc.getEjbJar();
+            return ejbJarType;
+        } catch (XmlException e) {
+            throw new DeploymentException("Error parsing ejb-jar.xml", e);
+        }
+
+    }
+    public static OpenejbGeronimoEjbJarType loadGeronimOpenejbJar(Object plan, JarFile moduleFile, boolean standAlone, String targetPath, EjbJar ejbJar) throws DeploymentException {
+        OpenejbGeronimoEjbJarType openejbJar;
+        XmlObject rawPlan = null;
+        try {
+            // load the openejb-jar.xml from either the supplied plan or from the earFile
+            try {
+                if (plan instanceof XmlObject) {
+                    rawPlan = (XmlObject) plan;
+                } else {
+                    if (plan != null) {
+                        OpenejbEjbJarDocument document = (OpenejbEjbJarDocument) XmlBeansUtil.parse(((File) plan).toURL(), XmlUtil.class.getClassLoader());
+                        rawPlan = document.getEjbJar();
+                    } else {
+                        URL path = DeploymentUtil.createJarURL(moduleFile, "META-INF/geronimo-openejb.xml");
+                        rawPlan = XmlBeansUtil.parse(path, XmlUtil.class.getClassLoader());
+                    }
+                }
+            } catch (IOException e) {
+                //no plan, create a default
+            }
+
+            // if we got one extract, adjust, and validate it otherwise create a default one
+            if (rawPlan != null) {
+                openejbJar = (OpenejbGeronimoEjbJarType) SchemaConversionUtils.fixGeronimoSchema(rawPlan, OPENEJBJAR_QNAME, OpenejbGeronimoEjbJarType.type);
+            } else {
+                String path;
+                if (standAlone) {
+                    // default configId is based on the moduleFile name
+                    path = new File(moduleFile.getName()).getName();
+                } else {
+                    // default configId is based on the module uri from the application.xml
+                    path = targetPath;
+                }
+                openejbJar = createDefaultPlan(path, ejbJar);
+            }
+        } catch (XmlException e) {
+            throw new DeploymentException(e);
+        }
+        return openejbJar;
+    }
+
+    public static OpenejbGeronimoEjbJarType createDefaultPlan(String name, EjbJar ejbJar) {
+        String id = ejbJar.getId();
+        if (id == null) {
+            id = name;
+            if (id.endsWith(".jar")) {
+                id = id.substring(0, id.length() - 4);
+            }
+            if (id.endsWith("/")) {
+                id = id.substring(0, id.length() - 1);
+            }
+        }
+
+        OpenejbGeronimoEjbJarType openejbEjbJar = OpenejbGeronimoEjbJarType.Factory.newInstance();
+        EnvironmentType environmentType = openejbEjbJar.addNewEnvironment();
+        ArtifactType artifactType = environmentType.addNewModuleId();
+        artifactType.setArtifactId(id);
+        return openejbEjbJar;
+    }
+
+    public static String getJ2eeStringValue(org.apache.geronimo.xbeans.javaee.String string) {
+        if (string == null) {
+            return null;
+        }
+        return string.getStringValue();
+    }
+
+    public static class ValidationEventHandler implements javax.xml.bind.ValidationEventHandler {
+        public boolean handleEvent(ValidationEvent validationEvent) {
+            System.out.println(validationEvent.getMessage());
+            return true;
+        }
+    }
+
+
+    // coerce to newest spec... this shouldn't be necessary as the jaxb tree always creates the newest spec
+    public static EjbJarDocument convertToEJBSchema(XmlObject xmlObject) throws XmlException {
+        if (EjbJarDocument.type.equals(xmlObject.schemaType())) {
+//            XmlBeansUtil.validateDD(xmlObject);
+            return (EjbJarDocument) xmlObject;
+        }
+        XmlCursor cursor = xmlObject.newCursor();
+        XmlCursor moveable = xmlObject.newCursor();
+        //cursor is intially located before the logical STARTDOC token
+        try {
+            cursor.toFirstChild();
+            if (EjbJarDocument.type.getDocumentElementName().getNamespaceURI().equals(cursor.getName().getNamespaceURI())) {
+                XmlObject result = xmlObject.changeType(EjbJarDocument.type);
+                // XmlBeansUtil.validateDD(result);
+                return (EjbJarDocument) result;
+            }
+            // deployment descriptor is probably in EJB 1.1 or 2.0 format
+            XmlDocumentProperties xmlDocumentProperties = cursor.documentProperties();
+            String publicId = xmlDocumentProperties.getDoctypePublicId();
+            String cmpVersion;
+            if ("-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 1.1//EN".equals(publicId)) {
+                cmpVersion = "1.x";
+            } else if ("-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN".equals(publicId)) {
+                cmpVersion = null;//2.x is the default "2.x";
+            } else {
+                throw new XmlException("Unrecognized document type: " + publicId);
+            }
+            String schemaLocationURL = "http://java.sun.com/xml/ns/j2ee/ejb-jar_2_1.xsd";
+            String version = "2.1";
+            SchemaConversionUtils.convertToSchema(cursor, SchemaConversionUtils.J2EE_NAMESPACE, schemaLocationURL, version);
+            //play with message-driven
+            cursor.toStartDoc();
+            convertBeans(cursor, moveable, cmpVersion);
+        } finally {
+            cursor.dispose();
+            moveable.dispose();
+        }
+        XmlObject result = xmlObject.changeType(EjbJarDocument.type);
+        if (result != null) {
+            XmlBeansUtil.validateDD(result);
+            return (EjbJarDocument) result;
+        }
+        XmlBeansUtil.validateDD(xmlObject);
+        return (EjbJarDocument) xmlObject;
+    }
+
+    private static void convertBeans(XmlCursor cursor, XmlCursor moveable, String cmpVersion) {
+        cursor.toChild(SchemaConversionUtils.J2EE_NAMESPACE, "ejb-jar");
+        cursor.toChild(SchemaConversionUtils.J2EE_NAMESPACE, "enterprise-beans");
+        if (cursor.toFirstChild()) {
+            //there's at least one ejb...
+            do {
+                cursor.push();
+                String type = cursor.getName().getLocalPart();
+                if ("session".equals(type)) {
+                    cursor.toChild(SchemaConversionUtils.J2EE_NAMESPACE, "transaction-type");
+                    cursor.toNextSibling();
+                    SchemaConversionUtils.convertToJNDIEnvironmentRefsGroup(SchemaConversionUtils.J2EE_NAMESPACE, cursor, moveable);
+                } else if ("entity".equals(type)) {
+                    cursor.toChild(SchemaConversionUtils.J2EE_NAMESPACE, "persistence-type");
+                    String persistenceType = cursor.getTextValue();
+                    //reentrant is the last required tag before jndiEnvironmentRefsGroup
+                    cursor.toNextSibling(SchemaConversionUtils.J2EE_NAMESPACE, "reentrant");
+                    //Convert 2.0 True/False to true/false for 2.1
+                    cursor.setTextValue(cursor.getTextValue().toLowerCase());
+                    if (cmpVersion != null && !cursor.toNextSibling(CMP_VERSION) && "Container".equals(persistenceType)) {
+                        cursor.toNextSibling();
+                        cursor.insertElementWithText(CMP_VERSION, cmpVersion);
+                    }
+
+                    cursor.toNextSibling(SchemaConversionUtils.J2EE_NAMESPACE, "abstract-schema-name");
+                    while (cursor.toNextSibling(SchemaConversionUtils.J2EE_NAMESPACE, "cmp-field")) {
+                    }
+                    cursor.toNextSibling(SchemaConversionUtils.J2EE_NAMESPACE, "primkey-field");
+                    cursor.toNextSibling();
+                    SchemaConversionUtils.convertToJNDIEnvironmentRefsGroup(SchemaConversionUtils.J2EE_NAMESPACE, cursor, moveable);
+                } else if ("message-driven".equals(type)) {
+                    cursor.toFirstChild();
+                    if (cursor.toNextSibling(SchemaConversionUtils.J2EE_NAMESPACE, "messaging-type")) {
+                        cursor.toNextSibling(SchemaConversionUtils.J2EE_NAMESPACE, "transaction-type");
+                    } else {
+                        cursor.toNextSibling(SchemaConversionUtils.J2EE_NAMESPACE, "transaction-type");
+                        //insert messaging-type (introduced in EJB 2.1 spec) before transaction-type
+                        cursor.insertElementWithText("messaging-type", SchemaConversionUtils.J2EE_NAMESPACE, "javax.jms.MessageListener");
+                        //cursor still on transaction-type
+                    }
+                    if (!cursor.toNextSibling(SchemaConversionUtils.J2EE_NAMESPACE, "activation-config")) {
+                        //skip transaction-type
+                        cursor.toNextSibling();
+                        //convert EJB 2.0 elements to activation-config-properties.
+                        moveable.toCursor(cursor);
+                        cursor.push();
+                        cursor.beginElement("activation-config", SchemaConversionUtils.J2EE_NAMESPACE);
+                        boolean hasProperties = addActivationConfigProperty(moveable, cursor, "message-selector", "messageSelector");
+                        hasProperties |= addActivationConfigProperty(moveable, cursor, "acknowledge-mode", "acknowledgeMode");
+                        if (new QName(SchemaConversionUtils.J2EE_NAMESPACE, "message-driven-destination").equals(moveable.getName()) ||
+                                moveable.toNextSibling(SchemaConversionUtils.J2EE_NAMESPACE, "message-driven-destination")) {
+                            moveable.push();
+                            moveable.toFirstChild();
+                            hasProperties |= addActivationConfigProperty(moveable, cursor, "destination-type", "destinationType");
+                            hasProperties |= addActivationConfigProperty(moveable, cursor, "subscription-durability", "subscriptionDurability");
+                            moveable.pop();
+                            moveable.removeXml();
+                        }
+                        cursor.pop();
+                        if (!hasProperties) {
+                            //the activation-config element that we created is empty so delete it
+                            cursor.toPrevSibling();
+                            cursor.removeXml();
+                            //cursor should now be at first element in JNDIEnvironmentRefsGroup
+                        }
+                    } else {
+                        //cursor pointing at activation-config
+                        cursor.toNextSibling();
+                        //cursor should now be at first element in JNDIEnvironmentRefsGroup
+                    }
+                    SchemaConversionUtils.convertToJNDIEnvironmentRefsGroup(SchemaConversionUtils.J2EE_NAMESPACE, cursor, moveable);
+                }
+                cursor.pop();
+            } while (cursor.toNextSibling());
+        }
+    }
+
+    private static boolean addActivationConfigProperty(XmlCursor moveable, XmlCursor cursor, String elementName, String propertyName) {
+        QName name = new QName(SchemaConversionUtils.J2EE_NAMESPACE, elementName);
+        if (name.equals(moveable.getName()) || moveable.toNextSibling(name)) {
+            cursor.push();
+            cursor.beginElement("activation-config-property", SchemaConversionUtils.J2EE_NAMESPACE);
+            cursor.insertElementWithText("activation-config-property-name", SchemaConversionUtils.J2EE_NAMESPACE, propertyName);
+            cursor.insertElementWithText("activation-config-property-value", SchemaConversionUtils.J2EE_NAMESPACE, moveable.getTextValue());
+            moveable.removeXml();
+            cursor.pop();
+            cursor.toNextSibling();
+            return true;
+        }
+        return false;
+    }
+}

Added: geronimo/server/trunk/modules/geronimo-openejb-builder/src/main/java/org/apache/geronimo/openejb/deployment/ejbref/AbstractEjbRefBuilder.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/modules/geronimo-openejb-builder/src/main/java/org/apache/geronimo/openejb/deployment/ejbref/AbstractEjbRefBuilder.java?view=auto&rev=497146
==============================================================================
--- geronimo/server/trunk/modules/geronimo-openejb-builder/src/main/java/org/apache/geronimo/openejb/deployment/ejbref/AbstractEjbRefBuilder.java (added)
+++ geronimo/server/trunk/modules/geronimo-openejb-builder/src/main/java/org/apache/geronimo/openejb/deployment/ejbref/AbstractEjbRefBuilder.java Wed Jan 17 12:03:23 2007
@@ -0,0 +1,233 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.geronimo.openejb.deployment.ejbref;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+import javax.naming.Reference;
+
+import org.apache.geronimo.common.DeploymentException;
+import org.apache.geronimo.common.UnresolvedEJBRefException;
+import org.apache.geronimo.gbean.AbstractName;
+import org.apache.geronimo.gbean.AbstractNameQuery;
+import org.apache.geronimo.gbean.GBeanData;
+import org.apache.geronimo.j2ee.j2eeobjectnames.NameFactory;
+import org.apache.geronimo.kernel.GBeanNotFoundException;
+import org.apache.geronimo.kernel.config.Configuration;
+import org.apache.geronimo.kernel.repository.Artifact;
+import org.apache.geronimo.kernel.repository.Environment;
+import org.apache.geronimo.naming.deployment.AbstractNamingBuilder;
+import org.apache.geronimo.openejb.EjbReference;
+import org.apache.geronimo.openejb.deployment.EjbInterface;
+import org.apache.openejb.RpcEjbDeployment;
+
+/**
+ * @version $Rev: 451417 $ $Date: 2006-09-29 13:13:22 -0700 (Fri, 29 Sep 2006) $
+ */
+public abstract class AbstractEjbRefBuilder extends AbstractNamingBuilder {
+    private final static Map<String, String> STATELESS = Collections.singletonMap(NameFactory.J2EE_TYPE, NameFactory.STATELESS_SESSION_BEAN);
+    private final static Map<String, String> STATEFUL = Collections.singletonMap(NameFactory.J2EE_TYPE, NameFactory.STATEFUL_SESSION_BEAN);
+    private final static Map<String, String> ENTITY = Collections.singletonMap(NameFactory.J2EE_TYPE, NameFactory.ENTITY_BEAN);
+
+    protected AbstractEjbRefBuilder(Environment defaultEnvironment) {
+        super(defaultEnvironment);
+    }
+
+    protected Reference createEjbRef(String refName, Configuration configuration, String name, String requiredModule, String optionalModule, AbstractNameQuery query, boolean isSession, String homeInterface, String businessInterface, boolean remote) throws DeploymentException {
+        AbstractNameQuery match = getEjbRefQuery(refName, configuration, name, requiredModule, optionalModule, query, isSession, homeInterface, businessInterface, remote);
+        return new EjbReference(configuration.getId(), match, remote);
+    }
+
+    protected AbstractNameQuery getEjbRefQuery(String refName, Configuration configuration, String name, String requiredModule, String optionalModule, AbstractNameQuery query, boolean isSession, String homeInterface, String businessInterface, boolean remote) throws DeploymentException {
+        AbstractNameQuery match;
+        if (query != null) {
+            if (remote) {
+                checkRemoteProxyInfo(query, homeInterface, businessInterface, configuration);
+            } else {
+                checkLocalProxyInfo(query, homeInterface, businessInterface, configuration);
+            }
+            match = new AbstractNameQuery(query.getArtifact(), query.getName(), RpcEjbDeployment.class.getName());
+        } else if (name != null) {
+            match = getMatch(refName, configuration, name, requiredModule, remote, isSession, homeInterface, businessInterface);
+        } else {
+            match = getImplicitMatch(refName, configuration, optionalModule, remote, isSession, homeInterface, businessInterface);
+        }
+        return match;
+    }
+
+    private AbstractNameQuery getMatch(String refName, Configuration context, String name, String module, boolean isRemote, boolean isSession, String home, String remote) throws DeploymentException {
+        Map<String, String> nameQuery = new HashMap<String, String>();
+        nameQuery.put(NameFactory.J2EE_NAME, name);
+        if (module != null) {
+            nameQuery.put(NameFactory.EJB_MODULE, module);
+        }
+        Artifact id = context.getId();
+        Collection<AbstractName> matches = getMatchesFromName(isSession, nameQuery, context, id, isRemote, home, remote);
+        if (matches.isEmpty()) {
+            matches = getMatchesFromName(isSession, nameQuery, context, null, isRemote, home, remote);
+        }
+        if (matches.isEmpty()) {
+            throw new UnresolvedEJBRefException(refName, !isRemote, isSession, home, remote, false);
+        }
+        AbstractName match;
+        if (matches.size() == 1) {
+            match = matches.iterator().next();
+        } else {
+            throw new UnresolvedEJBRefException(refName, !isRemote, isSession, home, remote, matches.size() > 0);
+        }
+        return new AbstractNameQuery(stripVersion(match.getArtifact()), match.getName(), RpcEjbDeployment.class.getName());
+    }
+
+    private Collection<AbstractName> getMatchesFromName(boolean isSession, Map<String, String> nameQuery, Configuration context, Artifact id, boolean isRemote, String home, String remote) {
+        Set<GBeanData> gbeanDatas = new HashSet<GBeanData>();
+        if (isSession) {
+            Map<String, String> q = new HashMap<String, String>(nameQuery);
+            q.putAll(STATELESS);
+            gbeanDatas.addAll(findGBeanDatas(context, id, q));
+
+            q = new HashMap<String, String>(nameQuery);
+            q.putAll(STATEFUL);
+            gbeanDatas.addAll(findGBeanDatas(context, id, q));
+        } else {
+            Map<String, String> q = new HashMap<String, String>(nameQuery);
+            q.putAll(ENTITY);
+            gbeanDatas.addAll(findGBeanDatas(context, id, q));
+        }
+
+        Collection<AbstractName> matches = new ArrayList<AbstractName>();
+        for (GBeanData data : gbeanDatas) {
+            if (matchesProxyInfo(data, isRemote, home, remote)) {
+                matches.add(data.getAbstractName());
+            }
+        }
+        return matches;
+    }
+
+    @SuppressWarnings({"unchecked"})
+    private Collection<GBeanData> findGBeanDatas(Configuration context, Artifact id, Map<String, String> q) {
+        return context.findGBeanDatas(Collections.singleton(new AbstractNameQuery(id, q, RpcEjbDeployment.class.getName())));
+    }
+
+    private AbstractNameQuery getImplicitMatch(String refName, Configuration context, String module, boolean isRemote, boolean isSession, String home, String remote) throws DeploymentException {
+        Collection<AbstractName> matches = getMatchesFromName(isSession, Collections.<String, String>emptyMap(), context, context.getId(), isRemote, home, remote);
+        if (matches.isEmpty()) {
+            matches = getMatchesFromName(isSession, Collections.<String, String>emptyMap(), context, null, isRemote, home, remote);
+        }
+        if (matches.isEmpty()) {
+            throw new UnresolvedEJBRefException(refName, false, isSession, home, remote, false);
+        }
+        AbstractName match;
+        if (matches.size() == 1) {
+            match = matches.iterator().next();
+        } else {
+            for (Iterator<AbstractName> iterator = matches.iterator(); iterator.hasNext();) {
+                AbstractName objectName = iterator.next();
+                if (module != null && !(objectName.getName().get(NameFactory.EJB_MODULE).equals(module))) {
+                    iterator.remove();
+                }
+            }
+            if (matches.size() == 1) {
+                match = matches.iterator().next();
+            } else {
+                throw new UnresolvedEJBRefException(refName, false, isSession, home, remote, matches.size() > 0);
+            }
+        }
+        return new AbstractNameQuery(match);
+    }
+
+    private boolean matchesProxyInfo(GBeanData data, boolean isRemote, String home, String remote) {
+        if (isRemote) {
+            return home.equals(getHomeInterface(data)) && remote.equals(getRemoteInterface(data));
+        } else {
+            return home.equals(getLocalHomeInterface(data)) && remote.equals(getLocalInterface(data));
+        }
+    }
+
+    private void checkLocalProxyInfo(AbstractNameQuery query, String expectedLocalHome, String expectedLocal, Configuration configuration) throws DeploymentException {
+        try {
+            GBeanData data = configuration.findGBeanData(query);
+
+            String actualLocalHome = getLocalHomeInterface(data);
+            String actualLocal = getLocalInterface(data);
+            if (actualLocalHome == null || actualLocal == null) {
+                // EJBs like the MEJB don't have interfaces declared in the gbean data
+                return;
+            }
+
+            if (!expectedLocalHome.equals(actualLocalHome) || !expectedLocal.equals(actualLocal)) {
+                throw new DeploymentException("Reference interfaces do not match bean interfaces:\n" +
+                        "reference localHome: " + expectedLocalHome + "\n" +
+                        "ejb localHome: " + actualLocalHome + "\n" +
+                        "reference local: " + expectedLocal + "\n" +
+                        "ejb local: " + getLocalInterface(data));
+            }
+        } catch (GBeanNotFoundException e) {
+            throw new DeploymentException("Could not locate ejb matching " + query + " in configuration " + configuration.getId());
+        }
+    }
+
+    private void checkRemoteProxyInfo(AbstractNameQuery query, String expectedHome, String expectedRemote, Configuration configuration) throws DeploymentException {
+        try {
+            GBeanData data = configuration.findGBeanData(query);
+
+            String actualHome = getHomeInterface(data);
+            String actualRemote = getRemoteInterface(data);
+            if (actualHome == null || actualRemote == null) {
+                // EJBs like the MEJB don't have interfaces declared in the gbean data
+                return;
+            }
+
+            if (!expectedHome.equals(actualHome) || !expectedRemote.equals(actualRemote)) {
+                throw new DeploymentException("Reference interfaces do not match bean interfaces:\n" +
+                        "reference home: " + expectedHome + "\n" +
+                        "ejb home: " + actualHome + "\n" +
+                        "reference remote: " + expectedRemote + "\n" +
+                        "ejb remote: " + actualRemote);
+            }
+        } catch (GBeanNotFoundException e) {
+            // we can't verify remote ejb refs if the GBean can't be found
+            // could be a reference to an ejb in another application that hasn't been loaded yet
+        }
+    }
+
+    private static Artifact stripVersion(Artifact artifact) {
+        return new Artifact(artifact.getGroupId(), artifact.getArtifactId(), (String) null, artifact.getType());
+    }
+
+    private static String getHomeInterface(GBeanData data) {
+        return (String) data.getAttribute(EjbInterface.HOME.getAttributeName());
+    }
+
+    private static String getRemoteInterface(GBeanData data) {
+        return (String) data.getAttribute(EjbInterface.REMOTE.getAttributeName());
+    }
+
+    private static String getLocalHomeInterface(GBeanData data) {
+        return (String) data.getAttribute(EjbInterface.LOCAL_HOME.getAttributeName());
+    }
+
+    private static String getLocalInterface(GBeanData data) {
+        return (String) data.getAttribute(EjbInterface.LOCAL.getAttributeName());
+    }
+}

Added: geronimo/server/trunk/modules/geronimo-openejb-builder/src/main/java/org/apache/geronimo/openejb/deployment/ejbref/ClientEjbRefBuilder.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/modules/geronimo-openejb-builder/src/main/java/org/apache/geronimo/openejb/deployment/ejbref/ClientEjbRefBuilder.java?view=auto&rev=497146
==============================================================================
--- geronimo/server/trunk/modules/geronimo-openejb-builder/src/main/java/org/apache/geronimo/openejb/deployment/ejbref/ClientEjbRefBuilder.java (added)
+++ geronimo/server/trunk/modules/geronimo-openejb-builder/src/main/java/org/apache/geronimo/openejb/deployment/ejbref/ClientEjbRefBuilder.java Wed Jan 17 12:03:23 2007
@@ -0,0 +1,80 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.geronimo.openejb.deployment.ejbref;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import javax.naming.Reference;
+
+import org.apache.geronimo.common.DeploymentException;
+import org.apache.geronimo.gbean.AbstractNameQuery;
+import org.apache.geronimo.gbean.GBeanData;
+import org.apache.geronimo.gbean.GBeanInfo;
+import org.apache.geronimo.gbean.GBeanInfoBuilder;
+import org.apache.geronimo.j2ee.j2eeobjectnames.NameFactory;
+import org.apache.geronimo.kernel.GBeanNotFoundException;
+import org.apache.geronimo.kernel.config.Configuration;
+import org.apache.geronimo.kernel.repository.Environment;
+import org.apache.geronimo.openejb.ClientEjbReference;
+
+/**
+ * @version $Rev: 451417 $ $Date: 2006-09-29 13:13:22 -0700 (Fri, 29 Sep 2006) $
+ */
+public class ClientEjbRefBuilder extends RemoteEjbRefBuilder {
+    private final URI uri;
+
+    public ClientEjbRefBuilder(Environment defaultEnvironment, String[] eeNamespaces, String host, int port) throws URISyntaxException {
+        super(defaultEnvironment, eeNamespaces);
+        uri = new URI("ejb", null, host, port, null, null, null);
+    }
+
+    protected Reference createEjbRef(String refName, Configuration configuration, String name, String requiredModule, String optionalModule, AbstractNameQuery query, boolean isSession, String homeInterface, String businessInterface, boolean remote) throws DeploymentException {
+        AbstractNameQuery match = getEjbRefQuery(refName, configuration, name, requiredModule, optionalModule, query, isSession, homeInterface, businessInterface, remote);
+
+        GBeanData data = null;
+        try {
+            data = configuration.findGBeanData(match);
+        } catch (GBeanNotFoundException ignored) {
+            throw new DeploymentException("Ejb not found for ejb-ref " + refName);
+        }
+
+        String deploymentId = (String) data.getAttribute("deploymentId");
+        if (deploymentId == null) {
+            throw new DeploymentException(("EjbDeployment GBeanData does not contain a \"deploymentId\" attribute"));
+        }
+        return new ClientEjbReference(uri.toString(), deploymentId);
+    }
+
+    public static final GBeanInfo GBEAN_INFO;
+
+    static {
+        GBeanInfoBuilder infoBuilder = GBeanInfoBuilder.createStatic(ClientEjbRefBuilder.class, RemoteEjbRefBuilder.GBEAN_INFO, NameFactory.MODULE_BUILDER);
+
+        infoBuilder.addAttribute("host", String.class, true);
+        infoBuilder.addAttribute("port", int.class, true);
+
+        infoBuilder.setConstructor(new String[]{"defaultEnvironment", "eeNamespaces", "host", "port"});
+
+        GBEAN_INFO = infoBuilder.getBeanInfo();
+    }
+
+    public static GBeanInfo getGBeanInfo() {
+        return GBEAN_INFO;
+    }
+
+}

Added: geronimo/server/trunk/modules/geronimo-openejb-builder/src/main/java/org/apache/geronimo/openejb/deployment/ejbref/LocalEjbRefBuilder.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/modules/geronimo-openejb-builder/src/main/java/org/apache/geronimo/openejb/deployment/ejbref/LocalEjbRefBuilder.java?view=auto&rev=497146
==============================================================================
--- geronimo/server/trunk/modules/geronimo-openejb-builder/src/main/java/org/apache/geronimo/openejb/deployment/ejbref/LocalEjbRefBuilder.java (added)
+++ geronimo/server/trunk/modules/geronimo-openejb-builder/src/main/java/org/apache/geronimo/openejb/deployment/ejbref/LocalEjbRefBuilder.java Wed Jan 17 12:03:23 2007
@@ -0,0 +1,169 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.geronimo.openejb.deployment.ejbref;
+
+import java.net.URI;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import javax.naming.Reference;
+import javax.xml.namespace.QName;
+
+import org.apache.geronimo.common.DeploymentException;
+import org.apache.geronimo.gbean.AbstractNameQuery;
+import org.apache.geronimo.gbean.GBeanInfo;
+import org.apache.geronimo.gbean.GBeanInfoBuilder;
+import org.apache.geronimo.j2ee.deployment.Module;
+import org.apache.geronimo.j2ee.j2eeobjectnames.NameFactory;
+import org.apache.geronimo.kernel.config.Configuration;
+import org.apache.geronimo.kernel.repository.Environment;
+import org.apache.geronimo.xbeans.geronimo.naming.GerEjbLocalRefDocument;
+import org.apache.geronimo.xbeans.geronimo.naming.GerEjbLocalRefType;
+import org.apache.geronimo.xbeans.geronimo.naming.GerPatternType;
+import org.apache.geronimo.xbeans.javaee.EjbLocalRefType;
+import org.apache.xmlbeans.QNameSet;
+import org.apache.xmlbeans.XmlObject;
+
+/**
+ * @version $Revision: 470469 $ $Date: 2006-11-02 10:43:34 -0800 (Thu, 02 Nov 2006) $
+ */
+public class LocalEjbRefBuilder extends AbstractEjbRefBuilder {
+    private static final QName GER_EJB_LOCAL_REF_QNAME = GerEjbLocalRefDocument.type.getDocumentElementName();
+    private static final QNameSet GER_EJB_LOCAL_REF_QNAME_SET = QNameSet.singleton(GER_EJB_LOCAL_REF_QNAME);
+
+    private final QNameSet ejbLocalRefQNameSet;
+
+    public LocalEjbRefBuilder(Environment defaultEnvironment, String[] eeNamespaces) {
+        super(defaultEnvironment);
+        ejbLocalRefQNameSet = buildQNameSet(eeNamespaces, "ejb-local-ref");
+    }
+
+    public QNameSet getSpecQNameSet() {
+        return ejbLocalRefQNameSet;
+    }
+
+    public QNameSet getPlanQNameSet() {
+        return GER_EJB_LOCAL_REF_QNAME_SET;
+    }
+
+    protected boolean willMergeEnvironment(XmlObject specDD, XmlObject plan) {
+        return specDD.selectChildren(ejbLocalRefQNameSet).length > 0;
+    }
+
+    public void buildNaming(XmlObject specDD, XmlObject plan, Configuration localConfiguration, Configuration remoteConfiguration, Module module, Map componentContext) throws DeploymentException {
+        List<EjbLocalRefType> ejbLocalRefs = convert(specDD.selectChildren(ejbLocalRefQNameSet), J2EE_CONVERTER, EjbLocalRefType.class, EjbLocalRefType.type);
+        XmlObject[] gerEjbLocalRefsUntyped = plan == null ? NO_REFS : plan.selectChildren(GER_EJB_LOCAL_REF_QNAME_SET);
+        Map<String, GerEjbLocalRefType> ejbLocalRefMap = mapEjbLocalRefs(gerEjbLocalRefsUntyped);
+        ClassLoader cl = module.getEarContext().getClassLoader();
+
+        for (EjbLocalRefType ejbLocalRef : ejbLocalRefs) {
+            String ejbRefName = getStringValue(ejbLocalRef.getEjbRefName());
+            GerEjbLocalRefType localRef = ejbLocalRefMap.get(ejbRefName);
+
+            Reference ejbReference = createEjbLocalRef(remoteConfiguration, module.getModuleURI(), ejbLocalRef, localRef, cl);
+            if (ejbReference != null) {
+                //noinspection unchecked
+                getJndiContextMap(componentContext).put(ENV + ejbRefName, ejbReference);
+            }
+        }
+    }
+
+    private Reference createEjbLocalRef(Configuration ejbContext, URI moduleURI, EjbLocalRefType ejbLocalRef, GerEjbLocalRefType localRef, ClassLoader cl) throws DeploymentException {
+        String refName = getStringValue(ejbLocalRef.getEjbRefName());
+
+        String local = getStringValue(ejbLocalRef.getLocal());
+        try {
+            assureEJBLocalObjectInterface(local, cl);
+        } catch (DeploymentException e) {
+            throw new DeploymentException("Error processing 'local' element for EJB Local Reference '" + refName + "' for module '" + moduleURI + "': " + e.getMessage());
+        }
+
+        String localHome = getStringValue(ejbLocalRef.getLocalHome());
+        try {
+            assureEJBLocalHomeInterface(localHome, cl);
+        } catch (DeploymentException e) {
+            throw new DeploymentException("Error processing 'local-home' element for EJB Local Reference '" + refName + "' for module '" + moduleURI + "': " + e.getMessage());
+        }
+
+        boolean isSession = "Session".equals(getStringValue(ejbLocalRef.getEjbRefType()));
+
+        String ejbLink = null;
+        if (localRef != null && localRef.isSetEjbLink()) {
+            ejbLink = localRef.getEjbLink();
+        } else if (ejbLocalRef.isSetEjbLink()) {
+            ejbLink = getStringValue(ejbLocalRef.getEjbLink());
+        }
+
+        String optionalModule;
+        if (moduleURI == null) {
+            optionalModule = null;
+        } else {
+            optionalModule = moduleURI.toString();
+        }
+
+        String requiredModule = null;
+        AbstractNameQuery containerQuery = null;
+        if (ejbLink != null) {
+            String[] bits = ejbLink.split("#");
+            if (bits.length == 2) {
+                //look only in specified module.
+                requiredModule = bits[0];
+                ejbLink = bits[1];
+            }
+        } else if (localRef != null) {
+            GerPatternType patternType = localRef.getPattern();
+            containerQuery = buildAbstractNameQuery(patternType, null, NameFactory.EJB_MODULE, null);
+        }
+        return createEjbRef(refName, ejbContext, ejbLink, requiredModule, optionalModule, containerQuery, isSession, localHome, local, false);
+    }
+
+    private static Map<String, GerEjbLocalRefType> mapEjbLocalRefs(XmlObject[] refs) {
+        Map<String, GerEjbLocalRefType> refMap = new HashMap<String, GerEjbLocalRefType>();
+        if (refs != null) {
+            for (int i = 0; i < refs.length; i++) {
+                GerEjbLocalRefType ref = (GerEjbLocalRefType) refs[i].copy().changeType(GerEjbLocalRefType.type);
+                refMap.put(ref.getRefName().trim(), ref);
+            }
+        }
+        return refMap;
+    }
+
+    public static Class assureEJBLocalObjectInterface(String local, ClassLoader cl) throws DeploymentException {
+        return assureInterface(local, "javax.ejb.EJBLocalObject", "Local", cl);
+    }
+
+    public static Class assureEJBLocalHomeInterface(String localHome, ClassLoader cl) throws DeploymentException {
+        return assureInterface(localHome, "javax.ejb.EJBLocalHome", "LocalHome", cl);
+    }
+
+    public static final GBeanInfo GBEAN_INFO;
+
+    static {
+        GBeanInfoBuilder infoBuilder = GBeanInfoBuilder.createStatic(LocalEjbRefBuilder.class, NameFactory.MODULE_BUILDER);
+        infoBuilder.addAttribute("eeNamespaces", String[].class, true, true);
+        infoBuilder.addAttribute("defaultEnvironment", Environment.class, true, true);
+
+        infoBuilder.setConstructor(new String[]{"defaultEnvironment", "eeNamespaces"});
+
+        GBEAN_INFO = infoBuilder.getBeanInfo();
+    }
+
+    public static GBeanInfo getGBeanInfo() {
+        return GBEAN_INFO;
+    }
+}

Added: geronimo/server/trunk/modules/geronimo-openejb-builder/src/main/java/org/apache/geronimo/openejb/deployment/ejbref/RemoteEjbRefBuilder.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/modules/geronimo-openejb-builder/src/main/java/org/apache/geronimo/openejb/deployment/ejbref/RemoteEjbRefBuilder.java?view=auto&rev=497146
==============================================================================
--- geronimo/server/trunk/modules/geronimo-openejb-builder/src/main/java/org/apache/geronimo/openejb/deployment/ejbref/RemoteEjbRefBuilder.java (added)
+++ geronimo/server/trunk/modules/geronimo-openejb-builder/src/main/java/org/apache/geronimo/openejb/deployment/ejbref/RemoteEjbRefBuilder.java Wed Jan 17 12:03:23 2007
@@ -0,0 +1,185 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.geronimo.openejb.deployment.ejbref;
+
+import java.net.URI;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import javax.naming.Reference;
+import javax.xml.namespace.QName;
+
+import org.apache.geronimo.common.DeploymentException;
+import org.apache.geronimo.gbean.AbstractNameQuery;
+import org.apache.geronimo.gbean.GBeanInfo;
+import org.apache.geronimo.gbean.GBeanInfoBuilder;
+import org.apache.geronimo.j2ee.deployment.Module;
+import org.apache.geronimo.j2ee.j2eeobjectnames.NameFactory;
+import org.apache.geronimo.kernel.config.Configuration;
+import org.apache.geronimo.kernel.repository.Environment;
+import org.apache.geronimo.xbeans.geronimo.naming.GerEjbRefDocument;
+import org.apache.geronimo.xbeans.geronimo.naming.GerEjbRefType;
+import org.apache.geronimo.xbeans.geronimo.naming.GerPatternType;
+import org.apache.geronimo.xbeans.javaee.EjbRefType;
+import org.apache.xmlbeans.QNameSet;
+import org.apache.xmlbeans.XmlObject;
+
+/**
+ * @version $Revision: 475950 $ $Date: 2006-11-16 14:18:14 -0800 (Thu, 16 Nov 2006) $
+ */
+public class RemoteEjbRefBuilder extends AbstractEjbRefBuilder {
+    private static final QName GER_EJB_REF_QNAME = GerEjbRefDocument.type.getDocumentElementName();
+    private static final QNameSet GER_EJB_REF_QNAME_SET = QNameSet.singleton(GER_EJB_REF_QNAME);
+
+    private final QNameSet ejbRefQNameSet;
+
+    public RemoteEjbRefBuilder(Environment defaultEnvironment, String[] eeNamespaces) {
+        super(defaultEnvironment);
+        ejbRefQNameSet = buildQNameSet(eeNamespaces, "ejb-ref");
+    }
+
+    public QNameSet getSpecQNameSet() {
+        return ejbRefQNameSet;
+    }
+
+    public QNameSet getPlanQNameSet() {
+        return GER_EJB_REF_QNAME_SET;
+    }
+
+    protected boolean willMergeEnvironment(XmlObject specDD, XmlObject plan) {
+        return specDD.selectChildren(ejbRefQNameSet).length > 0;
+    }
+
+    public void buildNaming(XmlObject specDD, XmlObject plan, Configuration localConfiguration, Configuration remoteConfiguration, Module module, Map componentContext) throws DeploymentException {
+        List<EjbRefType> ejbRefs = convert(specDD.selectChildren(ejbRefQNameSet), J2EE_CONVERTER, EjbRefType.class, EjbRefType.type);
+        XmlObject[] gerEjbRefsUntyped = plan == null ? NO_REFS : plan.selectChildren(GER_EJB_REF_QNAME_SET);
+        Map<String, GerEjbRefType> ejbRefMap = mapEjbRefs(gerEjbRefsUntyped);
+        ClassLoader cl = module.getEarContext().getClassLoader();
+
+        for (EjbRefType ejbRef : ejbRefs) {
+            String ejbRefName = getStringValue(ejbRef.getEjbRefName());
+            GerEjbRefType remoteRef = ejbRefMap.get(ejbRefName);
+
+            Reference ejbReference = createEjbRef(remoteConfiguration, module.getModuleURI(), ejbRef, remoteRef, cl);
+            if (ejbReference != null) {
+                //noinspection unchecked
+                getJndiContextMap(componentContext).put(ENV + ejbRefName, ejbReference);
+            }
+        }
+    }
+
+    private Reference createEjbRef(Configuration ejbContext, URI moduleURI, EjbRefType ejbRef, GerEjbRefType remoteRef, ClassLoader cl) throws DeploymentException {
+        String refName = getStringValue(ejbRef.getEjbRefName());
+
+        String remote = getStringValue(ejbRef.getRemote());
+        try {
+            assureEJBObjectInterface(remote, cl);
+        } catch (DeploymentException e) {
+            throw new DeploymentException("Error processing 'remote' element for EJB Reference '" + refName + "' for module '" + moduleURI + "': " + e.getMessage());
+        }
+
+        String home = getStringValue(ejbRef.getHome());
+        try {
+            assureEJBHomeInterface(home, cl);
+        } catch (DeploymentException e) {
+            throw new DeploymentException("Error processing 'home' element for EJB Reference '" + refName + "' for module '" + moduleURI + "': " + e.getMessage());
+        }
+
+        boolean isSession = "Session".equals(getStringValue(ejbRef.getEjbRefType()));
+
+        // MEJB
+        if (isSession && remote.equals("javax.management.j2ee.Management") && home.equals("javax.management.j2ee.ManagementHome")) {
+            AbstractNameQuery query = new AbstractNameQuery(null, Collections.singletonMap("name", "ejb/mgmt/MEJB"));
+            return createEjbRef(null, ejbContext, null, null, null, query, isSession, home, remote, true);
+        }
+
+        // corba refs are handled by another builder
+        if (remoteRef != null && remoteRef.isSetNsCorbaloc()) {
+            return null;
+        }
+
+        String ejbLink = null;
+        if (remoteRef != null && remoteRef.isSetEjbLink()) {
+            ejbLink = remoteRef.getEjbLink();
+        } else if (ejbRef.isSetEjbLink()) {
+            ejbLink = getStringValue(ejbRef.getEjbLink());
+        }
+
+        String optionalModule;
+        if (moduleURI == null) {
+            optionalModule = null;
+        } else {
+            optionalModule = moduleURI.toString();
+        }
+
+        String requiredModule = null;
+        AbstractNameQuery containerQuery = null;
+        if (ejbLink != null) {
+            String[] bits = ejbLink.split("#");
+            if (bits.length == 2) {
+                //look only in specified module.
+                requiredModule = bits[0];
+                if (moduleURI != null) {
+                    requiredModule = moduleURI.resolve(requiredModule).getPath();
+                }
+                ejbLink = bits[1];
+            }
+        } else if (remoteRef != null) {
+            GerPatternType patternType = remoteRef.getPattern();
+            containerQuery = buildAbstractNameQuery(patternType, null, NameFactory.EJB_MODULE, null);
+        }
+        return createEjbRef(refName, ejbContext, ejbLink, requiredModule, optionalModule, containerQuery, isSession, home, remote, true);
+    }
+
+    private static Map<String, GerEjbRefType> mapEjbRefs(XmlObject[] refs) {
+        Map<String, GerEjbRefType> refMap = new HashMap<String, GerEjbRefType>();
+        if (refs != null) {
+            for (int i = 0; i < refs.length; i++) {
+                GerEjbRefType ref = (GerEjbRefType) refs[i].copy().changeType(GerEjbRefType.type);
+                refMap.put(ref.getRefName().trim(), ref);
+            }
+        }
+        return refMap;
+    }
+
+    public static Class assureEJBObjectInterface(String remote, ClassLoader cl) throws DeploymentException {
+        return assureInterface(remote, "javax.ejb.EJBObject", "Remote", cl);
+    }
+
+    public static Class assureEJBHomeInterface(String home, ClassLoader cl) throws DeploymentException {
+        return assureInterface(home, "javax.ejb.EJBHome", "Home", cl);
+    }
+
+    public static final GBeanInfo GBEAN_INFO;
+
+    static {
+        GBeanInfoBuilder infoBuilder = GBeanInfoBuilder.createStatic(RemoteEjbRefBuilder.class, NameFactory.MODULE_BUILDER);
+        infoBuilder.addAttribute("eeNamespaces", String[].class, true, true);
+        infoBuilder.addAttribute("defaultEnvironment", Environment.class, true, true);
+
+        infoBuilder.setConstructor(new String[]{"defaultEnvironment", "eeNamespaces"});
+
+        GBEAN_INFO = infoBuilder.getBeanInfo();
+    }
+
+    public static GBeanInfo getGBeanInfo() {
+        return GBEAN_INFO;
+    }
+
+}

Added: geronimo/server/trunk/modules/geronimo-openejb-builder/src/main/schema/geronimo-openejb-2.0.xsd
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/modules/geronimo-openejb-builder/src/main/schema/geronimo-openejb-2.0.xsd?view=auto&rev=497146
==============================================================================
--- geronimo/server/trunk/modules/geronimo-openejb-builder/src/main/schema/geronimo-openejb-2.0.xsd (added)
+++ geronimo/server/trunk/modules/geronimo-openejb-builder/src/main/schema/geronimo-openejb-2.0.xsd Wed Jan 17 12:03:23 2007
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+  * Licensed to the Apache Software Foundation (ASF) under one or more
+  * contributor license agreements.  See the NOTICE file distributed with
+  * this work for additional information regarding copyright ownership.
+  * The ASF licenses this file to You under the Apache License, Version 2.0
+  * (the "License"); you may not use this file except in compliance with
+  * the License.  You may obtain a copy of the License at
+  *
+  *     http://www.apache.org/licenses/LICENSE-2.0
+  *
+  * Unless required by applicable law or agreed to in writing, software
+  * distributed under the License is distributed on an "AS IS" BASIS,
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  * See the License for the specific language governing permissions and
+  * limitations under the License.
+  */
+-->
+
+<xs:schema
+    xmlns:openejb="http://geronimo.apache.org/xml/ns/j2ee/ejb/openejb-2.0"
+    targetNamespace="http://geronimo.apache.org/xml/ns/j2ee/ejb/openejb-2.0"
+    xmlns:naming="http://geronimo.apache.org/xml/ns/naming-1.2"
+    xmlns:app="http://geronimo.apache.org/xml/ns/j2ee/application-1.2"
+    xmlns:sys="http://geronimo.apache.org/xml/ns/deployment-1.2"
+    xmlns:xs="http://www.w3.org/2001/XMLSchema"
+    elementFormDefault="qualified"
+    attributeFormDefault="unqualified"
+    version="1.0">
+
+    <xs:import namespace="http://geronimo.apache.org/xml/ns/naming-1.2" schemaLocation="geronimo-naming-1.2.xsd"/>
+    <xs:import namespace="http://geronimo.apache.org/xml/ns/j2ee/application-1.2" schemaLocation="geronimo-application-1.2.xsd"/>
+    <xs:import namespace="http://geronimo.apache.org/xml/ns/deployment-1.2" schemaLocation="geronimo-module-1.2.xsd"/>
+
+    <xs:element name="ejb-jar" type="openejb:geronimo-ejb-jarType"/>
+
+    <xs:complexType name="emptyType"/>
+
+    <xs:complexType name="geronimo-ejb-jarType">
+        <xs:sequence>
+            <xs:element ref="sys:environment" minOccurs="0"/>
+
+            <xs:element name="openejb-jar" type="openejb:openejb-jarType" minOccurs="0"/>
+
+            <!-- Naming -->
+            <xs:group ref="naming:jndiEnvironmentRefsGroup" minOccurs="0" maxOccurs="unbounded"/>
+            <xs:element ref="naming:message-destination" minOccurs="0" maxOccurs="unbounded"/>
+
+            <!-- Security -->
+            <xs:element ref="app:security" minOccurs="0"/>
+
+            <!-- GBeans -->
+            <xs:element ref="sys:service" minOccurs="0" maxOccurs="unbounded"/>
+        </xs:sequence>
+    </xs:complexType>
+
+    <!-- TODO there is no need for the extra wrapper other then xmlbean is overly enforcing the unique particle attribution rule -->
+    <xs:complexType name="openejb-jarType">
+        <xs:sequence>
+            <xs:any namespace="##other" processContents="lax"/>
+        </xs:sequence>
+    </xs:complexType>
+</xs:schema>

Added: geronimo/server/trunk/modules/geronimo-openejb-builder/src/main/schema/xmlconfig.xml
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/modules/geronimo-openejb-builder/src/main/schema/xmlconfig.xml?view=auto&rev=497146
==============================================================================
--- geronimo/server/trunk/modules/geronimo-openejb-builder/src/main/schema/xmlconfig.xml (added)
+++ geronimo/server/trunk/modules/geronimo-openejb-builder/src/main/schema/xmlconfig.xml Wed Jan 17 12:03:23 2007
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+  * Licensed to the Apache Software Foundation (ASF) under one or more
+  * contributor license agreements.  See the NOTICE file distributed with
+  * this work for additional information regarding copyright ownership.
+  * The ASF licenses this file to You under the Apache License, Version 2.0
+  * (the "License"); you may not use this file except in compliance with
+  * the License.  You may obtain a copy of the License at
+  *
+  *     http://www.apache.org/licenses/LICENSE-2.0
+  *
+  * Unless required by applicable law or agreed to in writing, software
+  * distributed under the License is distributed on an "AS IS" BASIS,
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  * See the License for the specific language governing permissions and
+  * limitations under the License.
+  */
+-->
+
+<xb:config xmlns:xb="http://www.bea.com/2002/09/xbean/config">
+    <xb:namespace uri="http://geronimo.apache.org/xml/ns/j2ee/ejb/openejb-2.0">
+        <xb:package>org.apache.geronimo.openejb.xbeans.ejbjar</xb:package>
+        <xb:prefix>Openejb</xb:prefix>
+    </xb:namespace>
+</xb:config>

Added: geronimo/server/trunk/modules/geronimo-openejb-builder/src/test/java/org/apache/geronimo/openejb/deployment/SchemaConversionTest.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/modules/geronimo-openejb-builder/src/test/java/org/apache/geronimo/openejb/deployment/SchemaConversionTest.java?view=auto&rev=497146
==============================================================================
--- geronimo/server/trunk/modules/geronimo-openejb-builder/src/test/java/org/apache/geronimo/openejb/deployment/SchemaConversionTest.java (added)
+++ geronimo/server/trunk/modules/geronimo-openejb-builder/src/test/java/org/apache/geronimo/openejb/deployment/SchemaConversionTest.java Wed Jan 17 12:03:23 2007
@@ -0,0 +1,173 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+package org.apache.geronimo.openejb.deployment;
+
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.Assert;
+import org.apache.geronimo.deployment.xmlbeans.XmlBeansUtil;
+import org.apache.geronimo.schema.SchemaConversionUtils;
+import org.apache.geronimo.testsupport.XmlBeansTestSupport;
+import org.apache.xmlbeans.XmlCursor;
+import org.apache.xmlbeans.XmlObject;
+
+/**
+ * ejb 1.1 dtd appears to be a subset of ejb 2.0 dtd so the same xsl should
+ * work for both.
+ *
+ * @version $Rev: 451417 $ $Date: 2006-09-29 13:13:22 -0700 (Fri, 29 Sep 2006) $
+ */
+public class SchemaConversionTest extends XmlBeansTestSupport {
+    private ClassLoader classLoader = this.getClass().getClassLoader();
+
+    // Dain: I don't believe we need this test anymore since openejb is doing the converstions.
+    public void testNothing() {
+    }
+
+    public void XtestEJB11ToEJB21Transform() throws Exception {
+        URL srcXml = classLoader.getResource("j2ee_1_2dtd/ejb-1-11.xml");
+        URL expectedOutputXml = classLoader.getResource("j2ee_1_2dtd/ejb-1-21.xml");
+        XmlObject xmlObject = XmlObject.Factory.parse(srcXml);
+        XmlObject expected = XmlObject.Factory.parse(expectedOutputXml);
+        XmlBeansUtil.validateDD(expected);
+        xmlObject = XmlUtil.convertToEJBSchema(xmlObject);
+//        log.debug(xmlObject.toString());
+//        log.debug(expected.toString());
+        List problems = new ArrayList();
+        boolean ok = compareXmlObjects(xmlObject, expected, problems);
+        Assert.assertTrue("Differences: " + problems, ok);
+        //make sure trying to convert twice has no bad effects
+        XmlCursor cursor2 = xmlObject.newCursor();
+        try {
+            String schemaLocationURL = "http://java.sun.com/xml/ns/j2ee/ejb-jar_2_1.xsd";
+            String version = "2.1";
+            Assert.assertFalse(SchemaConversionUtils.convertToSchema(cursor2, SchemaConversionUtils.J2EE_NAMESPACE, schemaLocationURL, version));
+        } finally {
+            cursor2.dispose();
+        }
+        boolean ok2 = compareXmlObjects(xmlObject, expected, problems);
+        Assert.assertTrue("Differences after reconverting to schema: " + problems, ok2);
+        //do the whole transform twice...
+        xmlObject = XmlUtil.convertToEJBSchema(xmlObject);
+        boolean ok3 = compareXmlObjects(xmlObject, expected, problems);
+        Assert.assertTrue("Differences after reconverting to ejb schema: " + problems, ok3);
+    }
+
+    public void XtestEJB20ToEJB21Transform() throws Exception {
+        URL srcXml = classLoader.getResource("j2ee_1_3dtd/ejb-jar.xml");
+        URL expectedOutputXml = classLoader.getResource("j2ee_1_3dtd/ejb-jar-21.xml");
+        XmlObject xmlObject = XmlObject.Factory.parse(srcXml);
+        XmlObject expected = XmlObject.Factory.parse(expectedOutputXml);
+        XmlBeansUtil.validateDD(expected);
+        xmlObject = XmlUtil.convertToEJBSchema(xmlObject);
+//        log.debug(xmlObject.toString());
+//        log.debug(expected.toString());
+        List problems = new ArrayList();
+        boolean ok = compareXmlObjects(xmlObject, expected, problems);
+        Assert.assertTrue("Differences: " + problems, ok);
+        //make sure trying to convert twice has no bad effects
+        XmlCursor cursor2 = xmlObject.newCursor();
+        try {
+            String schemaLocationURL = "http://java.sun.com/xml/ns/j2ee/ejb-jar_2_1.xsd";
+            String version = "2.1";
+            Assert.assertFalse(SchemaConversionUtils.convertToSchema(cursor2, SchemaConversionUtils.J2EE_NAMESPACE, schemaLocationURL, version));
+        } finally {
+            cursor2.dispose();
+        }
+        boolean ok2 = compareXmlObjects(xmlObject, expected, problems);
+        Assert.assertTrue("Differences after reconverting to schema: " + problems, ok2);
+        //do the whole transform twice...
+        xmlObject = XmlUtil.convertToEJBSchema(xmlObject);
+        boolean ok3 = compareXmlObjects(xmlObject, expected, problems);
+        Assert.assertTrue("Differences after reconverting to ejb schema: " + problems, ok3);
+    }
+
+    public void xtestMDB20ToEJB21TransformBugGERONIMO_1649() throws Exception {
+        URL srcXml = classLoader.getResource("j2ee_1_3dtd/mdb-ejb-jar-20-GERONIMO-1649.xml");
+        URL expectedOutputXml = classLoader.getResource("j2ee_1_3dtd/mdb-ejb-jar-21-GERONIMO-1649.xml");
+        XmlObject xmlObject = XmlObject.Factory.parse(srcXml);
+        XmlObject expected = XmlObject.Factory.parse(expectedOutputXml);
+        XmlBeansUtil.validateDD(expected);
+        xmlObject = XmlUtil.convertToEJBSchema(xmlObject);
+//        log.debug(xmlObject.toString());
+//        log.debug(expected.toString());
+        List problems = new ArrayList();
+        boolean ok = compareXmlObjects(xmlObject, expected, problems);
+        Assert.assertTrue("Differences: " + problems, ok);
+        //make sure trying to convert twice has no bad effects
+        XmlCursor cursor2 = xmlObject.newCursor();
+        try {
+            String schemaLocationURL = "http://java.sun.com/xml/ns/j2ee/ejb-jar_2_1.xsd";
+            String version = "2.1";
+            Assert.assertFalse(SchemaConversionUtils.convertToSchema(cursor2, SchemaConversionUtils.J2EE_NAMESPACE, schemaLocationURL, version));
+        } finally {
+            cursor2.dispose();
+        }
+        boolean ok2 = compareXmlObjects(xmlObject, expected, problems);
+        Assert.assertTrue("Differences after reconverting to schema: " + problems, ok2);
+        //do the whole transform twice...
+        xmlObject = XmlUtil.convertToEJBSchema(xmlObject);
+        boolean ok3 = compareXmlObjects(xmlObject, expected, problems);
+        Assert.assertTrue("Differences after reconverting to ejb schema: " + problems, ok3);
+    }
+
+    public void XtestMDB20To21Transform() throws Exception {
+        URL srcXml = classLoader.getResource("j2ee_1_3dtd/mdb-ejb-jar-20.xml");
+        URL expectedOutputXml = classLoader.getResource("j2ee_1_3dtd/mdb-ejb-jar-21.xml");
+        XmlObject xmlObject = XmlObject.Factory.parse(srcXml);
+        XmlObject expected = XmlObject.Factory.parse(expectedOutputXml);
+        XmlBeansUtil.validateDD(expected);
+        xmlObject = XmlUtil.convertToEJBSchema(xmlObject);
+//        log.debug(xmlObject.toString());
+//        log.debug(expected.toString());
+        List problems = new ArrayList();
+        boolean ok = compareXmlObjects(xmlObject, expected, problems);
+        Assert.assertTrue("Differences: " + problems, ok);
+        //make sure trying to convert twice has no bad effects
+        XmlCursor cursor2 = xmlObject.newCursor();
+        try {
+            String schemaLocationURL = "http://java.sun.com/xml/ns/j2ee/ejb-jar_2_1.xsd";
+            String version = "2.1";
+            Assert.assertFalse(SchemaConversionUtils.convertToSchema(cursor2, SchemaConversionUtils.J2EE_NAMESPACE, schemaLocationURL, version));
+        } finally {
+            cursor2.dispose();
+        }
+        boolean ok2 = compareXmlObjects(xmlObject, expected, problems);
+        Assert.assertTrue("Differences after reconverting to schema: " + problems, ok2);
+        //do the whole transform twice...
+        xmlObject = XmlUtil.convertToEJBSchema(xmlObject);
+        boolean ok3 = compareXmlObjects(xmlObject, expected, problems);
+        Assert.assertTrue("Differences after reconverting to ejb schema: " + problems, ok3);
+    }
+
+
+    public void XtestEJB21To21DoesNothing() throws Exception {
+        URL srcXml = classLoader.getResource("j2ee_1_4schema/ejb-jar.xml");
+        URL expectedOutputXml = classLoader.getResource("j2ee_1_4schema/ejb-jar.xml");
+        XmlObject xmlObject = XmlObject.Factory.parse(srcXml);
+        xmlObject = XmlUtil.convertToEJBSchema(xmlObject);
+        XmlObject expected = XmlObject.Factory.parse(expectedOutputXml);
+        List problems = new ArrayList();
+        boolean ok = compareXmlObjects(xmlObject, expected, problems);
+        Assert.assertTrue("Differences: " + problems, ok);
+    }
+
+}

Added: geronimo/server/trunk/modules/geronimo-openejb-builder/src/test/java/org/apache/geronimo/openejb/deployment/XmlUtilTest.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/modules/geronimo-openejb-builder/src/test/java/org/apache/geronimo/openejb/deployment/XmlUtilTest.java?view=auto&rev=497146
==============================================================================
--- geronimo/server/trunk/modules/geronimo-openejb-builder/src/test/java/org/apache/geronimo/openejb/deployment/XmlUtilTest.java (added)
+++ geronimo/server/trunk/modules/geronimo-openejb-builder/src/test/java/org/apache/geronimo/openejb/deployment/XmlUtilTest.java Wed Jan 17 12:03:23 2007
@@ -0,0 +1,50 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.geronimo.openejb.deployment;
+
+import java.io.File;
+import java.net.URL;
+
+import junit.framework.TestCase;
+import org.apache.geronimo.openejb.xbeans.ejbjar.OpenejbGeronimoEjbJarType;
+import org.apache.geronimo.xbeans.javaee.EjbJarType;
+import org.apache.openejb.jee.EjbJar;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class XmlUtilTest extends TestCase {
+    public void testLoadGeronimOpenejbJar() throws Exception {
+        URL resource = getClass().getClassLoader().getResource("plans/geronimo-openejb.xml");
+        File plan = new File(resource.toURI());
+        OpenejbGeronimoEjbJarType openejbGeronimoEjbJarType = XmlUtil.loadGeronimOpenejbJar(plan, null, true, null, null);
+        assertNotNull(openejbGeronimoEjbJarType);
+    }
+
+    public void testConvertToXmlbeans() throws Exception {
+        URL specDDUrl = getClass().getClassLoader().getResource("jee_5schema/ejb-jar.xml");
+        assertNotNull(specDDUrl);
+
+        // load the ejb-jar.xml
+        String ejbJarXml = XmlUtil.loadEjbJarXml(specDDUrl, null);
+        assertNotNull(ejbJarXml);
+
+        EjbJar ejbJar = XmlUtil.unmarshal(EjbJar.class, ejbJarXml);
+        EjbJarType ejbJarType = XmlUtil.convertToXmlbeans(ejbJar);
+        assertNotNull(ejbJarType);
+    }
+}

Added: geronimo/server/trunk/modules/geronimo-openejb-builder/src/test/resources/j2ee_1_2dtd/ejb-1-11.xml
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/modules/geronimo-openejb-builder/src/test/resources/j2ee_1_2dtd/ejb-1-11.xml?view=auto&rev=497146
==============================================================================
--- geronimo/server/trunk/modules/geronimo-openejb-builder/src/test/resources/j2ee_1_2dtd/ejb-1-11.xml (added)
+++ geronimo/server/trunk/modules/geronimo-openejb-builder/src/test/resources/j2ee_1_2dtd/ejb-1-11.xml Wed Jan 17 12:03:23 2007
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+
+<!DOCTYPE ejb-jar PUBLIC '-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 1.1//EN'
+ 'http://java.sun.com/j2ee/dtds/ejb-jar_1_1.dtd'>
+
+<ejb-jar>
+    <description>description</description>
+    <display-name>My  Favorite Ejb</display-name>
+    <enterprise-beans>
+        <entity>
+            <description>description</description>
+            <display-name>Favorite Bean</display-name>
+            <ejb-name>FavoriteBean</ejb-name>
+            <home>org.apache.geronimo.FavoriteBeanHome</home>
+            <remote>org.apache.geronimo.FavoriteBean</remote>
+            <ejb-class>org.apache.geronimo.FavoriteBeanEJB</ejb-class>
+            <persistence-type>Container</persistence-type>
+            <prim-key-class>java.lang.Integer</prim-key-class>
+            <reentrant>False</reentrant>
+            <cmp-field>
+                <field-name>id</field-name>
+            </cmp-field>
+            <cmp-field>
+                <field-name>preference</field-name>
+            </cmp-field>
+            <cmp-field>
+                <field-name>color</field-name>
+            </cmp-field>
+            <primkey-field>id</primkey-field>
+        </entity>
+    </enterprise-beans>
+    <assembly-descriptor>
+        <container-transaction>
+            <method>
+                <ejb-name>FavoriteBean</ejb-name>
+                <method-intf>Home</method-intf>
+                <method-name>remove</method-name>
+                <method-params>
+                    <method-param>java.lang.Object</method-param>
+                </method-params>
+            </method>
+            <trans-attribute>Required</trans-attribute>
+        </container-transaction>
+        <container-transaction>
+            <method>
+                <ejb-name>FavoriteBean</ejb-name>
+                <method-intf>Home</method-intf>
+                <method-name>create</method-name>
+                <method-params>
+                    <method-param>int</method-param>
+                    <method-param>float</method-param>
+                    <method-param>java.lang.String</method-param>
+                </method-params>
+            </method>
+            <trans-attribute>Required</trans-attribute>
+        </container-transaction>
+        <container-transaction>
+            <method>
+                <ejb-name>FavoriteBean</ejb-name>
+                <method-intf>Remote</method-intf>
+                <method-name>getPreference</method-name>
+                <method-params/>
+            </method>
+            <trans-attribute>Required</trans-attribute>
+        </container-transaction>
+        <container-transaction>
+            <method>
+                <ejb-name>FavoriteBean</ejb-name>
+                <method-intf>Remote</method-intf>
+                <method-name>remove</method-name>
+                <method-params/>
+            </method>
+            <trans-attribute>Required</trans-attribute>
+        </container-transaction>
+        <container-transaction>
+            <method>
+                <ejb-name>FavoriteBean</ejb-name>
+                <method-intf>Home</method-intf>
+                <method-name>remove</method-name>
+                <method-params>
+                    <method-param>javax.ejb.Handle</method-param>
+                </method-params>
+            </method>
+            <trans-attribute>Required</trans-attribute>
+        </container-transaction>
+        <container-transaction>
+            <method>
+                <ejb-name>FavoriteBean</ejb-name>
+                <method-intf>Home</method-intf>
+                <method-name>findByPrimaryKey</method-name>
+                <method-params>
+                    <method-param>java.lang.Integer</method-param>
+                </method-params>
+            </method>
+            <trans-attribute>Required</trans-attribute>
+        </container-transaction>
+        <container-transaction>
+            <method>
+                <ejb-name>FavoriteBean</ejb-name>
+                <method-intf>Remote</method-intf>
+                <method-name>updatePreference</method-name>
+                <method-params>
+                    <method-param>float</method-param>
+                </method-params>
+            </method>
+            <trans-attribute>Required</trans-attribute>
+        </container-transaction>
+    </assembly-descriptor>
+</ejb-jar>
+