Author: djencks Date: Thu Feb 10 16:04:46 2005 New Revision: 153302 URL: http://svn.apache.org/viewcvs?view=rev&rev=153302 Log: Speculative handler impl for service refs, some work on fault/exception mapping
Added: geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/GeronimoAxisClient.java Modified: geronimo/trunk/modules/assembly/project.properties geronimo/trunk/modules/axis-builder/src/java/org/apache/geronimo/axis/builder/AxisBuilder.java geronimo/trunk/modules/axis-builder/src/test/org/apache/geronimo/axis/builder/ServiceReferenceTest.java geronimo/trunk/modules/axis-builder/src/test/org/apache/geronimo/axis/builder/mock/MockSEIFactory.java geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/GenericServiceEndpoint.java geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/GenericServiceEndpointWrapper.java geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/SEIFactory.java geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/SEIFactoryImpl.java geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/ServiceEndpointMethodInterceptor.java geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/ServiceImpl.java geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/ServiceMethodInterceptor.java geronimo/trunk/modules/axis/src/test/org/apache/geronimo/axis/testUtils/TestingUtils.java geronimo/trunk/modules/connector-builder/src/test/org/apache/geronimo/connector/deployment/ConnectorModuleBuilderTest.java geronimo/trunk/modules/j2ee-builder/project.xml geronimo/trunk/modules/j2ee-builder/src/java/org/apache/geronimo/j2ee/deployment/RefContext.java geronimo/trunk/modules/j2ee-builder/src/java/org/apache/geronimo/j2ee/deployment/ServiceReferenceBuilder.java geronimo/trunk/modules/j2ee-builder/src/test/org/apache/geronimo/j2ee/deployment/EJBRefContextTest.java geronimo/trunk/modules/jetty-builder/src/test/org/apache/geronimo/jetty/deployment/JettyModuleBuilderTest.java geronimo/trunk/modules/naming-builder/src/java/org/apache/geronimo/naming/deployment/ENCConfigBuilder.java geronimo/trunk/plugins/maven-xmlbeans-plugin/plugin.jelly geronimo/trunk/project.properties Modified: geronimo/trunk/modules/assembly/project.properties URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/assembly/project.properties?view=diff&r1=153301&r2=153302 ============================================================================== --- geronimo/trunk/modules/assembly/project.properties (original) +++ geronimo/trunk/modules/assembly/project.properties Thu Feb 10 16:04:46 2005 @@ -16,4 +16,5 @@ geronimo.assemble.delete.logs=true #controls whether to remove previous versions even if clean was not explicitly called -geronimo.assemble.clean=true \ No newline at end of file +geronimo.assemble.clean=true +#geronimo.assemble.minimal=true Modified: geronimo/trunk/modules/axis-builder/src/java/org/apache/geronimo/axis/builder/AxisBuilder.java URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/axis-builder/src/java/org/apache/geronimo/axis/builder/AxisBuilder.java?view=diff&r1=153301&r2=153302 ============================================================================== --- geronimo/trunk/modules/axis-builder/src/java/org/apache/geronimo/axis/builder/AxisBuilder.java (original) +++ geronimo/trunk/modules/axis-builder/src/java/org/apache/geronimo/axis/builder/AxisBuilder.java Thu Feb 10 16:04:46 2005 @@ -36,6 +36,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.Arrays; import java.util.jar.JarFile; import javax.wsdl.Binding; import javax.wsdl.BindingInput; @@ -48,6 +49,7 @@ import javax.wsdl.PortType; import javax.wsdl.Types; import javax.wsdl.WSDLException; +import javax.wsdl.Fault; import javax.wsdl.extensions.ExtensibilityElement; import javax.wsdl.extensions.UnknownExtensibilityElement; import javax.wsdl.extensions.soap.SOAPAddress; @@ -79,6 +81,7 @@ import javax.xml.rpc.holders.ShortHolder; import javax.xml.rpc.holders.ShortWrapperHolder; import javax.xml.rpc.holders.StringHolder; +import javax.xml.rpc.handler.HandlerInfo; import net.sf.cglib.core.DefaultGeneratorStrategy; import net.sf.cglib.proxy.Callback; @@ -90,13 +93,15 @@ import org.apache.axis.client.Service; import org.apache.axis.description.OperationDesc; import org.apache.axis.description.ParameterDesc; +import org.apache.axis.description.FaultDesc; import org.apache.axis.encoding.ser.ArrayDeserializerFactory; import org.apache.axis.encoding.ser.ArraySerializerFactory; import org.apache.axis.encoding.ser.BeanDeserializerFactory; import org.apache.axis.encoding.ser.BeanSerializerFactory; -import org.apache.axis.enum.Style; -import org.apache.axis.enum.Use; import org.apache.axis.soap.SOAPConstants; +import org.apache.axis.constants.Style; +import org.apache.axis.constants.Use; +import org.apache.axis.handlers.HandlerInfoChainFactory; import org.apache.geronimo.axis.client.GenericServiceEndpointWrapper; import org.apache.geronimo.axis.client.NoOverrideCallbackFilter; import org.apache.geronimo.axis.client.OperationInfo; @@ -125,6 +130,11 @@ import org.apache.geronimo.xbeans.j2ee.ServiceEndpointMethodMappingType; import org.apache.geronimo.xbeans.j2ee.WsdlMessageMappingType; import org.apache.geronimo.xbeans.j2ee.WsdlReturnValueMappingType; +import org.apache.geronimo.xbeans.j2ee.ExceptionMappingType; +import org.apache.geronimo.xbeans.j2ee.ConstructorParameterOrderType; +import org.apache.geronimo.xbeans.j2ee.ServiceRefHandlerType; +import org.apache.geronimo.xbeans.j2ee.ParamValueType; +import org.apache.geronimo.xbeans.j2ee.XsdQNameType; import org.apache.geronimo.schema.SchemaConversionUtils; import org.apache.xmlbeans.XmlException; import org.apache.xmlbeans.XmlObject; @@ -132,6 +142,8 @@ import org.objectweb.asm.Type; import org.w3.x2001.xmlSchema.SchemaDocument; import org.w3.x2001.xmlSchema.ComplexType; +import org.w3.x2001.xmlSchema.ExplicitGroup; +import org.w3.x2001.xmlSchema.LocalElement; import org.w3c.dom.Element; import org.xml.sax.InputSource; @@ -161,7 +173,7 @@ return new ServiceReference(enhanced, null, null, null); } - public Object createService(Class serviceInterface, URI wsdlURI, URI jaxrpcMappingURI, QName serviceQName, Map portComponentRefMap, List handlers, DeploymentContext deploymentContext, Module module, ClassLoader classLoader) throws DeploymentException { + public Object createService(Class serviceInterface, URI wsdlURI, URI jaxrpcMappingURI, QName serviceQName, Map portComponentRefMap, List handlerInfos, DeploymentContext deploymentContext, Module module, ClassLoader classLoader) throws DeploymentException { JarFile moduleFile = module.getModuleFile(); Definition definition = null; JavaWsdlMappingType mapping = null; @@ -198,7 +210,7 @@ mapping = mappingDocument.getJavaWsdlMapping(); } - Object service = createService(serviceInterface, definition, mapping, serviceQName, SOAP_VERSION, deploymentContext, module, classLoader); + Object service = createService(serviceInterface, definition, mapping, serviceQName, SOAP_VERSION, handlerInfos, deploymentContext, module, classLoader); ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = null; try { @@ -213,12 +225,12 @@ return reference; } - public Object createService(Class serviceInterface, Definition definition, JavaWsdlMappingType mapping, QName serviceQName, SOAPConstants soapVersion, DeploymentContext context, Module module, ClassLoader classloader) throws DeploymentException { + public Object createService(Class serviceInterface, Definition definition, JavaWsdlMappingType mapping, QName serviceQName, SOAPConstants soapVersion, List handlerInfos, DeploymentContext context, Module module, ClassLoader classloader) throws DeploymentException { Map seiPortNameToFactoryMap = new HashMap(); Map seiClassNameToFactoryMap = new HashMap(); Object serviceInstance = createService(serviceInterface, seiPortNameToFactoryMap, seiClassNameToFactoryMap, context, module, classloader); if (definition != null) { - buildSEIFactoryMap(serviceInterface, definition, mapping, serviceQName, soapVersion, seiPortNameToFactoryMap, seiClassNameToFactoryMap, serviceInstance, context, module, classloader); + buildSEIFactoryMap(serviceInterface, definition, mapping, handlerInfos, serviceQName, soapVersion, seiPortNameToFactoryMap, seiClassNameToFactoryMap, serviceInstance, context, module, classloader); } return serviceInstance; } @@ -255,7 +267,7 @@ } } - public void buildSEIFactoryMap(Class serviceInterface, Definition definition, JavaWsdlMappingType mapping, QName serviceQName, SOAPConstants soapVersion, Map seiPortNameToFactoryMap, Map seiClassNameToFactoryMap, Object serviceImpl, DeploymentContext context, Module module, ClassLoader classLoader) throws DeploymentException { + public void buildSEIFactoryMap(Class serviceInterface, Definition definition, JavaWsdlMappingType mapping, List handlerInfos, QName serviceQName, SOAPConstants soapVersion, Map seiPortNameToFactoryMap, Map seiClassNameToFactoryMap, Object serviceImpl, DeploymentContext context, Module module, ClassLoader classLoader) throws DeploymentException { //find the service we are working with javax.wsdl.Service service; @@ -275,6 +287,7 @@ Map wsdlPortMap = service.getPorts(); Map complexTypeMap = getComplexTypesInWsdl(definition); + Map exceptionMap = getExceptionMap(mapping); for (Iterator iterator = wsdlPortMap.entrySet().iterator(); iterator.hasNext();) { Map.Entry entry = (Map.Entry) iterator.next(); @@ -319,7 +332,7 @@ operationInfos[i++] = operationInfo; } List typeMappings = new ArrayList(); - seiFactory = createSEIFactory(enhancedServiceEndpointClass, serviceImpl, typeMappings, location, operationInfos, context, classLoader); + seiFactory = createSEIFactory(portName, enhancedServiceEndpointClass, serviceImpl, typeMappings, location, operationInfos, handlerInfos, context, classLoader); } else { //complete jaxrpc mapping file supplied QName portTypeQName = portType.getQName(); @@ -338,7 +351,7 @@ Operation operation = (Operation) ops.next(); BindingOperation bindingOperation = binding.getBindingOperation(operation.getName(), operation.getInput().getName(), operation.getOutput() == null ? null : operation.getOutput().getName()); ServiceEndpointMethodMappingType methodMapping = getMethodMappingForOperation(operation, methodMappings); - OperationInfo operationInfo = buildOperationInfoHeavyweight(methodMapping, bindingOperation, portStyle, soapVersion, complexTypeMap, mapping, classLoader); + OperationInfo operationInfo = buildOperationInfoHeavyweight(methodMapping, bindingOperation, portStyle, soapVersion, exceptionMap, complexTypeMap, mapping, classLoader); operationInfos[i++] = operationInfo; } JavaXmlTypeMappingType[] javaXmlTypeMappings = mapping.getJavaXmlTypeMappingArray(); @@ -380,13 +393,26 @@ } - seiFactory = createSEIFactory(enhancedServiceEndpointClass, serviceImpl, typeMappings, location, operationInfos, context, classLoader); + seiFactory = createSEIFactory(portName, enhancedServiceEndpointClass, serviceImpl, typeMappings, location, operationInfos, handlerInfos, context, classLoader); } seiPortNameToFactoryMap.put(portName, seiFactory); seiClassNameToFactoryMap.put(serviceEndpointInterface.getName(), seiFactory); } } + private Map getExceptionMap(JavaWsdlMappingType mapping) { + Map exceptionMap = new HashMap(); + if (mapping != null) { + ExceptionMappingType[] exceptionMappings = mapping.getExceptionMappingArray(); + for (int i = 0; i < exceptionMappings.length; i++) { + ExceptionMappingType exceptionMapping = exceptionMappings[i]; + QName exceptionMessageQName = exceptionMapping.getWsdlMessage().getQNameValue(); + exceptionMap.put(exceptionMessageQName, exceptionMapping); + } + } + return exceptionMap; + } + private ServiceEndpointMethodMappingType getMethodMappingForOperation(Operation operation, ServiceEndpointMethodMappingType[] methodMappings) throws DeploymentException { String operationName = operation.getName(); for (int i = 0; i < methodMappings.length; i++) { @@ -465,16 +491,32 @@ throw new DeploymentException("Namespace " + namespace + " was not mapped in jaxrpc mapping file"); } - public SEIFactory createSEIFactory(Class enhancedServiceEndpointClass, Object serviceImpl, List typeMappings, URL location, OperationInfo[] operationInfos, DeploymentContext deploymentContext, ClassLoader classLoader) throws DeploymentException { - + public SEIFactory createSEIFactory(String portName, Class enhancedServiceEndpointClass, Object serviceImpl, List typeMappings, URL location, OperationInfo[] operationInfos, List handlerInfos, DeploymentContext deploymentContext, ClassLoader classLoader) throws DeploymentException { + HandlerInfoChainFactory handlerInfoChainFactory = buildHandlerInfosForPort(portName, handlerInfos); try { - SEIFactory factory = new SEIFactoryImpl(enhancedServiceEndpointClass, operationInfos, serviceImpl, typeMappings, location, classLoader); + SEIFactory factory = new SEIFactoryImpl(portName, enhancedServiceEndpointClass, operationInfos, serviceImpl, typeMappings, location, handlerInfoChainFactory, classLoader); return factory; } catch (ClassNotFoundException e) { throw new DeploymentException("Could not load GenericServiceEndpoint from application classloader", e); } } + private HandlerInfoChainFactory buildHandlerInfosForPort(String portName, List handlerInfoInfos) { + List handlerInfos = new ArrayList(); + for (Iterator iterator = handlerInfoInfos.iterator(); iterator.hasNext();) { + HandlerInfoInfo handlerInfoInfo = (HandlerInfoInfo) iterator.next(); + Set portNames = handlerInfoInfo.getPortNames(); + if (portNames.isEmpty() || portNames.contains(portName)) { + HandlerInfo handlerInfo = new HandlerInfo(handlerInfoInfo.getHandlerClass(), handlerInfoInfo.getHandlerConfig(), handlerInfoInfo.getSoapHeaders()); + handlerInfos.add(handlerInfo); + + //TODO what about the soap roles?? + } + } + HandlerInfoChainFactory handlerInfoChainFactory = new HandlerInfoChainFactory(handlerInfos); + return handlerInfoChainFactory; + } + public Class enhanceServiceEndpointInterface(Class serviceEndpointInterface, DeploymentContext deploymentContext, Module module, ClassLoader classLoader) throws DeploymentException { Enhancer enhancer = new Enhancer(); enhancer.setClassLoader(classLoader); @@ -519,17 +561,14 @@ throw new DeploymentException("Lightweight mapping has at most one part in the (optional) output message, not: " + outputMessage.getParts().size()); } Class[] methodParamTypes = method.getParameterTypes(); - //TODO investigate getOrderedParts - Map inputParts = inputMessage.getParts(); + List inputParts = inputMessage.getOrderedParts(null); if (methodParamTypes.length != inputParts.size()) { throw new DeploymentException("mismatch in parameter counts: method has " + methodParamTypes.length + " whereas the input message has " + inputParts.size()); } int i = 0; - for (Iterator parts = inputParts.entrySet().iterator(); parts.hasNext();) { - //TODO HOW IS THIS SUPPOSED TO WORK????? is the map ordered? - Map.Entry entry = (Map.Entry) parts.next(); - String partName = (String) entry.getKey(); - Part part = (Part) entry.getValue(); + for (Iterator parts = inputParts.iterator(); parts.hasNext();) { + Part part = (Part) parts.next(); + String partName = part.getName(); QName name = new QName("", partName); byte mode = ParameterDesc.IN; QName typeQName = part.getTypeName() == null ? part.getElementName() : part.getTypeName(); @@ -578,7 +617,7 @@ return operationInfo; } - public OperationInfo buildOperationInfoHeavyweight(ServiceEndpointMethodMappingType methodMapping, BindingOperation bindingOperation, Style defaultStyle, SOAPConstants soapVersion, Map complexTypeMap, JavaWsdlMappingType mapping, ClassLoader classLoader) throws DeploymentException { + public OperationInfo buildOperationInfoHeavyweight(ServiceEndpointMethodMappingType methodMapping, BindingOperation bindingOperation, Style defaultStyle, SOAPConstants soapVersion, Map exceptionMap, Map complexTypeMap, JavaWsdlMappingType mapping, ClassLoader classLoader) throws DeploymentException { //TODO how can bindingOperation be null? Operation operation = bindingOperation.getOperation(); @@ -663,7 +702,7 @@ QName partQName = isWrappedElement ? part.getElementName() : new QName("", part.getName()); QName partTypeQName = part.getTypeName(); - //use complexTypeMap + //use complexTypeMap boolean isComplexType = complexTypeMap.containsKey(partTypeQName); String paramJavaTypeName = paramMapping.getParamType().getStringValue().trim(); Class actualParamJavaType = getHolderType(paramJavaTypeName, mode, partTypeQName, isComplexType, mapping, classLoader); @@ -748,15 +787,81 @@ operationDesc.setStyle(style); operationDesc.setUse(use); //TODO add faults -// TFault[] faults = tOperation.getFaultArray(); -// for (int i = 0; i < faults.length; i++) { -// TFault fault = faults[i]; -// QName faultQName = new QName("", fault.getName()); -// String className = ; -// QName faultTypeQName = ; -// boolean isComplex = ; -// FaultDesc faultDesc = new FaultDesc(faultQName, className, faultTypeQName, isComplex) -// } + + Map faultMap = operation.getFaults(); + for (Iterator iterator = faultMap.entrySet().iterator(); iterator.hasNext();) { + Map.Entry entry = (Map.Entry) iterator.next(); + String faultName = (String) entry.getKey(); + Fault fault = (Fault) entry.getValue(); + Message message = fault.getMessage(); + QName messageQName = message.getQName(); + ExceptionMappingType exceptionMapping = (ExceptionMappingType) exceptionMap.get(messageQName); + if (exceptionMapping == null) { + throw new DeploymentException("No exception mapping for fault " + faultName + " and fault message " + messageQName + " for operation " + operationName); + } + String className = exceptionMapping.getExceptionType().getStringValue().trim(); + //this is weird, but I can't figure out what it should be. + QName faultQName = new QName("", faultName); + Part part; + if (exceptionMapping.isSetWsdlMessagePartName()) { + //According to schema documentation, this will only be set when several headerfaults use the same message. + String headerFaultMessagePartName = exceptionMapping.getWsdlMessagePartName().getStringValue(); + part = message.getPart(headerFaultMessagePartName); + } else { + part= (Part) message.getOrderedParts(null).iterator().next(); + } + QName faultTypeQName = part.getElementName() == null? part.getTypeName(): part.getElementName(); + boolean isComplex = part.getTypeName() != null && complexTypeMap.containsKey(part.getTypeName()); + FaultDesc faultDesc = new FaultDesc(faultQName, className, faultTypeQName, isComplex); + + //constructor parameters + if (exceptionMapping.isSetConstructorParameterOrder()) { + if (!isComplex) { + throw new DeploymentException("ConstructorParameterOrder can only be set for complex types, not " + faultTypeQName); + } + ComplexType complexType = (ComplexType) complexTypeMap.get(part.getTypeName()); + Map elementMap = new HashMap(); + ExplicitGroup explicitGroup = complexType.getSequence(); + LocalElement[] elements = explicitGroup.getElementArray(); + for (int i = 0; i < elements.length; i++) { + LocalElement element = elements[i]; + String elementName = element.getName(); + QName elementType = element.getType(); + elementMap.put(elementName, elementType); + } + ArrayList parameterTypes = new ArrayList(); + ConstructorParameterOrderType constructorParameterOrder = exceptionMapping.getConstructorParameterOrder(); + for (int i = 0; i < constructorParameterOrder.getElementNameArray().length; i++) { + String elementName = constructorParameterOrder.getElementNameArray(i).getStringValue().trim(); + QName elementType = (QName) elementMap.get(elementName); + String javaElementTypeName; + if (complexTypeMap.containsKey(elementType)) { + String packageName = getPackageFromNamespace(elementType.getNamespaceURI(), mapping); + javaElementTypeName = packageName + "." + elementType.getLocalPart(); + } else { + //TODO finish this + if (elementType.getLocalPart().equals("String")) { + javaElementTypeName = String.class.getName(); + } else { + throw new DeploymentException("most simple exception constructor types not yet implemented"); + } + } + Class javaElementType; + try { + javaElementType = ClassLoading.loadClass(javaElementTypeName, classLoader); + } catch (ClassNotFoundException e) { + throw new DeploymentException("Could not load exception constructor parameter", e); + } + //todo faultTypeQName is speculative + //todo outheader might be true! + ParameterDesc parameterDesc = new ParameterDesc(faultTypeQName, ParameterDesc.OUT, elementType, javaElementType, false, false); + parameterTypes.add(parameterDesc); + } + faultDesc.setParameters(parameterTypes); + } + operationDesc.addFault(faultDesc); + } + boolean usesSOAPAction = (soapActionURI != null); QName operationQName = new QName("", operation.getName()); @@ -766,6 +871,15 @@ return operationInfo; } + /** + * Find all the top level complex types in the schemas in the definitions' types. + * Put them in a map from complex type QName to schema fragment. + * TODO it is not clear what happens with included schemas. + * + * @param definition + * @return + * @throws DeploymentException + */ Map getComplexTypesInWsdl(Definition definition) throws DeploymentException { Map complexTypeMap = new HashMap(); Types types = definition.getTypes(); @@ -785,8 +899,8 @@ try { cursor.toFirstContentToken(); for (Iterator namespaces = namespaceMap.entrySet().iterator(); namespaces.hasNext();) { - Map.Entry entry = (Map.Entry) namespaces.next(); - cursor.insertNamespace((String)entry.getKey(), (String)entry.getValue()); + Map.Entry entry = (Map.Entry) namespaces.next(); + cursor.insertNamespace((String) entry.getKey(), (String) entry.getValue()); } } finally { cursor.dispose(); @@ -843,6 +957,7 @@ private Class getHolderType(String paramJavaTypeName, byte mode, QName typeQName, boolean isComplexType, JavaWsdlMappingType mapping, ClassLoader classLoader) throws DeploymentException { Class paramJavaType = null; if (mode == ParameterDesc.IN) { + //IN parameters just use their own type try { paramJavaType = ClassLoading.loadClass(paramJavaTypeName, classLoader); } catch (ClassNotFoundException e) { @@ -850,15 +965,20 @@ } return paramJavaType; } else { + //INOUT and OUT parameters use holders. See jaxrpc spec 4.3.5 String holderName; if (isComplexType) { + //complex types get mapped: + //package is determined from the namespace to package map + ".holders" + //class name is the complex type QNMAne local part + "Holder", with the initial character uppercased. String namespace = typeQName.getNamespaceURI(); - String packageName = getPackageFromNamespace(namespace, mapping); - StringBuffer buf = new StringBuffer(packageName.length() + typeQName.getLocalPart().length() + 14); - buf.append(packageName).append(".holders.").append(typeQName.getLocalPart()).append("Holder"); - buf.setCharAt(packageName.length() + 9, Character.toUpperCase(typeQName.getLocalPart().charAt(0))); - holderName = buf.toString(); + String packageName = getPackageFromNamespace(namespace, mapping); + StringBuffer buf = new StringBuffer(packageName.length() + typeQName.getLocalPart().length() + 14); + buf.append(packageName).append(".holders.").append(typeQName.getLocalPart()).append("Holder"); + buf.setCharAt(packageName.length() + 9, Character.toUpperCase(typeQName.getLocalPart().charAt(0))); + holderName = buf.toString(); } else { + //see if it is in the primitive type and simple type mapping try { paramJavaType = ClassLoading.loadClass(paramJavaTypeName, classLoader); } catch (ClassNotFoundException e) { @@ -868,6 +988,9 @@ if (holder != null) { return holder; } + //Otherwise, the holder must be in: + //package same as type's package + ".holders" + //class name same as type name + "Holder" String paramTypeName = paramJavaType.getName(); StringBuffer buf = new StringBuffer(paramTypeName.length() + 14); int dot = paramTypeName.lastIndexOf("."); Modified: geronimo/trunk/modules/axis-builder/src/test/org/apache/geronimo/axis/builder/ServiceReferenceTest.java URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/axis-builder/src/test/org/apache/geronimo/axis/builder/ServiceReferenceTest.java?view=diff&r1=153301&r2=153302 ============================================================================== --- geronimo/trunk/modules/axis-builder/src/test/org/apache/geronimo/axis/builder/ServiceReferenceTest.java (original) +++ geronimo/trunk/modules/axis-builder/src/test/org/apache/geronimo/axis/builder/ServiceReferenceTest.java Thu Feb 10 16:04:46 2005 @@ -51,8 +51,8 @@ import javax.xml.rpc.Service; import junit.framework.TestCase; -import org.apache.axis.enum.Style; import org.apache.axis.soap.SOAPConstants; +import org.apache.axis.constants.Style; import org.apache.geronimo.axis.builder.bookquote.BookQuote; import org.apache.geronimo.axis.builder.bookquote.BookQuoteService; import org.apache.geronimo.axis.builder.interop.InteropLab; @@ -89,6 +89,7 @@ private final String operationName = "doMockOperation"; private final File wsdlDir = new File(basedir, "src/test-resources/interop"); private final File wsdlFile = new File(wsdlDir, "interop.wsdl"); + private List handlerInfos = new ArrayList(); private Module module; @@ -150,7 +151,8 @@ OperationInfo op = buildOperationInfoForMockOperation(builder); OperationInfo[] operationInfos = new OperationInfo[]{op}; Class serviceEndpointClass = builder.enhanceServiceEndpointInterface(MockPort.class, context, module, isolatedCl); - SEIFactory serviceInterfaceFactory = builder.createSEIFactory(serviceEndpointClass, serviceInstance, typeMappings, location, operationInfos, context, isolatedCl); + String portName = "foo"; + SEIFactory serviceInterfaceFactory = builder.createSEIFactory(portName, serviceEndpointClass, serviceInstance, typeMappings, location, operationInfos, handlerInfos, context, isolatedCl); assertNotNull(serviceInterfaceFactory); Remote serviceInterface = serviceInterfaceFactory.createServiceEndpoint(); assertTrue(serviceInterface instanceof MockPort); @@ -169,7 +171,7 @@ JavaWsdlMappingType mapping = buildLightweightMappingType(); QName serviceQName = new QName(NAMESPACE, "MockService"); AxisBuilder builder = new AxisBuilder(); - Object proxy = builder.createService(MockService.class, definition, mapping, serviceQName, SOAPConstants.SOAP11_CONSTANTS, context, module, isolatedCl); + Object proxy = builder.createService(MockService.class, definition, mapping, serviceQName, SOAPConstants.SOAP11_CONSTANTS, handlerInfos, context, module, isolatedCl); assertNotNull(proxy); assertTrue(proxy instanceof MockService); MockPort mockPort = ((MockService) proxy).getMockPort(); @@ -186,7 +188,7 @@ JavaWsdlMappingType mapping = mappingDocument.getJavaWsdlMapping(); QName serviceQName = new QName("http://www.Monson-Haefel.com/jwsbook/BookQuote", "BookQuoteService"); AxisBuilder builder = new AxisBuilder(); - Object proxy = builder.createService(BookQuoteService.class, definition, mapping, serviceQName, SOAPConstants.SOAP11_CONSTANTS, context, module, isolatedCl); + Object proxy = builder.createService(BookQuoteService.class, definition, mapping, serviceQName, SOAPConstants.SOAP11_CONSTANTS, handlerInfos, context, module, isolatedCl); assertNotNull(proxy); assertTrue(proxy instanceof BookQuoteService); BookQuote bookQuote = ((BookQuoteService) proxy).getBookQuotePort(); @@ -203,7 +205,7 @@ JavaWsdlMappingType mapping = mappingDocument.getJavaWsdlMapping(); QName serviceQName = new QName("http://tempuri.org/4s4c/1/3/wsdl/def/interopLab", "interopLab"); AxisBuilder builder = new AxisBuilder(); - Object proxy = builder.createService(InteropLab.class, definition, mapping, serviceQName, SOAPConstants.SOAP11_CONSTANTS, context, module, isolatedCl); + Object proxy = builder.createService(InteropLab.class, definition, mapping, serviceQName, SOAPConstants.SOAP11_CONSTANTS, handlerInfos, context, module, isolatedCl); assertNotNull(proxy); assertTrue(proxy instanceof InteropLab); InteropTestPortType interopTestPort = ((InteropLab) proxy).getinteropTestPort(); Modified: geronimo/trunk/modules/axis-builder/src/test/org/apache/geronimo/axis/builder/mock/MockSEIFactory.java URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/axis-builder/src/test/org/apache/geronimo/axis/builder/mock/MockSEIFactory.java?view=diff&r1=153301&r2=153302 ============================================================================== --- geronimo/trunk/modules/axis-builder/src/test/org/apache/geronimo/axis/builder/mock/MockSEIFactory.java (original) +++ geronimo/trunk/modules/axis-builder/src/test/org/apache/geronimo/axis/builder/mock/MockSEIFactory.java Thu Feb 10 16:04:46 2005 @@ -19,6 +19,7 @@ import java.rmi.Remote; import javax.xml.rpc.Service; +import javax.xml.rpc.handler.HandlerChain; import org.apache.geronimo.axis.client.SEIFactory; @@ -28,5 +29,9 @@ public class MockSEIFactory implements SEIFactory { public Remote createServiceEndpoint() { return new MockPortImpl(); + } + + public HandlerChain createHandlerChain() { + return null; } } Modified: geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/GenericServiceEndpoint.java URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/GenericServiceEndpoint.java?view=diff&r1=153301&r2=153302 ============================================================================== --- geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/GenericServiceEndpoint.java (original) +++ geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/GenericServiceEndpoint.java Thu Feb 10 16:04:46 2005 @@ -20,6 +20,8 @@ import java.util.Iterator; import java.util.List; +import javax.xml.namespace.QName; + import org.apache.axis.AxisFault; import org.apache.axis.NoEndPointException; import org.apache.axis.client.Call; @@ -32,10 +34,11 @@ private final List typeMappings; - public GenericServiceEndpoint(Service service, List typeMappings, URL location) { + public GenericServiceEndpoint(QName portQName, Service service, List typeMappings, URL location) { this.service = service; this.typeMappings = typeMappings; cachedEndpoint = location; + cachedPortName = portQName; } Call createCall() throws java.rmi.RemoteException { Modified: geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/GenericServiceEndpointWrapper.java URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/GenericServiceEndpointWrapper.java?view=diff&r1=153301&r2=153302 ============================================================================== --- geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/GenericServiceEndpointWrapper.java (original) +++ geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/GenericServiceEndpointWrapper.java Thu Feb 10 16:04:46 2005 @@ -23,7 +23,6 @@ import org.apache.axis.message.SOAPHeaderElement; import org.apache.axis.client.Call; -import org.apache.axis.AxisFault; import org.apache.axis.NoEndPointException; /** Added: geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/GeronimoAxisClient.java URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/GeronimoAxisClient.java?view=auto&rev=153302 ============================================================================== --- geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/GeronimoAxisClient.java (added) +++ geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/GeronimoAxisClient.java Thu Feb 10 16:04:46 2005 @@ -0,0 +1,57 @@ +/** + * + * Copyright 2003-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.client; + +import java.util.Map; +import javax.xml.namespace.QName; +import javax.xml.rpc.handler.HandlerChain; + +import org.apache.axis.MessageContext; +import org.apache.axis.EngineConfiguration; +import org.apache.axis.client.AxisClient; +import org.apache.axis.client.Call; +import org.apache.axis.handlers.HandlerInfoChainFactory; + +/** + * @version $Rev: $ $Date: $ + */ +public class GeronimoAxisClient extends AxisClient { + + private final Map portNameToSEIFactoryMap; + + public GeronimoAxisClient(EngineConfiguration engineConfiguration, Map portNameToSEIFactoryMap) { + super(engineConfiguration); + this.portNameToSEIFactoryMap = portNameToSEIFactoryMap; + } + + protected HandlerChain getJAXRPChandlerChain(MessageContext context) { + + QName portQName = (QName) context.getProperty(Call.WSDL_PORT_NAME); + if(portQName == null) { + throw new RuntimeException("No port name supplied"); + } + String portName = portQName.getLocalPart(); + + SEIFactory seiFactory = (SEIFactory) portNameToSEIFactoryMap.get(portName); + if (seiFactory == null) { + return null; + } + HandlerChain handlerChain = seiFactory.createHandlerChain(); + return handlerChain; + + } +} Modified: geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/SEIFactory.java URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/SEIFactory.java?view=diff&r1=153301&r2=153302 ============================================================================== --- geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/SEIFactory.java (original) +++ geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/SEIFactory.java Thu Feb 10 16:04:46 2005 @@ -17,8 +17,8 @@ package org.apache.geronimo.axis.client; import java.rmi.Remote; -import javax.xml.rpc.Service; import javax.xml.rpc.ServiceException; +import javax.xml.rpc.handler.HandlerChain; /** * @version $Rev: $ $Date: $ @@ -26,5 +26,6 @@ public interface SEIFactory { Remote createServiceEndpoint() throws ServiceException; - + + HandlerChain createHandlerChain(); } Modified: geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/SEIFactoryImpl.java URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/SEIFactoryImpl.java?view=diff&r1=153301&r2=153302 ============================================================================== --- geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/SEIFactoryImpl.java (original) +++ geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/SEIFactoryImpl.java Thu Feb 10 16:04:46 2005 @@ -24,6 +24,8 @@ import java.util.List; import java.net.URL; import javax.xml.rpc.ServiceException; +import javax.xml.rpc.handler.HandlerChain; +import javax.xml.namespace.QName; import net.sf.cglib.proxy.Callback; import net.sf.cglib.proxy.Enhancer; @@ -32,6 +34,7 @@ import net.sf.cglib.reflect.FastClass; import net.sf.cglib.core.Signature; import org.apache.axis.client.Service; +import org.apache.axis.handlers.HandlerInfoChainFactory; /** * @version $Rev: $ $Date: $ @@ -39,15 +42,18 @@ public class SEIFactoryImpl implements SEIFactory, Serializable { private static final Class[] SERVICE_ENDPOINT_CONSTRUCTOR_TYPES = new Class[]{GenericServiceEndpoint.class}; + private final QName portQName; private final Class serviceEndpointClass; private final OperationInfo[] operationInfos; private transient final FastConstructor constructor; private final Object serviceImpl; private final List typeMappings; private final URL location; + private final HandlerInfoChainFactory handlerInfoChainFactory; private transient OperationInfo[] sortedOperationInfos; - public SEIFactoryImpl(Class serviceEndpointClass, OperationInfo[] operationInfos, Object serviceImpl, List typeMappings, URL location, ClassLoader classLoader) throws ClassNotFoundException { + public SEIFactoryImpl(String portName, Class serviceEndpointClass, OperationInfo[] operationInfos, Object serviceImpl, List typeMappings, URL location, HandlerInfoChainFactory handlerInfoChainFactory, ClassLoader classLoader) throws ClassNotFoundException { + this.portQName = new QName("", portName); this.serviceEndpointClass = serviceEndpointClass; this.operationInfos = operationInfos; Class[] constructorTypes = new java.lang.Class[0]; @@ -56,6 +62,7 @@ this.serviceImpl = serviceImpl; this.typeMappings = typeMappings; this.location = location; + this.handlerInfoChainFactory = handlerInfoChainFactory; sortedOperationInfos = new OperationInfo[FastClass.create(serviceEndpointClass).getMaxIndex() + 1]; for (int i = 0; i < operationInfos.length; i++) { OperationInfo operationInfo = operationInfos[i]; @@ -71,7 +78,7 @@ public Remote createServiceEndpoint() throws ServiceException { Service service = ((ServiceImpl)serviceImpl).getService(); - GenericServiceEndpoint serviceEndpoint = new GenericServiceEndpoint(service, typeMappings, location); + GenericServiceEndpoint serviceEndpoint = new GenericServiceEndpoint(portQName, service, typeMappings, location); Callback callback = new ServiceEndpointMethodInterceptor(serviceEndpoint, sortedOperationInfos); Callback[] callbacks = new Callback[]{SerializableNoOp.INSTANCE, callback}; Enhancer.registerCallbacks(serviceEndpointClass, callbacks); @@ -83,9 +90,14 @@ } } + public HandlerChain createHandlerChain() { + HandlerChain handlerChain = handlerInfoChainFactory.createHandlerChain(); + return handlerChain; + } + private Object readResolve() throws ObjectStreamException { try { - return new SEIFactoryImpl(serviceEndpointClass, operationInfos, serviceImpl, typeMappings, location, null); + return new SEIFactoryImpl(portQName.getLocalPart(), serviceEndpointClass, operationInfos, serviceImpl, typeMappings, location, handlerInfoChainFactory, null); } catch (ClassNotFoundException e) { throw new InvalidClassException(GenericServiceEndpoint.class.getName(), "this is impossible"); } Modified: geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/ServiceEndpointMethodInterceptor.java URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/ServiceEndpointMethodInterceptor.java?view=diff&r1=153301&r2=153302 ============================================================================== --- geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/ServiceEndpointMethodInterceptor.java (original) +++ geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/ServiceEndpointMethodInterceptor.java Thu Feb 10 16:04:46 2005 @@ -17,7 +17,6 @@ package org.apache.geronimo.axis.client; import java.lang.reflect.Method; -import java.io.Serializable; import java.util.Arrays; import net.sf.cglib.proxy.MethodInterceptor; Modified: geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/ServiceImpl.java URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/ServiceImpl.java?view=diff&r1=153301&r2=153302 ============================================================================== --- geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/ServiceImpl.java (original) +++ geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/ServiceImpl.java Thu Feb 10 16:04:46 2005 @@ -30,6 +30,10 @@ import javax.xml.rpc.handler.HandlerRegistry; import org.apache.axis.client.Service; +import org.apache.axis.client.AxisClient; +import org.apache.axis.EngineConfiguration; +import org.apache.axis.configuration.EngineConfigurationFactoryFinder; +import org.apache.axis.configuration.FileProvider; /** @@ -38,13 +42,24 @@ public class ServiceImpl implements javax.xml.rpc.Service, Serializable { private transient Service delegate; - private Map seiClassNameToFactoryMap; + private final Map seiClassNameToFactoryMap; private final Map portToImplementationMap; public ServiceImpl(Map portToImplementationMap, Map seiClassNameToFactoryMap) { this.portToImplementationMap = portToImplementationMap; this.seiClassNameToFactoryMap = seiClassNameToFactoryMap; - this.delegate = new Service(); + buildDelegateService(); + } + + private void buildDelegateService() { + delegate = new Service(); + + EngineConfiguration engineConfiguration = delegate.getEngine().getConfig(); + //there must be a better way + ((FileProvider)engineConfiguration).setInputStream(AxisClient.class.getResourceAsStream("client-config.wsdd")); + GeronimoAxisClient engine = new GeronimoAxisClient(engineConfiguration, portToImplementationMap); + delegate.setEngine(engine); + delegate.setEngineConfiguration(engineConfiguration); } public Remote getPort(QName qName, Class portClass) throws ServiceException { @@ -122,7 +137,7 @@ private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { in.defaultReadObject(); - delegate = new Service(); + buildDelegateService(); } Service getService() { Modified: geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/ServiceMethodInterceptor.java URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/ServiceMethodInterceptor.java?view=diff&r1=153301&r2=153302 ============================================================================== --- geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/ServiceMethodInterceptor.java (original) +++ geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/ServiceMethodInterceptor.java Thu Feb 10 16:04:46 2005 @@ -16,12 +16,10 @@ */ package org.apache.geronimo.axis.client; +import java.io.Serializable; import java.lang.reflect.Method; import java.util.Map; -import java.io.Serializable; - import javax.xml.rpc.ServiceException; -import javax.xml.rpc.Service; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; Modified: geronimo/trunk/modules/axis/src/test/org/apache/geronimo/axis/testUtils/TestingUtils.java URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/axis/src/test/org/apache/geronimo/axis/testUtils/TestingUtils.java?view=diff&r1=153301&r2=153302 ============================================================================== --- geronimo/trunk/modules/axis/src/test/org/apache/geronimo/axis/testUtils/TestingUtils.java (original) +++ geronimo/trunk/modules/axis/src/test/org/apache/geronimo/axis/testUtils/TestingUtils.java Thu Feb 10 16:04:46 2005 @@ -45,6 +45,7 @@ import org.apache.geronimo.deployment.DeploymentContext; import org.apache.geronimo.common.DeploymentException; import org.apache.geronimo.jetty.JettyWebAppContext; +import org.apache.geronimo.xbeans.j2ee.ServiceRefHandlerType; import org.openejb.deployment.OpenEJBModuleBuilder; /** @@ -92,7 +93,7 @@ private static ServiceReferenceBuilder serviceReferenceBuilder = new ServiceReferenceBuilder() { //it could return a Service or a Reference, we don't care - public Object createService(Class serviceInterface, URI wsdlURI, URI jaxrpcMappingURI, QName serviceQName, Map portComponentRefMap, List handlers, DeploymentContext deploymentContext, Module module, ClassLoader classLoader) throws DeploymentException { + public Object createService(Class serviceInterface, URI wsdlURI, URI jaxrpcMappingURI, QName serviceQName, Map portComponentRefMap, List handlerInfos, DeploymentContext deploymentContext, Module module, ClassLoader classLoader) throws DeploymentException { return null; } }; Modified: geronimo/trunk/modules/connector-builder/src/test/org/apache/geronimo/connector/deployment/ConnectorModuleBuilderTest.java URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/connector-builder/src/test/org/apache/geronimo/connector/deployment/ConnectorModuleBuilderTest.java?view=diff&r1=153301&r2=153302 ============================================================================== --- geronimo/trunk/modules/connector-builder/src/test/org/apache/geronimo/connector/deployment/ConnectorModuleBuilderTest.java (original) +++ geronimo/trunk/modules/connector-builder/src/test/org/apache/geronimo/connector/deployment/ConnectorModuleBuilderTest.java Thu Feb 10 16:04:46 2005 @@ -73,6 +73,7 @@ import org.apache.geronimo.kernel.registry.BasicGBeanRegistry; import org.apache.geronimo.kernel.repository.Repository; import org.apache.geronimo.system.serverinfo.ServerInfo; +import org.apache.geronimo.xbeans.j2ee.ServiceRefHandlerType; import org.tranql.sql.jdbc.JDBCUtil; /** @@ -141,7 +142,7 @@ }; private ServiceReferenceBuilder serviceReferenceBuilder = new ServiceReferenceBuilder() { //it could return a Service or a Reference, we don't care - public Object createService(Class serviceInterface, URI wsdlURI, URI jaxrpcMappingURI, QName serviceQName, Map portComponentRefMap, List handlers, DeploymentContext deploymentContext, Module module, ClassLoader classLoader) { + public Object createService(Class serviceInterface, URI wsdlURI, URI jaxrpcMappingURI, QName serviceQName, Map portComponentRefMap, List handlerInfos, DeploymentContext deploymentContext, Module module, ClassLoader classLoader) { return null; } }; Modified: geronimo/trunk/modules/j2ee-builder/project.xml URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/j2ee-builder/project.xml?view=diff&r1=153301&r2=153302 ============================================================================== --- geronimo/trunk/modules/j2ee-builder/project.xml (original) +++ geronimo/trunk/modules/j2ee-builder/project.xml Thu Feb 10 16:04:46 2005 @@ -101,6 +101,12 @@ <version>${geronimo_spec_ejb_version}</version> </dependency> + <dependency> + <groupId>geronimo-spec</groupId> + <artifactId>geronimo-spec-jaxrpc</artifactId> + <version>${geronimo_spec_jaxrpc_version}</version> + </dependency> + <!-- test only --> <dependency> <groupId>cglib</groupId> Modified: geronimo/trunk/modules/j2ee-builder/src/java/org/apache/geronimo/j2ee/deployment/RefContext.java URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/j2ee-builder/src/java/org/apache/geronimo/j2ee/deployment/RefContext.java?view=diff&r1=153301&r2=153302 ============================================================================== --- geronimo/trunk/modules/j2ee-builder/src/java/org/apache/geronimo/j2ee/deployment/RefContext.java (original) +++ geronimo/trunk/modules/j2ee-builder/src/java/org/apache/geronimo/j2ee/deployment/RefContext.java Thu Feb 10 16:04:46 2005 @@ -36,6 +36,7 @@ import org.apache.geronimo.j2ee.j2eeobjectnames.NameFactory; import org.apache.geronimo.gbean.GBeanData; import org.apache.geronimo.deployment.DeploymentContext; +import org.apache.geronimo.xbeans.j2ee.ServiceRefHandlerType; /** * @version $Rev: 46019 $ $Date: 2004-09-14 02:56:06 -0700 (Tue, 14 Sep 2004) $ @@ -299,8 +300,8 @@ } } - public Object getServiceReference(Class serviceInterface, URI wsdlURI, URI jaxrpcMappingURI, QName serviceQName, Map portComponentRefMap, List handlers, DeploymentContext deploymentContext, Module module, ClassLoader classLoader) throws DeploymentException { - return serviceReferenceBuilder.createService(serviceInterface, wsdlURI, jaxrpcMappingURI, serviceQName, portComponentRefMap, handlers, deploymentContext, module, classLoader); + public Object getServiceReference(Class serviceInterface, URI wsdlURI, URI jaxrpcMappingURI, QName serviceQName, Map portComponentRefMap, List handlerInfos, DeploymentContext deploymentContext, Module module, ClassLoader classLoader) throws DeploymentException { + return serviceReferenceBuilder.createService(serviceInterface, wsdlURI, jaxrpcMappingURI, serviceQName, portComponentRefMap, handlerInfos, deploymentContext, module, classLoader); } private String getContainerId(URI module, String ejbLink, Map references) throws AmbiguousEJBRefException, UnknownEJBRefException { Modified: geronimo/trunk/modules/j2ee-builder/src/java/org/apache/geronimo/j2ee/deployment/ServiceReferenceBuilder.java URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/j2ee-builder/src/java/org/apache/geronimo/j2ee/deployment/ServiceReferenceBuilder.java?view=diff&r1=153301&r2=153302 ============================================================================== --- geronimo/trunk/modules/j2ee-builder/src/java/org/apache/geronimo/j2ee/deployment/ServiceReferenceBuilder.java (original) +++ geronimo/trunk/modules/j2ee-builder/src/java/org/apache/geronimo/j2ee/deployment/ServiceReferenceBuilder.java Thu Feb 10 16:04:46 2005 @@ -19,11 +19,13 @@ import java.net.URI; import java.util.Map; import java.util.List; +import java.util.Set; import javax.naming.Reference; import javax.xml.namespace.QName; import org.apache.geronimo.common.DeploymentException; import org.apache.geronimo.deployment.DeploymentContext; +import org.apache.geronimo.xbeans.j2ee.ServiceRefHandlerType; /** * @version $Rev$ $Date$ @@ -31,7 +33,43 @@ public interface ServiceReferenceBuilder { //it could return a Service or a Reference, we don't care - Object createService(Class serviceInterface, URI wsdlURI, URI jaxrpcMappingURI, QName serviceQName, Map portComponentRefMap, List handlers, DeploymentContext deploymentContext, Module module, ClassLoader classLoader) throws DeploymentException; + Object createService(Class serviceInterface, URI wsdlURI, URI jaxrpcMappingURI, QName serviceQName, Map portComponentRefMap, List handlerInfos, DeploymentContext deploymentContext, Module module, ClassLoader classLoader) throws DeploymentException; //TODO a locate port method for links. + + public class HandlerInfoInfo { + private final Set portNames; + private final Class handlerClass; + private final Map handlerConfig; + private final QName[] soapHeaders; + private final Set soapRoles; + + public HandlerInfoInfo(Set portNames, Class handlerClass, Map handlerConfig, QName[] soapHeaders, Set soapRoles) { + this.portNames = portNames; + this.handlerClass = handlerClass; + this.handlerConfig = handlerConfig; + this.soapHeaders = soapHeaders; + this.soapRoles = soapRoles; + } + + public Set getPortNames() { + return portNames; + } + + public Class getHandlerClass() { + return handlerClass; + } + + public Map getHandlerConfig() { + return handlerConfig; + } + + public QName[] getSoapHeaders() { + return soapHeaders; + } + + public Set getSoapRoles() { + return soapRoles; + } + } } Modified: geronimo/trunk/modules/j2ee-builder/src/test/org/apache/geronimo/j2ee/deployment/EJBRefContextTest.java URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/j2ee-builder/src/test/org/apache/geronimo/j2ee/deployment/EJBRefContextTest.java?view=diff&r1=153301&r2=153302 ============================================================================== --- geronimo/trunk/modules/j2ee-builder/src/test/org/apache/geronimo/j2ee/deployment/EJBRefContextTest.java (original) +++ geronimo/trunk/modules/j2ee-builder/src/test/org/apache/geronimo/j2ee/deployment/EJBRefContextTest.java Thu Feb 10 16:04:46 2005 @@ -30,6 +30,7 @@ import org.apache.geronimo.common.UnresolvedEJBRefException; import org.apache.geronimo.gbean.GBeanData; import org.apache.geronimo.deployment.DeploymentContext; +import org.apache.geronimo.xbeans.j2ee.ServiceRefHandlerType; /** * @version $Rev$ $Date$ @@ -200,7 +201,7 @@ } }, new ServiceReferenceBuilder() { //it could return a Service or a Reference, we don't care - public Object createService(Class serviceInterface, URI wsdlURI, URI jaxrpcMappingURI, QName serviceQName, Map portComponentRefMap, List handlers, DeploymentContext deploymentContext, Module module, ClassLoader classLoader) throws DeploymentException { + public Object createService(Class serviceInterface, URI wsdlURI, URI jaxrpcMappingURI, QName serviceQName, Map portComponentRefMap, List handlerInfos, DeploymentContext deploymentContext, Module module, ClassLoader classLoader) throws DeploymentException { return null; } }); Modified: geronimo/trunk/modules/jetty-builder/src/test/org/apache/geronimo/jetty/deployment/JettyModuleBuilderTest.java URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/jetty-builder/src/test/org/apache/geronimo/jetty/deployment/JettyModuleBuilderTest.java?view=diff&r1=153301&r2=153302 ============================================================================== --- geronimo/trunk/modules/jetty-builder/src/test/org/apache/geronimo/jetty/deployment/JettyModuleBuilderTest.java (original) +++ geronimo/trunk/modules/jetty-builder/src/test/org/apache/geronimo/jetty/deployment/JettyModuleBuilderTest.java Thu Feb 10 16:04:46 2005 @@ -64,6 +64,7 @@ import org.apache.geronimo.security.SecurityServiceImpl; import org.apache.geronimo.transaction.context.TransactionContextManager; import org.apache.geronimo.transaction.manager.TransactionManagerImpl; +import org.apache.geronimo.xbeans.j2ee.ServiceRefHandlerType; /** * @version $Rev$ $Date$ @@ -179,7 +180,7 @@ }, new ServiceReferenceBuilder() { //it could return a Service or a Reference, we don't care - public Object createService(Class serviceInterface, URI wsdlURI, URI jaxrpcMappingURI, QName serviceQName, Map portComponentRefMap, List handlers, DeploymentContext deploymentContext, Module module, ClassLoader classLoader) throws DeploymentException { + public Object createService(Class serviceInterface, URI wsdlURI, URI jaxrpcMappingURI, QName serviceQName, Map portComponentRefMap, List handlerInfos, DeploymentContext deploymentContext, Module module, ClassLoader classLoader) throws DeploymentException { return null; } })); Modified: geronimo/trunk/modules/naming-builder/src/java/org/apache/geronimo/naming/deployment/ENCConfigBuilder.java URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/naming-builder/src/java/org/apache/geronimo/naming/deployment/ENCConfigBuilder.java?view=diff&r1=153301&r2=153302 ============================================================================== --- geronimo/trunk/modules/naming-builder/src/java/org/apache/geronimo/naming/deployment/ENCConfigBuilder.java (original) +++ geronimo/trunk/modules/naming-builder/src/java/org/apache/geronimo/naming/deployment/ENCConfigBuilder.java Thu Feb 10 16:04:46 2005 @@ -28,6 +28,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.ArrayList; import javax.management.MalformedObjectNameException; import javax.management.ObjectName; import javax.naming.NamingException; @@ -40,9 +41,11 @@ import org.apache.geronimo.j2ee.deployment.EARContext; import org.apache.geronimo.j2ee.deployment.Module; import org.apache.geronimo.j2ee.deployment.RefContext; +import org.apache.geronimo.j2ee.deployment.ServiceReferenceBuilder; import org.apache.geronimo.j2ee.j2eeobjectnames.J2eeContext; import org.apache.geronimo.j2ee.j2eeobjectnames.NameFactory; import org.apache.geronimo.kernel.Kernel; +import org.apache.geronimo.kernel.ClassLoading; import org.apache.geronimo.naming.java.ComponentContextBuilder; import org.apache.geronimo.xbeans.geronimo.naming.GerEjbLocalRefType; import org.apache.geronimo.xbeans.geronimo.naming.GerEjbRefType; @@ -59,6 +62,8 @@ import org.apache.geronimo.xbeans.j2ee.ServiceRefHandlerType; import org.apache.geronimo.xbeans.j2ee.ServiceRefType; import org.apache.geronimo.xbeans.j2ee.XsdStringType; +import org.apache.geronimo.xbeans.j2ee.ParamValueType; +import org.apache.geronimo.xbeans.j2ee.XsdQNameType; /** * @version $Rev$ $Date$ @@ -84,7 +89,7 @@ ObjectName query = null; try { query = NameFactory.getComponentNameQuery(null, null, null, linkName, j2eeType, j2eeContext); - } catch(MalformedObjectNameException e) { + } catch (MalformedObjectNameException e) { throw new DeploymentException("Could not construct query for gbean name", e); } Set localMatches = context.listGBeans(query); @@ -186,11 +191,9 @@ if ("javax.mail.Session".equals(type)) { j2eeType = NameFactory.JAVA_MAIL_RESOURCE; - } - else if (JAXR_CONNECTION_FACTORY_CLASS.equals(type)) { + } else if (JAXR_CONNECTION_FACTORY_CLASS.equals(type)) { j2eeType = NameFactory.JAXR_CONNECTION_FACTORY; - } - else { + } else { j2eeType = NameFactory.JCA_MANAGED_CONNECTION_FACTORY; } String containerId = getResourceContainerId(name, j2eeType, uri, gerResourceRef, refContext, j2eeContext, earContext); @@ -215,7 +218,7 @@ } else if (gerResourceRef.isSetResourceLink()) { containerId = refContext.getConnectionFactoryContainerId(uri, gerResourceRef.getResourceLink().trim(), type, j2eeContext, context); } else if (gerResourceRef.isSetTargetName()) { - containerId = gerResourceRef.getTargetName().trim(); + containerId = gerResourceRef.getTargetName().trim(); } else { //construct name from components try { @@ -483,12 +486,11 @@ portComponentRefMap.put(serviceEndpointClass, portComponentLink); } } - //TODO this sucks, but the handlers aren't implemented yet anyway. - ServiceRefHandlerType[] handlerTypes = serviceRef.getHandlerArray(); - List handlers = Arrays.asList(handlerTypes); + ServiceRefHandlerType[] handlers = serviceRef.getHandlerArray(); + List handlerInfos = buildHandlerInfoList(handlers, cl); //we could get a Reference or the actual serializable Service back. - Object ref = refContext.getServiceReference(serviceInterface, wsdlURI, jaxrpcMappingURI, serviceQName, portComponentRefMap, handlers, earContext, module, cl); + Object ref = refContext.getServiceReference(serviceInterface, wsdlURI, jaxrpcMappingURI, serviceQName, portComponentRefMap, handlerInfos, earContext, module, cl); try { builder.bind(name, ref); } catch (NamingException e) { @@ -498,6 +500,42 @@ } + private static List buildHandlerInfoList(ServiceRefHandlerType[] handlers, ClassLoader classLoader) throws DeploymentException { + List handlerInfos = new ArrayList(); + for (int i = 0; i < handlers.length; i++) { + ServiceRefHandlerType handler = handlers[i]; + Set portNames = new HashSet(Arrays.asList(handler.getPortNameArray())); + String handlerClassName = handler.getHandlerClass().getStringValue().trim(); + Class handlerClass = null; + try { + handlerClass = ClassLoading.loadClass(handlerClassName, classLoader); + } catch (ClassNotFoundException e) { + throw new DeploymentException("Could not load handler class", e); + } + Map config = new HashMap(); + ParamValueType[] paramValues = handler.getInitParamArray(); + for (int j = 0; j < paramValues.length; j++) { + ParamValueType paramValue = paramValues[j]; + String paramName = paramValue.getParamName().getStringValue().trim(); + String paramStringValue = paramValue.getParamValue().getStringValue().trim(); + config.put(paramName, paramStringValue); + } + XsdQNameType[] soapHeaderQNames = handler.getSoapHeaderArray(); + QName[] headerQNames = new QName[soapHeaderQNames.length]; + for (int j = 0; j < soapHeaderQNames.length; j++) { + XsdQNameType soapHeaderQName = soapHeaderQNames[j]; + headerQNames[j] = soapHeaderQName.getQNameValue(); + } + Set soapRoles = new HashSet(); + for (int j = 0; j < handler.getSoapRoleArray().length; j++) { + String soapRole = handler.getSoapRoleArray(j).getStringValue().trim(); + soapRoles.add(soapRole); + } + ServiceReferenceBuilder.HandlerInfoInfo handlerInfoInfo = new ServiceReferenceBuilder.HandlerInfoInfo(portNames, handlerClass, config, headerQNames, soapRoles); + handlerInfos.add(handlerInfoInfo); + } + return handlerInfos; + } public static void assureEJBObjectInterface(String remote, ClassLoader cl) throws DeploymentException { assureInterface(remote, "javax.ejb.EJBObject", "Remote", cl); @@ -570,7 +608,7 @@ if (!URL.class.getName().equals(type) && !"javax.mail.Session".equals(type) - && !JAXR_CONNECTION_FACTORY_CLASS.equals(type) ) { + && !JAXR_CONNECTION_FACTORY_CLASS.equals(type)) { GerResourceRefType gerResourceRef = (GerResourceRefType) refMap.get(resourceRefType.getResRefName().getStringValue()); String containerId = getResourceContainerId(getStringValue(resourceRefType.getResRefName()), NameFactory.JCA_MANAGED_CONNECTION_FACTORY, uri, gerResourceRef, refContext, j2eeContext, earContext); Modified: geronimo/trunk/plugins/maven-xmlbeans-plugin/plugin.jelly URL: http://svn.apache.org/viewcvs/geronimo/trunk/plugins/maven-xmlbeans-plugin/plugin.jelly?view=diff&r1=153301&r2=153302 ============================================================================== --- geronimo/trunk/plugins/maven-xmlbeans-plugin/plugin.jelly (original) +++ geronimo/trunk/plugins/maven-xmlbeans-plugin/plugin.jelly Thu Feb 10 16:04:46 2005 @@ -62,9 +62,9 @@ <touch file="${uptodateFile}"/> </j:if> + <path id="maven.xmlbeans.compile.src.set" + location="${targetdir}"/> <j:if test="${context.antProject.getReference('maven.compile.src.set') != null}"> - <path id="maven.xmlbeans.compile.src.set" - location="${targetdir}"/> <maven:addPath id="maven.compile.src.set" refid="maven.xmlbeans.compile.src.set"/> </j:if> @@ -72,7 +72,9 @@ <echo message="Maven cannot find the generated sources unless you provide a dummy source directory in project.xml"/> </j:if> - + <!-- include the generated binary files from the current xmlbeans run --> + <maven:addPath id="maven.dependency.classpath" + refid="maven.xmlbeans.compile.src.set"/> </j:jelly> </define:tag> Modified: geronimo/trunk/project.properties URL: http://svn.apache.org/viewcvs/geronimo/trunk/project.properties?view=diff&r1=153301&r2=153302 ============================================================================== --- geronimo/trunk/project.properties (original) +++ geronimo/trunk/project.properties Thu Feb 10 16:04:46 2005 @@ -44,20 +44,26 @@ openejb/modules/*/project.xml,\ applications/*/project.xml,\ modules/*/project.xml,\ -activemq/modules/core/project.xml,\ -activemq/modules/gbean/project.xml,\ -activemq/modules/ra/project.xml,\ -activemq/stores/jdbm/project.xml,\ -howl/logger/project.xml,\ -tranql/*/project.xml +tranql/*/project.xml, +#itests/naming/client/project.xml,\ +#itests/naming/common/project.xml,\ +#itests/naming/ejb/project.xml,\ +#itests/naming/war/project.xml +#activemq/modules/*/project.xml,\ +#activemq/transports/*/project.xml,\ +#activemq/stores/*/project.xml, + +#howl/logger/project.xml,\ maven.multiproject.excludes=\ -itests/*/project.xml,\ openejb/modules/connector/project.xml,\ -openejb/modules/webadmin/project.xml +openejb/modules/webadmin/project.xml,\ +activemq/modules/*/project.xml,\ +sandbox/*/project.xml +#itests/*/project.xml,\ maven.idea.project.multiproject.includes=${maven.multiproject.includes} -maven.idea.project.multiproject.excludes=sandbox/*/project.xml +maven.idea.project.multiproject.excludes=${maven.multiproject.excludes} #if you are a committer on all these projects use e.g. -Dgeronimo.otherproject.cvs.access=:ext:djencks #if you are a committer on one of these projects set the appropriate property here or on the command line.