Author: dblevins
Date: Sun Mar  6 02:01:20 2005
New Revision: 156300

URL: http://svn.apache.org/viewcvs?view=rev&rev=156300
Log:
Builds a JavaServiceDesc object for a pojo/ejb webservice and wraps it in 
ReadOnlyServiceDesc so it cannot be modified by the runtime stack.

Added:
    
geronimo/trunk/modules/axis-builder/src/java/org/apache/geronimo/axis/builder/AxisServiceBuilder.java
    
geronimo/trunk/modules/axis-builder/src/java/org/apache/geronimo/axis/builder/ReadOnlyServiceDesc.java

Added: 
geronimo/trunk/modules/axis-builder/src/java/org/apache/geronimo/axis/builder/AxisServiceBuilder.java
URL: 
http://svn.apache.org/viewcvs/geronimo/trunk/modules/axis-builder/src/java/org/apache/geronimo/axis/builder/AxisServiceBuilder.java?view=auto&rev=156300
==============================================================================
--- 
geronimo/trunk/modules/axis-builder/src/java/org/apache/geronimo/axis/builder/AxisServiceBuilder.java
 (added)
+++ 
geronimo/trunk/modules/axis-builder/src/java/org/apache/geronimo/axis/builder/AxisServiceBuilder.java
 Sun Mar  6 02:01:20 2005
@@ -0,0 +1,287 @@
+/**
+ *
+ * Copyright 2004 The Apache Software Foundation
+ *
+ *  Licensed 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.axis.builder;
+
+import java.lang.reflect.Method;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.jar.JarFile;
+import javax.wsdl.*;
+import javax.wsdl.extensions.soap.SOAPAddress;
+import javax.wsdl.extensions.soap.SOAPBinding;
+import javax.wsdl.extensions.soap.SOAPBody;
+import javax.xml.namespace.QName;
+
+import org.apache.axis.constants.Style;
+import org.apache.axis.constants.Use;
+import org.apache.axis.description.JavaServiceDesc;
+import org.apache.axis.description.TypeDesc;
+import org.apache.axis.encoding.DeserializerFactory;
+import org.apache.axis.encoding.SerializerFactory;
+import org.apache.axis.encoding.TypeMapping;
+import org.apache.axis.encoding.TypeMappingRegistryImpl;
+import org.apache.axis.encoding.ser.*;
+import org.apache.geronimo.common.DeploymentException;
+import org.apache.geronimo.deployment.util.DeploymentUtil;
+import org.apache.geronimo.kernel.ClassLoading;
+import org.apache.geronimo.xbeans.j2ee.JavaXmlTypeMappingType;
+import org.apache.geronimo.xbeans.j2ee.ServiceEndpointMethodMappingType;
+import org.apache.xmlbeans.SchemaType;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class AxisServiceBuilder {
+
+    public static final String XSD_NS = "http://www.w3.org/2001/XMLSchema";;
+
+
+    private static void validateLightweightMapping(Definition definition) 
throws DeploymentException {
+        // TODO Plum in the validator
+    }
+
+
+    public static JavaServiceDesc createEJBServiceDesc(JarFile jarFile, String 
ejbName, ClassLoader classLoader) throws DeploymentException {
+        Map portComponentsMap = null;
+        try {
+            URL webservicesURL = DeploymentUtil.createJarURL(jarFile, 
"META-INF/webservices.xml");
+            portComponentsMap = 
WSDescriptorParser.parseWebServiceDescriptor(webservicesURL, jarFile, true);
+        } catch (MalformedURLException e1) {
+            throw new DeploymentException("Invalid URL to webservices.xml", 
e1);
+        }
+
+        // Grab the portInfo for this ejb
+        PortInfo portInfo = (PortInfo) portComponentsMap.get(ejbName);
+        return createServiceDesc(portInfo, classLoader);
+    }
+
+    public static JavaServiceDesc createPOJOServiceDesc(JarFile jarFile, 
String pojoName, ClassLoader classLoader) throws DeploymentException {
+        Map portComponentsMap = null;
+        try {
+            URL webservicesURL = DeploymentUtil.createJarURL(jarFile, 
"WEB-INF/webservices.xml");
+            portComponentsMap = 
WSDescriptorParser.parseWebServiceDescriptor(webservicesURL, jarFile, true);
+        } catch (MalformedURLException e1) {
+            throw new DeploymentException("Invalid URL to webservices.xml", 
e1);
+        }
+
+        // Grab the portInfo for this pojo
+        PortInfo portInfo = (PortInfo) portComponentsMap.get(pojoName);
+        return createServiceDesc(portInfo, classLoader);
+    }
+
+    public static JavaServiceDesc createServiceDesc(PortInfo portInfo, 
ClassLoader classLoader) throws DeploymentException {
+        Port port = portInfo.getPort();
+        System.out.println("port = " + port);
+
+        Class serviceEndpointInterface = null;
+        try {
+            serviceEndpointInterface = 
classLoader.loadClass(portInfo.getServiceEndpointInterfaceName());
+        } catch (ClassNotFoundException e) {
+            throw (DeploymentException) new DeploymentException("Unable to 
load the service-endpoint interface for port-component " + 
portInfo.getPortComponentName()).initCause(e);
+        }
+
+        Map exceptionMap = 
WSDescriptorParser.getExceptionMap(portInfo.getJavaWsdlMapping());
+        Map schemaTypeKeyToSchemaTypeMap = 
WSDescriptorParser.buildSchemaTypeKeyToSchemaTypeMap(portInfo.getDefinition());
+        Map complexTypeMap = 
WSDescriptorParser.getComplexTypesInWsdl(schemaTypeKeyToSchemaTypeMap);
+
+
+        JavaServiceDesc serviceDesc = new JavaServiceDesc();
+
+        URL location = getAddressLocation(port);
+        serviceDesc.setEndpointURL(location.toExternalForm());
+
+        Binding binding = port.getBinding();
+
+        serviceDesc.setStyle(getStyle(binding));
+
+
+        BindingInput bindingInput = ((BindingOperation) 
binding.getBindingOperations().get(0)).getBindingInput();
+        SOAPBody soapBody = (SOAPBody) 
WSDescriptorParser.getExtensibilityElement(SOAPBody.class, 
bindingInput.getExtensibilityElements());
+
+        if (soapBody.getUse() != null) {
+            Use use = Use.getUse(soapBody.getUse());
+            serviceDesc.setUse(use);
+        } else {
+            serviceDesc.setUse(Use.ENCODED);
+        }
+
+
+        boolean isLightweight = portInfo.getServiceEndpointInterfaceMapping() 
== null;
+
+        if (isLightweight) {
+            validateLightweightMapping(portInfo.getDefinition());
+        }
+
+        buildOperations(binding, serviceEndpointInterface, isLightweight, 
portInfo, exceptionMap, complexTypeMap, classLoader, serviceDesc);
+
+        TypeMappingRegistryImpl tmr = new TypeMappingRegistryImpl();
+        tmr.doRegisterFromVersion("1.3");
+
+        TypeMapping typeMapping = 
tmr.getOrMakeTypeMapping(serviceDesc.getUse().getEncoding());
+
+        serviceDesc.setTypeMappingRegistry(tmr);
+        serviceDesc.setTypeMapping(typeMapping);
+
+        JavaXmlTypeMappingType[] javaXmlTypeMappings = 
portInfo.getJavaWsdlMapping().getJavaXmlTypeMappingArray();
+        if (isLightweight) {
+            buildLightweightTypes(schemaTypeKeyToSchemaTypeMap, portInfo, 
classLoader, typeMapping);
+        } else {
+            buildHeavyweightTypes(javaXmlTypeMappings, classLoader, 
schemaTypeKeyToSchemaTypeMap, typeMapping);
+        }
+        return new ReadOnlyServiceDesc(serviceDesc);
+    }
+
+    private static void buildHeavyweightTypes(JavaXmlTypeMappingType[] 
javaXmlTypeMappings, ClassLoader classLoader, Map schemaTypeKeyToSchemaTypeMap, 
TypeMapping typeMapping) throws DeploymentException {
+        for (int j = 0; j < javaXmlTypeMappings.length; j++) {
+            JavaXmlTypeMappingType javaXmlTypeMapping = javaXmlTypeMappings[j];
+            //default settings
+            Class serializerFactoryClass = BeanSerializerFactory.class;
+            Class deserializerFactoryClass = BeanDeserializerFactory.class;
+
+            String className = 
javaXmlTypeMapping.getJavaType().getStringValue().trim();
+
+            Class clazz = null;
+            try {
+                clazz = ClassLoading.loadClass(className, classLoader);
+            } catch (ClassNotFoundException e2) {
+                throw new DeploymentException("Could not load java type", e2);
+            }
+
+            if (clazz.isArray()) {
+                serializerFactoryClass = ArraySerializerFactory.class;
+                deserializerFactoryClass = ArrayDeserializerFactory.class;
+            }
+
+            QName typeQName;
+            SchemaTypeKey key;
+            boolean isElement = 
javaXmlTypeMapping.getQnameScope().getStringValue().equals("element");
+            boolean isSimpleType = 
javaXmlTypeMapping.getQnameScope().getStringValue().equals("simpleType");
+            if (javaXmlTypeMapping.isSetRootTypeQname()) {
+                typeQName = 
javaXmlTypeMapping.getRootTypeQname().getQNameValue();
+                key = new SchemaTypeKey(typeQName, isElement, isSimpleType, 
false);
+            } else if (javaXmlTypeMapping.isSetAnonymousTypeQname()) {
+                String anonTypeQNameString = 
javaXmlTypeMapping.getAnonymousTypeQname().getStringValue();
+                int pos = anonTypeQNameString.lastIndexOf(":");
+                if (pos == -1) {
+                    throw new DeploymentException("anon QName is invalid, no 
final ':' " + anonTypeQNameString);
+                }
+                //this appears to be ignored...
+                typeQName = new QName(anonTypeQNameString.substring(0, pos), 
anonTypeQNameString.substring(pos + 1));
+                key = new SchemaTypeKey(typeQName, isElement, isSimpleType, 
true);
+            } else {
+                throw new DeploymentException("either root type qname or 
anonymous type qname must be set");
+            }
+
+            SchemaType schemaType = (SchemaType) 
schemaTypeKeyToSchemaTypeMap.get(key);
+            if (schemaType == null) {
+                throw new DeploymentException("Schema type key " + key + " not 
found in analyzed schema: " + schemaTypeKeyToSchemaTypeMap);
+            }
+
+            TypeDesc typeDesc = TypeDescBuilder.getTypeDescriptor(clazz, 
typeQName, javaXmlTypeMapping, schemaType);
+
+            SerializerFactory ser = 
BaseSerializerFactory.createFactory(serializerFactoryClass, clazz, typeQName);
+            DeserializerFactory deser = 
BaseDeserializerFactory.createFactory(deserializerFactoryClass, clazz, 
typeQName);
+
+            typeMapping.register(clazz, typeQName, ser, deser);
+            TypeDesc.registerTypeDescForClass(clazz, typeDesc);
+        }
+    }
+
+    private static void buildLightweightTypes(Map 
schemaTypeKeyToSchemaTypeMap, PortInfo portInfo, ClassLoader classLoader, 
TypeMapping typeMapping) throws DeploymentException {
+        for (Iterator iterator = 
schemaTypeKeyToSchemaTypeMap.entrySet().iterator(); iterator.hasNext();) {
+            Map.Entry entry = (Map.Entry) iterator.next();
+            SchemaTypeKey key = (SchemaTypeKey) entry.getKey();
+//            SchemaType schemaType = (SchemaType) entry.getValue();
+            if (!key.isElement() && !key.isAnonymous()) {
+                //default settings
+                QName typeQName = key.getqName();
+                String namespace = typeQName.getNamespaceURI();
+                String packageName = 
WSDescriptorParser.getPackageFromNamespace(namespace, 
portInfo.getJavaWsdlMapping());
+                String classShortName = typeQName.getLocalPart();
+                String className = packageName + "." + classShortName;
+
+                Class clazz = null;
+                try {
+                    clazz = ClassLoading.loadClass(className, classLoader);
+                } catch (ClassNotFoundException e) {
+                    throw new DeploymentException("Could not load java type", 
e);
+                }
+
+                Class serializerFactoryClass = BeanSerializerFactory.class;
+                Class deserializerFactoryClass = BeanDeserializerFactory.class;
+
+                if (clazz.isArray()) {
+                    serializerFactoryClass = ArraySerializerFactory.class;
+                    deserializerFactoryClass = ArrayDeserializerFactory.class;
+                }
+
+                SerializerFactory ser = 
BaseSerializerFactory.createFactory(serializerFactoryClass, clazz, typeQName);
+                DeserializerFactory deser = 
BaseDeserializerFactory.createFactory(deserializerFactoryClass, clazz, 
typeQName);
+                typeMapping.register(clazz, typeQName, ser, deser);
+
+                //TODO construct typedesc as well.
+//                TypeDesc typeDesc = getTypeDescriptor(clazz, typeQName, 
javaXmlTypeMapping, schemaType);
+//                typeDescriptors.put(clazz, typeDesc);
+
+            }
+        }
+    }
+
+    private static void buildOperations(Binding binding, Class 
serviceEndpointInterface, boolean lightweight, PortInfo portInfo, Map 
exceptionMap, Map complexTypeMap, ClassLoader classLoader, JavaServiceDesc 
serviceDesc) throws DeploymentException {
+        List bindingOperations = binding.getBindingOperations();
+        for (int i = 0; i < bindingOperations.size(); i++) {
+            BindingOperation bindingOperation = (BindingOperation) 
bindingOperations.get(i);
+            Method method = 
WSDescriptorParser.getMethodForOperation(serviceEndpointInterface, 
bindingOperation.getOperation());
+
+            OperationDescBuilder operationDescBuilder;
+            if (lightweight) {
+                operationDescBuilder = new 
LightweightOperationDescBuilder(bindingOperation, method);
+            } else {
+                String operationName = 
bindingOperation.getOperation().getName();
+                ServiceEndpointMethodMappingType[] methodMappings = 
portInfo.getServiceEndpointInterfaceMapping().getServiceEndpointMethodMappingArray();
+                ServiceEndpointMethodMappingType methodMapping = 
WSDescriptorParser.getMethodMappingForOperation(operationName, methodMappings);
+                operationDescBuilder = new 
HeavyweightOperationDescBuilder(bindingOperation, 
portInfo.getJavaWsdlMapping(), methodMapping, Style.RPC, exceptionMap, 
complexTypeMap, classLoader);
+            }
+
+            
serviceDesc.addOperationDesc(operationDescBuilder.buildOperationDesc());
+        }
+    }
+
+
+    private static Style getStyle(Binding binding) throws DeploymentException {
+        SOAPBinding soapBinding = (SOAPBinding) 
WSDescriptorParser.getExtensibilityElement(SOAPBinding.class, 
binding.getExtensibilityElements());
+//            String transportURI = soapBinding.getTransportURI();
+        String portStyleString = soapBinding.getStyle();
+        Style portStyle = Style.getStyle(portStyleString);
+        return portStyle;
+    }
+
+    private static URL getAddressLocation(Port port) throws 
DeploymentException {
+        SOAPAddress soapAddress = (SOAPAddress) 
WSDescriptorParser.getExtensibilityElement(SOAPAddress.class, 
port.getExtensibilityElements());
+        String locationURIString = soapAddress.getLocationURI();
+        URL location = null;
+        try {
+            location = new URL(locationURIString);
+        } catch (MalformedURLException e) {
+            throw new DeploymentException("Could not construct web service 
location URL from " + locationURIString);
+        }
+        return location;
+    }
+}

Added: 
geronimo/trunk/modules/axis-builder/src/java/org/apache/geronimo/axis/builder/ReadOnlyServiceDesc.java
URL: 
http://svn.apache.org/viewcvs/geronimo/trunk/modules/axis-builder/src/java/org/apache/geronimo/axis/builder/ReadOnlyServiceDesc.java?view=auto&rev=156300
==============================================================================
--- 
geronimo/trunk/modules/axis-builder/src/java/org/apache/geronimo/axis/builder/ReadOnlyServiceDesc.java
 (added)
+++ 
geronimo/trunk/modules/axis-builder/src/java/org/apache/geronimo/axis/builder/ReadOnlyServiceDesc.java
 Sun Mar  6 02:01:20 2005
@@ -0,0 +1,190 @@
+/**
+ *
+ * Copyright 2004 The Apache Software Foundation
+ *
+ *  Licensed 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.axis.builder;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.namespace.QName;
+
+import org.apache.axis.description.JavaServiceDesc;
+import org.apache.axis.description.OperationDesc;
+import org.apache.axis.encoding.TypeMapping;
+import org.apache.axis.encoding.TypeMappingRegistry;
+import org.apache.axis.constants.Style;
+import org.apache.axis.constants.Use;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class ReadOnlyServiceDesc extends JavaServiceDesc {
+    private final JavaServiceDesc serviceDesc;
+
+    public ReadOnlyServiceDesc(JavaServiceDesc serviceDesc) {
+        this.serviceDesc = serviceDesc;
+    }
+
+    public Class getImplClass() {
+        return serviceDesc.getImplClass();
+    }
+
+    public void setImplClass(Class implClass) {
+        serviceDesc.setImplClass(implClass);
+    }
+
+    public ArrayList getStopClasses() {
+        return serviceDesc.getStopClasses();
+    }
+
+    public void setStopClasses(ArrayList stopClasses) {        }
+
+    public void loadServiceDescByIntrospection()
+    {
+        serviceDesc.loadServiceDescByIntrospection();
+    }
+
+    public void loadServiceDescByIntrospection(Class implClass) {
+        serviceDesc.loadServiceDescByIntrospection(implClass);
+    }
+
+    public void loadServiceDescByIntrospection(Class cls, TypeMapping tm)
+    {
+        serviceDesc.loadServiceDescByIntrospection(cls, tm);
+    }
+
+    public Style getStyle() {
+        return serviceDesc.getStyle();
+    }
+
+    public void setStyle(Style style) {
+    }
+
+    public Use getUse() {
+        return serviceDesc.getUse();
+    }
+
+    public void setUse(Use use) {
+    }
+
+    public String getWSDLFile() {
+        return serviceDesc.getWSDLFile();
+    }
+
+    public void setWSDLFile(String wsdlFileName) {
+    }
+
+    public List getAllowedMethods() {
+        return serviceDesc.getAllowedMethods();
+    }
+
+    public void setAllowedMethods(List allowedMethods) {
+    }
+
+    public TypeMapping getTypeMapping() {
+        return serviceDesc.getTypeMapping();
+    }
+
+    public void setTypeMapping(TypeMapping tm) {
+    }
+
+    public String getName() {
+        return serviceDesc.getName();
+    }
+
+    public void setName(String name) {
+    }
+
+    public String getDocumentation() {
+        return serviceDesc.getDocumentation();
+    }
+
+    public void setDocumentation(String documentation) {
+    }
+
+    public void removeOperationDesc(OperationDesc operation) {
+    }
+
+    public void addOperationDesc(OperationDesc operation) {
+    }
+
+    public ArrayList getOperations() {
+        return serviceDesc.getOperations();
+    }
+
+    public OperationDesc [] getOperationsByName(String methodName) {
+        return serviceDesc.getOperationsByName(methodName);
+    }
+
+    public OperationDesc getOperationByName(String methodName) {
+        return serviceDesc.getOperationByName(methodName);
+    }
+
+    public OperationDesc getOperationByElementQName(QName qname) {
+        return serviceDesc.getOperationByElementQName(qname);
+    }
+
+    public OperationDesc [] getOperationsByQName(QName qname) {
+        return serviceDesc.getOperationsByQName(qname);
+    }
+
+    public void setNamespaceMappings(List namespaces) {
+    }
+
+    public String getDefaultNamespace() {
+        return serviceDesc.getDefaultNamespace();
+    }
+
+    public void setDefaultNamespace(String namespace) {
+    }
+
+    public void setProperty(String name, Object value) {
+        serviceDesc.setProperty(name, value);
+    }
+
+    public Object getProperty(String name) {
+        return serviceDesc.getProperty(name);
+    }
+
+    public String getEndpointURL() {
+        return serviceDesc.getEndpointURL();
+    }
+
+    public void setEndpointURL(String endpointURL) {
+    }
+
+    public TypeMappingRegistry getTypeMappingRegistry() {
+        return serviceDesc.getTypeMappingRegistry();
+    }
+
+    public void setTypeMappingRegistry(TypeMappingRegistry tmr) {
+    }
+
+    public boolean isInitialized() {
+        return serviceDesc.isInitialized();
+    }
+
+    public boolean isWrapped() {
+        return serviceDesc.isWrapped();
+    }
+
+    public List getDisallowedMethods() {
+        return serviceDesc.getDisallowedMethods();
+    }
+
+    public void setDisallowedMethods(List disallowedMethods) {
+    }
+}


Reply via email to