geronimo-scm mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From d...@apache.org
Subject svn commit: r502637 - in /geronimo/server/trunk/modules: geronimo-cxf-builder/src/main/java/org/apache/geronimo/cxf/builder/ geronimo-naming-builder/src/main/java/org/apache/geronimo/naming/deployment/
Date Fri, 02 Feb 2007 15:51:09 GMT
Author: dims
Date: Fri Feb  2 07:51:07 2007
New Revision: 502637

URL: http://svn.apache.org/viewvc?view=rev&rev=502637
Log:
Fix for   GERONIMO-2791 - Switching ServiceRef naming builder

Added:
    geronimo/server/trunk/modules/geronimo-cxf-builder/src/main/java/org/apache/geronimo/cxf/builder/CXFServiceRefBuilder.java
    geronimo/server/trunk/modules/geronimo-naming-builder/src/main/java/org/apache/geronimo/naming/deployment/ServiceRefBuilder.java
    geronimo/server/trunk/modules/geronimo-naming-builder/src/main/java/org/apache/geronimo/naming/deployment/SwitchingServiceRefBuilder.java

Added: geronimo/server/trunk/modules/geronimo-cxf-builder/src/main/java/org/apache/geronimo/cxf/builder/CXFServiceRefBuilder.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/modules/geronimo-cxf-builder/src/main/java/org/apache/geronimo/cxf/builder/CXFServiceRefBuilder.java?view=auto&rev=502637
==============================================================================
--- geronimo/server/trunk/modules/geronimo-cxf-builder/src/main/java/org/apache/geronimo/cxf/builder/CXFServiceRefBuilder.java
(added)
+++ geronimo/server/trunk/modules/geronimo-cxf-builder/src/main/java/org/apache/geronimo/cxf/builder/CXFServiceRefBuilder.java
Fri Feb  2 07:51:07 2007
@@ -0,0 +1,207 @@
+/**
+ *  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.cxf.builder;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.namespace.QName;
+
+import org.apache.geronimo.common.DeploymentException;
+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.naming.deployment.AbstractNamingBuilder;
+import org.apache.geronimo.naming.deployment.ServiceRefBuilder;
+import org.apache.geronimo.xbeans.geronimo.naming.GerServiceRefDocument;
+import org.apache.geronimo.xbeans.geronimo.naming.GerServiceRefType;
+import org.apache.geronimo.xbeans.javaee.PortComponentRefType;
+import org.apache.geronimo.xbeans.javaee.ServiceRefHandlerChainType;
+import org.apache.geronimo.xbeans.javaee.ServiceRefHandlerChainsType;
+import org.apache.geronimo.xbeans.javaee.ServiceRefHandlerType;
+import org.apache.geronimo.xbeans.javaee.ServiceRefType;
+
+import org.apache.xmlbeans.QNameSet;
+import org.apache.xmlbeans.XmlObject;
+
+public class CXFServiceRefBuilder extends AbstractNamingBuilder implements ServiceRefBuilder
{
+
+    private static final QName GER_SERVICE_REF_QNAME = 
+        GerServiceRefDocument.type.getDocumentElementName();
+
+    private static final QNameSet GER_SERVICE_REF_QNAME_SET = 
+        QNameSet.singleton(GER_SERVICE_REF_QNAME);
+
+    private final QNameSet serviceRefQNameSet;
+    private final CXFBuilder cxfBuilder;
+    
+    public CXFServiceRefBuilder(Environment defaultEnvironment,
+                                String[] eeNamespaces,
+                                CXFBuilder cxfBuilder) {
+        super(defaultEnvironment);
+        this.cxfBuilder = cxfBuilder;
+        serviceRefQNameSet = buildQNameSet(eeNamespaces, "service-ref");
+    }
+
+    protected boolean willMergeEnvironment(XmlObject specDD, XmlObject plan) {
+        return specDD.selectChildren(serviceRefQNameSet).length > 0;
+    }
+
+    public void buildNaming(XmlObject specDD,
+                            XmlObject plan,
+                            Configuration localConfiguration,
+                            Configuration remoteConfiguration,
+                            Module module,
+                            Map componentContext) throws DeploymentException {       
+        List<ServiceRefType> serviceRefsUntyped = convert(specDD.selectChildren(serviceRefQNameSet),
JEE_CONVERTER, ServiceRefType.class, ServiceRefType.type);
+        XmlObject[] gerServiceRefsUntyped = plan == null ? NO_REFS : plan.selectChildren(GER_SERVICE_REF_QNAME_SET);
+        Map serviceRefMap = mapServiceRefs(gerServiceRefsUntyped);
+        
+        for (ServiceRefType serviceRef : serviceRefsUntyped) {
+            String name = getStringValue(serviceRef.getServiceRefName());            
+            GerServiceRefType serviceRefType = (GerServiceRefType) serviceRefMap.get(name);
+            
+            buildNaming(serviceRef, serviceRefType, module, componentContext);
+        }        
+    }
+
+    private Class loadClass(String name, ClassLoader cl) throws DeploymentException {
+        try {
+            return cl.loadClass(name);
+        } catch (ClassNotFoundException e) {
+            throw new DeploymentException("Could not load service class " + name, e);   
            
+        }         
+    }
+    
+    public void buildNaming(XmlObject serviceRef, GerServiceRefType gerServiceRefType, Module
module, Map componentContext) throws DeploymentException {
+        ServiceRefType serviceRefType = 
+            (ServiceRefType)convert(serviceRef, JEE_CONVERTER, ServiceRefType.type);
+        buildNaming(serviceRefType, gerServiceRefType, module, componentContext);
+    }
+    
+    public void buildNaming(ServiceRefType serviceRef, GerServiceRefType gerServiceRef, Module
module, Map componentContext) throws DeploymentException {
+        ClassLoader cl = module.getEarContext().getClassLoader();
+        Class jaxwsServiceClass = loadClass("javax.xml.ws.Service", cl);
+        String name = getStringValue(serviceRef.getServiceRefName());
+        String serviceInterfaceName = getStringValue(serviceRef.getServiceInterface());
+        Class serviceInterfaceClass = loadClass(serviceInterfaceName, cl);
+        
+        if (!jaxwsServiceClass.isAssignableFrom(serviceInterfaceClass)) {
+            throw new DeploymentException(serviceInterfaceName + " class does not extend
" + jaxwsServiceClass.getName());
+        }
+        // TODO: check if service class is abstract???
+        
+        QName serviceQName = null;
+        if (serviceRef.isSetServiceQname()) {
+            serviceQName = serviceRef.getServiceQname().getQNameValue();
+        }
+        
+        URI wsdlURI = null;
+        if (serviceRef.isSetWsdlFile()) {
+            try {
+                wsdlURI = new URI(serviceRef.getWsdlFile().getStringValue().trim());
+            } catch (URISyntaxException e) {
+                throw new DeploymentException("could not construct wsdl uri from " + serviceRef.getWsdlFile().getStringValue(),
e);
+            }
+        }
+        
+        Class serviceReferenceType = null;
+        if (serviceRef.isSetServiceRefType()) {
+            String referenceClassName = getStringValue(serviceRef.getServiceRefType()); 
          
+            serviceReferenceType = loadClass(referenceClassName, cl);
+        }
+  
+        // TODO: handle handler chains
+        if (serviceRef.isSetHandlerChains()) {
+            ServiceRefHandlerChainsType handlerChains = serviceRef.getHandlerChains();
+            for (ServiceRefHandlerChainType handlerChain : handlerChains.getHandlerChainArray())
{
+                // bindings, port, service
+                for (ServiceRefHandlerType handler : handlerChain.getHandlerArray()) {
+                 // handler class
+                }
+            }
+        }
+                                
+        Map portComponentRefMap = new HashMap();
+        PortComponentRefType[] portComponentRefs = serviceRef.getPortComponentRefArray();
+        if (portComponentRefs != null) {
+            for (int j = 0; j < portComponentRefs.length; j++) {
+                PortComponentRefType portComponentRef = portComponentRefs[j];
+                String serviceEndpointInterfaceType = getStringValue(portComponentRef.getServiceEndpointInterface());
+                Class serviceEndpointClass = loadClass(serviceEndpointInterfaceType, cl);
           
+                String portComponentLink = getStringValue(portComponentRef.getPortComponentLink());
+                
+                portComponentRefMap.put(serviceEndpointClass, portComponentLink);
+            }
+        }
+        
+        Object ref = cxfBuilder.createService(serviceInterfaceClass, serviceReferenceType,
wsdlURI, serviceQName, portComponentRefMap, serviceRef.getHandlerChains(), gerServiceRef,
module, cl);
+        getJndiContextMap(componentContext).put(ENV + name, ref);
+    }
+       
+    private static Map mapServiceRefs(XmlObject[] refs) {
+        Map refMap = new HashMap();
+        if (refs != null) {
+            for (int i = 0; i < refs.length; i++) {
+                GerServiceRefType ref = (GerServiceRefType) refs[i].copy()
+                        .changeType(GerServiceRefType.type);
+                String serviceRefName = ref.getServiceRefName().trim();
+                refMap.put(serviceRefName, ref);
+            }
+        }
+        return refMap;
+    }
+
+    public QNameSet getSpecQNameSet() {
+        return serviceRefQNameSet;
+    }
+
+    public QNameSet getPlanQNameSet() {
+        return GER_SERVICE_REF_QNAME_SET;
+    }
+
+    public static final GBeanInfo GBEAN_INFO;
+
+    static {
+        GBeanInfoBuilder infoBuilder = GBeanInfoBuilder.createStatic(
+                CXFServiceRefBuilder.class, NameFactory.MODULE_BUILDER);
+        infoBuilder.addInterface(ServiceRefBuilder.class);
+        infoBuilder.addAttribute("defaultEnvironment", Environment.class, true,
+                true);
+        infoBuilder.addAttribute("eeNamespaces", String[].class, true, true);
+        infoBuilder.addReference("CXFBuilder", CXFBuilder.class,
+                NameFactory.MODULE_BUILDER);
+
+        infoBuilder.setConstructor(new String[] { "defaultEnvironment",
+                "eeNamespaces", "CXFBuilder" });
+
+        GBEAN_INFO = infoBuilder.getBeanInfo();
+    }
+
+    public static GBeanInfo getGBeanInfo() {
+        return GBEAN_INFO;
+    }
+
+
+}

Added: geronimo/server/trunk/modules/geronimo-naming-builder/src/main/java/org/apache/geronimo/naming/deployment/ServiceRefBuilder.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/modules/geronimo-naming-builder/src/main/java/org/apache/geronimo/naming/deployment/ServiceRefBuilder.java?view=auto&rev=502637
==============================================================================
--- geronimo/server/trunk/modules/geronimo-naming-builder/src/main/java/org/apache/geronimo/naming/deployment/ServiceRefBuilder.java
(added)
+++ geronimo/server/trunk/modules/geronimo-naming-builder/src/main/java/org/apache/geronimo/naming/deployment/ServiceRefBuilder.java
Fri Feb  2 07:51:07 2007
@@ -0,0 +1,39 @@
+/**
+ *  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.naming.deployment;
+
+import java.util.Map;
+
+import org.apache.geronimo.common.DeploymentException;
+
+import org.apache.geronimo.j2ee.deployment.Module;
+
+import org.apache.geronimo.kernel.repository.Environment;
+
+import org.apache.geronimo.xbeans.geronimo.naming.GerServiceRefType;
+
+import org.apache.xmlbeans.XmlObject;
+
+public interface ServiceRefBuilder {
+    void buildNaming(XmlObject serviceRef,
+                     GerServiceRefType serviceRefType,
+                     Module module,
+                     Map componentContext) throws DeploymentException;
+
+    Environment getEnvironment();
+}

Added: geronimo/server/trunk/modules/geronimo-naming-builder/src/main/java/org/apache/geronimo/naming/deployment/SwitchingServiceRefBuilder.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/modules/geronimo-naming-builder/src/main/java/org/apache/geronimo/naming/deployment/SwitchingServiceRefBuilder.java?view=auto&rev=502637
==============================================================================
--- geronimo/server/trunk/modules/geronimo-naming-builder/src/main/java/org/apache/geronimo/naming/deployment/SwitchingServiceRefBuilder.java
(added)
+++ geronimo/server/trunk/modules/geronimo-naming-builder/src/main/java/org/apache/geronimo/naming/deployment/SwitchingServiceRefBuilder.java
Fri Feb  2 07:51:07 2007
@@ -0,0 +1,214 @@
+/**
+ *  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.naming.deployment;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.xml.namespace.QName;
+
+import org.apache.geronimo.common.DeploymentException;
+import org.apache.geronimo.deployment.service.EnvironmentBuilder;
+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.naming.deployment.AbstractNamingBuilder;
+import org.apache.geronimo.xbeans.geronimo.naming.GerServiceRefDocument;
+import org.apache.geronimo.xbeans.geronimo.naming.GerServiceRefType;
+import org.apache.geronimo.xbeans.javaee.ServiceRefType;
+
+import org.apache.xmlbeans.QNameSet;
+import org.apache.xmlbeans.XmlObject;
+
+public class SwitchingServiceRefBuilder extends AbstractNamingBuilder {
+
+    private static final QName GER_SERVICE_REF_QNAME = GerServiceRefDocument.type
+            .getDocumentElementName();
+
+    private static final QNameSet GER_SERVICE_REF_QNAME_SET = QNameSet
+            .singleton(GER_SERVICE_REF_QNAME);
+
+    private final QNameSet serviceRefQNameSet;
+
+    private final Collection jaxrpcBuilders;
+
+    private final Collection jaxwsBuilders;
+
+    private Environment environment;
+
+    public SwitchingServiceRefBuilder(String[] eeNamespaces,
+                                      Collection jaxrpcBuilders,
+                                      Collection jaxwsBuilders) {
+        super(null);
+        this.jaxrpcBuilders = jaxrpcBuilders;
+        this.jaxwsBuilders = jaxwsBuilders;
+        this.serviceRefQNameSet = buildQNameSet(eeNamespaces, "service-ref");
+    }
+
+    public void buildEnvironment(XmlObject specDD,
+                                 XmlObject plan,
+                                 Environment environment)
+            throws DeploymentException {
+        this.environment = environment;
+    }
+
+    public void buildNaming(XmlObject specDD,
+                            XmlObject plan,
+                            Configuration localConfiguration,
+                            Configuration remoteConfiguration,
+                            Module module,
+                            Map componentContext) throws DeploymentException {
+        ClassLoader cl = module.getEarContext().getClassLoader();
+        Class jaxrpcClass = loadClass("javax.xml.rpc.Service", cl);
+        Class jaxwsClass = loadClass("javax.xml.ws.Service", cl);
+
+        boolean mergedJAXRPCEnv = false;
+        boolean mergedJAXWSEnv = false;
+
+        XmlObject[] serviceRefs = specDD.selectChildren(serviceRefQNameSet);
+
+        XmlObject[] gerServiceRefsUntyped = plan == null ? NO_REFS : plan
+                .selectChildren(GER_SERVICE_REF_QNAME_SET);
+        Map serviceRefMap = mapServiceRefs(gerServiceRefsUntyped);
+
+        for (XmlObject serviceRef : serviceRefs) {
+            ServiceRefType serviceRefType = (ServiceRefType) convert(
+                    serviceRef, JEE_CONVERTER, ServiceRefType.type);
+
+            String name = getStringValue(serviceRefType.getServiceRefName());
+            GerServiceRefType gerServiceRefType = (GerServiceRefType) serviceRefMap
+                    .get(name);
+
+            String serviceInterfaceName = getStringValue(serviceRefType
+                    .getServiceInterface());
+            Class serviceInterfaceClass = loadClass(serviceInterfaceName, cl);
+
+            if (jaxrpcClass.isAssignableFrom(serviceInterfaceClass)) {
+                // class jaxrpc handler
+                ServiceRefBuilder jaxrpcBuilder = getJAXRCPBuilder();
+                jaxrpcBuilder.buildNaming(serviceRef, gerServiceRefType,
+                        module, componentContext);
+                if (!mergedJAXRPCEnv) {
+                    mergeEnvironment(jaxrpcBuilder);
+                    mergedJAXRPCEnv = true;
+                }
+            } else if (jaxwsClass.isAssignableFrom(serviceInterfaceClass)) {
+                // calll jaxws handler
+                ServiceRefBuilder jaxwsBuilder = getJAXWSBuilder();
+                jaxwsBuilder.buildNaming(serviceRef, gerServiceRefType, module,
+                        componentContext);
+                if (!mergedJAXWSEnv) {
+                    mergeEnvironment(jaxwsBuilder);
+                    mergedJAXWSEnv = true;
+                }
+            } else {
+                throw new DeploymentException(serviceInterfaceName
+                                              + " does not extend "
+                                              + jaxrpcClass.getName() + " or "
+                                              + jaxwsClass.getName());
+            }
+        }
+    }
+
+    private ServiceRefBuilder getJAXWSBuilder() throws DeploymentException {
+        ServiceRefBuilder jaxwsBuilder = null;
+        if (this.jaxwsBuilders == null || this.jaxwsBuilders.isEmpty()) {
+            throw new DeploymentException(
+                    "No JAX-WS ServiceRefBuilders registered");
+        } else {
+            jaxwsBuilder = (ServiceRefBuilder) this.jaxwsBuilders.iterator()
+                    .next();
+        }
+        return jaxwsBuilder;
+    }
+
+    private ServiceRefBuilder getJAXRCPBuilder() throws DeploymentException {
+        ServiceRefBuilder jaxrpcBuilder = null;
+        if (this.jaxrpcBuilders == null || this.jaxrpcBuilders.isEmpty()) {
+            throw new DeploymentException(
+                    "No JAX-RPC ServiceRefBuilders registered");
+        } else {
+            jaxrpcBuilder = (ServiceRefBuilder) this.jaxrpcBuilders.iterator()
+                    .next();
+        }
+        return jaxrpcBuilder;
+    }
+
+    private void mergeEnvironment(ServiceRefBuilder builder) {
+        Environment env = builder.getEnvironment();
+        if (env != null) {
+            EnvironmentBuilder.mergeEnvironments(this.environment, env);
+        }
+    }
+
+    private Class loadClass(String name, ClassLoader cl)
+            throws DeploymentException {
+        try {
+            return cl.loadClass(name);
+        } catch (ClassNotFoundException e) {
+            throw new DeploymentException("Could not load service class "
+                                          + name, e);
+        }
+    }
+
+    private static Map mapServiceRefs(XmlObject[] refs) {
+        Map refMap = new HashMap();
+        if (refs != null) {
+            for (int i = 0; i < refs.length; i++) {
+                GerServiceRefType ref = (GerServiceRefType) refs[i].copy()
+                        .changeType(GerServiceRefType.type);
+                String serviceRefName = ref.getServiceRefName().trim();
+                refMap.put(serviceRefName, ref);
+            }
+        }
+        return refMap;
+    }
+
+    public QNameSet getSpecQNameSet() {
+        return serviceRefQNameSet;
+    }
+
+    public QNameSet getPlanQNameSet() {
+        return GER_SERVICE_REF_QNAME_SET;
+    }
+
+    public static final GBeanInfo GBEAN_INFO;
+
+    static {
+        GBeanInfoBuilder infoBuilder = GBeanInfoBuilder.createStatic(
+                SwitchingServiceRefBuilder.class, NameFactory.MODULE_BUILDER);
+        infoBuilder.addAttribute("eeNamespaces", String[].class, true, true);
+        infoBuilder.addReference("JAXRPCBuilder", ServiceRefBuilder.class,
+                NameFactory.MODULE_BUILDER);
+        infoBuilder.addReference("JAXWSBuilder", ServiceRefBuilder.class,
+                NameFactory.MODULE_BUILDER);
+
+        infoBuilder.setConstructor(new String[] { "eeNamespaces",
+                "JAXRPCBuilder", "JAXWSBuilder" });
+
+        GBEAN_INFO = infoBuilder.getBeanInfo();
+    }
+
+    public static GBeanInfo getGBeanInfo() {
+        return GBEAN_INFO;
+    }
+}



Mime
View raw message