diff options
Diffstat (limited to 'sca-java-2.x/trunk/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/introspect/SpringXMLComponentTypeLoader.java')
-rw-r--r-- | sca-java-2.x/trunk/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/introspect/SpringXMLComponentTypeLoader.java | 408 |
1 files changed, 31 insertions, 377 deletions
diff --git a/sca-java-2.x/trunk/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/introspect/SpringXMLComponentTypeLoader.java b/sca-java-2.x/trunk/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/introspect/SpringXMLComponentTypeLoader.java index d25b0a9aea..2730ee3146 100644 --- a/sca-java-2.x/trunk/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/introspect/SpringXMLComponentTypeLoader.java +++ b/sca-java-2.x/trunk/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/introspect/SpringXMLComponentTypeLoader.java @@ -18,22 +18,6 @@ */ package org.apache.tuscany.sca.implementation.spring.introspect; -import static javax.xml.stream.XMLStreamConstants.END_ELEMENT; -import static javax.xml.stream.XMLStreamConstants.START_ELEMENT; -import static org.apache.tuscany.sca.implementation.spring.SpringImplementationConstants.BEAN_ELEMENT; -import static org.apache.tuscany.sca.implementation.spring.SpringImplementationConstants.CONSTRUCTORARG_ELEMENT; -import static org.apache.tuscany.sca.implementation.spring.SpringImplementationConstants.ENTRY_ELEMENT; -import static org.apache.tuscany.sca.implementation.spring.SpringImplementationConstants.IMPORT_ELEMENT; -import static org.apache.tuscany.sca.implementation.spring.SpringImplementationConstants.LIST_ELEMENT; -import static org.apache.tuscany.sca.implementation.spring.SpringImplementationConstants.MAP_ELEMENT; -import static org.apache.tuscany.sca.implementation.spring.SpringImplementationConstants.PROPERTY_ELEMENT; -import static org.apache.tuscany.sca.implementation.spring.SpringImplementationConstants.REF_ELEMENT; -import static org.apache.tuscany.sca.implementation.spring.SpringImplementationConstants.SCA_PROPERTY_ELEMENT; -import static org.apache.tuscany.sca.implementation.spring.SpringImplementationConstants.SCA_REFERENCE_ELEMENT; -import static org.apache.tuscany.sca.implementation.spring.SpringImplementationConstants.SCA_SERVICE_ELEMENT; -import static org.apache.tuscany.sca.implementation.spring.SpringImplementationConstants.SET_ELEMENT; -import static org.apache.tuscany.sca.implementation.spring.SpringImplementationConstants.VALUE_ELEMENT; - import java.io.File; import java.io.FileInputStream; import java.io.IOException; @@ -57,18 +41,12 @@ import java.util.jar.Manifest; import java.util.logging.Level; import java.util.logging.Logger; -import javax.xml.namespace.QName; -import javax.xml.stream.XMLInputFactory; -import javax.xml.stream.XMLStreamException; -import javax.xml.stream.XMLStreamReader; - import org.apache.tuscany.sca.assembly.AssemblyFactory; import org.apache.tuscany.sca.assembly.ComponentType; import org.apache.tuscany.sca.assembly.Multiplicity; import org.apache.tuscany.sca.assembly.Property; import org.apache.tuscany.sca.assembly.Reference; import org.apache.tuscany.sca.assembly.Service; -import org.apache.tuscany.sca.assembly.xml.PolicySubjectProcessor; import org.apache.tuscany.sca.contribution.Artifact; import org.apache.tuscany.sca.contribution.ContributionFactory; import org.apache.tuscany.sca.contribution.processor.ContributionReadException; @@ -77,6 +55,7 @@ import org.apache.tuscany.sca.contribution.resolver.ClassReference; import org.apache.tuscany.sca.contribution.resolver.ModelResolver; import org.apache.tuscany.sca.core.ExtensionPointRegistry; import org.apache.tuscany.sca.core.FactoryExtensionPoint; +import org.apache.tuscany.sca.core.UtilityExtensionPoint; import org.apache.tuscany.sca.implementation.java.JavaConstructorImpl; import org.apache.tuscany.sca.implementation.java.JavaElementImpl; import org.apache.tuscany.sca.implementation.java.JavaImplementation; @@ -88,6 +67,7 @@ import org.apache.tuscany.sca.implementation.spring.SpringPropertyElement; import org.apache.tuscany.sca.implementation.spring.SpringSCAPropertyElement; import org.apache.tuscany.sca.implementation.spring.SpringSCAReferenceElement; import org.apache.tuscany.sca.implementation.spring.SpringSCAServiceElement; +import org.apache.tuscany.sca.implementation.spring.xml.SpringXMLBeanDefinitionLoader; import org.apache.tuscany.sca.interfacedef.InvalidInterfaceException; import org.apache.tuscany.sca.interfacedef.java.JavaInterface; import org.apache.tuscany.sca.interfacedef.java.JavaInterfaceContract; @@ -96,7 +76,6 @@ import org.apache.tuscany.sca.interfacedef.util.JavaXMLMapper; import org.apache.tuscany.sca.monitor.Monitor; import org.apache.tuscany.sca.monitor.Problem; import org.apache.tuscany.sca.monitor.Problem.Severity; -import org.apache.tuscany.sca.policy.PolicyFactory; /** * Introspects a Spring XML application-context configuration file to create <implementation-spring../> @@ -108,24 +87,22 @@ public class SpringXMLComponentTypeLoader { private final static Logger log = Logger.getLogger(SpringXMLComponentTypeLoader.class.getName()); private ExtensionPointRegistry registry; - private XMLInputFactory xmlInputFactory; private ContributionFactory contributionFactory; private AssemblyFactory assemblyFactory; private JavaInterfaceFactory javaFactory; - private PolicyFactory policyFactory; - private PolicySubjectProcessor policyProcessor; private SpringBeanIntrospector beanIntrospector; + private SpringXMLBeanDefinitionLoader xmlBeanDefinitionLoader; + public SpringXMLComponentTypeLoader(ExtensionPointRegistry registry) { super(); this.registry = registry; FactoryExtensionPoint factories = registry.getExtensionPoint(FactoryExtensionPoint.class); this.assemblyFactory = factories.getFactory(AssemblyFactory.class); this.javaFactory = factories.getFactory(JavaInterfaceFactory.class); - this.policyFactory = factories.getFactory(PolicyFactory.class); - this.policyProcessor = new PolicySubjectProcessor(policyFactory); this.contributionFactory = factories.getFactory(ContributionFactory.class); - this.xmlInputFactory = factories.getFactory(XMLInputFactory.class); + this.xmlBeanDefinitionLoader = + registry.getExtensionPoint(UtilityExtensionPoint.class).getUtility(SpringXMLBeanDefinitionLoader.class); } /** @@ -194,7 +171,6 @@ public class SpringXMLComponentTypeLoader { */ private void loadFromXML(SpringImplementation implementation, ModelResolver resolver, ProcessorContext context) throws ContributionReadException { - XMLStreamReader reader; List<SpringBeanElement> beans = new ArrayList<SpringBeanElement>(); List<SpringSCAServiceElement> services = new ArrayList<SpringSCAServiceElement>(); List<SpringSCAReferenceElement> references = new ArrayList<SpringSCAReferenceElement>(); @@ -213,35 +189,27 @@ public class SpringXMLComponentTypeLoader { // The URI is used to uniquely identify the Implementation implementation.setURI(resource.toString()); - for (URL contextResource : contextResources) { - List<SpringBeanElement> appCxtBeans = new ArrayList<SpringBeanElement>(); - List<SpringSCAServiceElement> appCxtServices = new ArrayList<SpringSCAServiceElement>(); - List<SpringSCAReferenceElement> appCxtReferences = new ArrayList<SpringSCAReferenceElement>(); - List<SpringSCAPropertyElement> appCxtProperties = new ArrayList<SpringSCAPropertyElement>(); - reader = xmlInputFactory.createXMLStreamReader(contextResource.openStream()); - // Read the beans, services, references and properties for individual application context - Set<String> visited = new HashSet<String>(); - readContextDefinition(resolver, - reader, - contextPath, - visited, - appCxtBeans, - appCxtServices, - appCxtReferences, - appCxtProperties, - context); - // Validate the beans from individual application context for uniqueness - validateBeans(appCxtBeans, appCxtServices, appCxtReferences, appCxtProperties, context.getMonitor()); - // Add all the validated beans to the generic list - beans.addAll(appCxtBeans); - services.addAll(appCxtServices); - references.addAll(appCxtReferences); - scaproperties.addAll(appCxtProperties); - reader.close(); + List<SpringBeanElement> appCxtBeans = new ArrayList<SpringBeanElement>(); + List<SpringSCAServiceElement> appCxtServices = new ArrayList<SpringSCAServiceElement>(); + List<SpringSCAReferenceElement> appCxtReferences = new ArrayList<SpringSCAReferenceElement>(); + List<SpringSCAPropertyElement> appCxtProperties = new ArrayList<SpringSCAPropertyElement>(); + + if (xmlBeanDefinitionLoader != null) { + xmlBeanDefinitionLoader.load(contextResources, + appCxtServices, + appCxtReferences, + appCxtProperties, + appCxtBeans, + context); } - } catch (IOException e) { - throw new ContributionReadException(e); - } catch (XMLStreamException e) { + // Validate the beans from individual application context for uniqueness + validateBeans(appCxtBeans, appCxtServices, appCxtReferences, appCxtProperties, context.getMonitor()); + // Add all the validated beans to the generic list + beans.addAll(appCxtBeans); + services.addAll(appCxtServices); + references.addAll(appCxtReferences); + scaproperties.addAll(appCxtProperties); + } catch (Throwable e) { throw new ContributionReadException(e); } @@ -283,319 +251,6 @@ public class SpringXMLComponentTypeLoader { } /** - * Method which returns the XMLStreamReader for the Spring application-context.xml file - * specified in the location attribute - */ - private XMLStreamReader getApplicationContextReader(ModelResolver resolver, - String location, - ProcessorContext context) throws ContributionReadException { - - try { - URL resource = getApplicationContextResource(resolveLocation(resolver, location, context)).get(0); - XMLStreamReader reader = xmlInputFactory.createXMLStreamReader(resource.openStream()); - return reader; - } catch (IOException e) { - throw new ContributionReadException(e); - } catch (XMLStreamException e) { - throw new ContributionReadException(e); - } - } - - /** - * Spring 2.0 bean xml definitions use DTD and there is no namespace for the elements - * @param expected - * @param actual - * @return - */ - private static boolean matches(QName expected, QName actual) { - return expected.equals(actual) || ("".equals(actual.getNamespaceURI()) && expected.getLocalPart().equals(actual.getLocalPart())); - } - - /** - * Method which reads the spring context definitions from Spring application-context.xml - * file and identifies the defined beans, properties, services and references - * @param context - */ - private void readContextDefinition(ModelResolver resolver, - XMLStreamReader reader, - String contextPath, - Set<String> visited, - List<SpringBeanElement> beans, - List<SpringSCAServiceElement> services, - List<SpringSCAReferenceElement> references, - List<SpringSCAPropertyElement> scaproperties, - ProcessorContext context) throws ContributionReadException { - - if (visited.contains(contextPath)) { - log.warning("Duplicate Spring bean definition file is skipped: " + contextPath); - return; - } - visited.add(contextPath); - SpringBeanElement bean = null; - - try { - int level = 0; - while (level >= 0) { - switch (reader.next()) { - case START_ELEMENT: - level++; - QName qname = reader.getName(); - //System.out.println("Spring TypeLoader - found element with name: " + qname.toString()); - if (matches(IMPORT_ELEMENT, qname)) { - //FIXME - put the sequence of code below which gets the ireader into a subsidiary method - String location = reader.getAttributeValue(null, "resource"); - if (location != null) { - // FIXME - need to find a right way of generating this path - String resourcePath = - contextPath.substring(0, contextPath.lastIndexOf("/") + 1) + location; - XMLStreamReader ireader = getApplicationContextReader(resolver, resourcePath, context); - // Read the context definition for the identified imported resource - readContextDefinition(resolver, ireader, resourcePath, // The new context path - visited, - beans, - services, - references, - scaproperties, - context); - } - } else if (SCA_SERVICE_ELEMENT.equals(qname)) { - // The value of the @name attribute of an <sca:service/> subelement of a <beans/> - // element MUST be unique amongst the <sca:service/> subelements of the <beans/> element. - if (!services.isEmpty() && (services.contains(reader.getAttributeValue(null, "name")))) - error(context.getMonitor(), "ScaServiceNameNotUnique", resolver); - - SpringSCAServiceElement service = - new SpringSCAServiceElement(reader.getAttributeValue(null, "name"), - reader.getAttributeValue(null, "target")); - if (reader.getAttributeValue(null, "type") != null) - service.setType(reader.getAttributeValue(null, "type")); - policyProcessor.readPolicies(service, reader); - services.add(service); - } else if (SCA_REFERENCE_ELEMENT.equals(qname)) { - // The value of the @name attribute of an <sca:reference/> subelement of a <beans/> - // element MUST be unique amongst the @name attributes of the <sca:reference/> subelements, - // of the <beans/> element. - if (!references.isEmpty() && (references.contains(reader.getAttributeValue(null, "name")))) - error(context.getMonitor(), "ScaReferenceNameNotUnique", resolver); - - SpringSCAReferenceElement reference = - new SpringSCAReferenceElement(reader.getAttributeValue(null, "name"), - reader.getAttributeValue(null, "type")); - if (reader.getAttributeValue(null, "default") != null) - reference.setDefaultBean(reader.getAttributeValue(null, "default")); - policyProcessor.readPolicies(reference, reader); - references.add(reference); - } else if (SCA_PROPERTY_ELEMENT.equals(qname)) { - // The value of the @name attribute of an <sca:property/> subelement of a <beans/> - // element MUST be unique amongst the @name attributes of the <sca:property/> subelements, - // of the <beans/> element. - if (!scaproperties.isEmpty() && (scaproperties.contains(reader.getAttributeValue(null, - "name")))) - error(context.getMonitor(), "ScaPropertyNameNotUnique", resolver); - - SpringSCAPropertyElement scaproperty = - new SpringSCAPropertyElement(reader.getAttributeValue(null, "name"), - reader.getAttributeValue(null, "type")); - scaproperties.add(scaproperty); - } else if (matches(BEAN_ELEMENT, qname)) { - bean = - new SpringBeanElement(reader.getAttributeValue(null, "id"), - reader.getAttributeValue(null, "class")); - if (reader.getAttributeValue(null, "abstract") != null) - if (reader.getAttributeValue(null, "abstract").equals("true")) - bean.setAbstractBean(true); - if (reader.getAttributeValue(null, "parent") != null) - if (!reader.getAttributeValue(null, "parent").equals("")) - bean.setParentAttribute(true); - if (reader.getAttributeValue(null, "factory-bean") != null) - if (!reader.getAttributeValue(null, "factory-bean").equals("")) - bean.setFactoryBeanAttribute(true); - if (reader.getAttributeValue(null, "factory-method") != null) - if (!reader.getAttributeValue(null, "factory-method").equals("")) - bean.setFactoryMethodAttribute(true); - // Set the first name as bean name, when the @id attribute is absent. - if (reader.getAttributeValue(null, "id") == null) { - if (reader.getAttributeValue(null, "name") != null) { - String[] names = (reader.getAttributeValue(null, "name")).split(","); - bean.setId(names[0]); - } - } - beans.add(bean); - if (log.isLoggable(Level.FINE)) { - log.log(Level.FINE, "Adding Spring bean ..." + bean.getId() + " from " + contextPath); - } - // Read the <bean> element and its child elements - readBeanDefinition(reader, bean, beans); - } // end if - - // [rfeng] If it reaches end-element, proceed to the case END_ELEMENT test - if (reader.getEventType() != END_ELEMENT) { - break; - } - case END_ELEMENT: - level--; - if (level == 0) { - // Now we are back the root element - return; - } - break; - } // end switch - } // end while - } catch (XMLStreamException e) { - throw new ContributionReadException(e); - } - } - - /** - * Method which reads the bean definitions from Spring application-context.xml file and identifies - * the defined beans, properties, services and references - */ - private void readBeanDefinition(XMLStreamReader reader, SpringBeanElement bean, List<SpringBeanElement> beans) - throws ContributionReadException { - - SpringBeanElement innerbean = null; - SpringPropertyElement property = null; - SpringConstructorArgElement constructorArg = null; - - try { - int level = 0; - while (level >= 0) { - switch (reader.next()) { - case START_ELEMENT: - level++; - QName qname = reader.getName(); - if (matches(BEAN_ELEMENT, qname)) { - innerbean = - new SpringBeanElement(reader.getAttributeValue(null, "id"), - reader.getAttributeValue(null, "class")); - // Set the first name as bean name, when the @id attribute is absent. - if (reader.getAttributeValue(null, "id") == null) { - if (reader.getAttributeValue(null, "name") != null) { - String[] names = (reader.getAttributeValue(null, "name")).split(","); - innerbean.setId(names[0]); - } - } - innerbean.setInnerBean(true); - beans.add(innerbean); - readBeanDefinition(reader, innerbean, beans); - } else if (matches(PROPERTY_ELEMENT, qname)) { - property = new SpringPropertyElement(reader.getAttributeValue(null, "name")); - if (reader.getAttributeValue(null, "ref") != null) - property.addRef(reader.getAttributeValue(null, "ref")); - bean.addProperty(property); - } else if (matches(CONSTRUCTORARG_ELEMENT, qname)) { - constructorArg = new SpringConstructorArgElement(reader.getAttributeValue(null, "type")); - if (reader.getAttributeValue(null, "ref") != null) - constructorArg.addRef(reader.getAttributeValue(null, "ref")); - if (reader.getAttributeValue(null, "index") != null) - constructorArg.setIndex((new Integer(reader.getAttributeValue(null, "index"))) - .intValue()); - if (reader.getAttributeValue(null, "value") != null) - constructorArg.addValue(reader.getAttributeValue(null, "value")); - bean.addCustructorArgs(constructorArg); - } else if (matches(REF_ELEMENT, qname)) { - String ref = reader.getAttributeValue(null, "bean"); - // Check if the parent element is a property - if (property != null) - property.addRef(ref); - // Check if the parent element is a constructor-arg - if (constructorArg != null) - constructorArg.addRef(ref); - } else if (matches(VALUE_ELEMENT, qname)) { - String value = reader.getElementText(); - // Check if the parent element is a constructor-arg - if (constructorArg != null) - constructorArg.addValue(value); - } else if (matches(LIST_ELEMENT, qname) || matches(SET_ELEMENT, qname) || matches(MAP_ELEMENT, qname)) { - if (property != null) - readCollections(reader, bean, beans, property, null); - if (constructorArg != null) - readCollections(reader, bean, beans, null, constructorArg); - } // end if - // [rfeng] If it reaches end-element, proceed to the case END_ELEMENT test - if (reader.getEventType() != END_ELEMENT) { - break; - } - case END_ELEMENT: - level--; - break; - } // end switch - } // end while - } catch (XMLStreamException e) { - throw new ContributionReadException(e); - } - } - - /** - * Method which reads the collection elements from Spring application-context.xml file and identifies - * the defined beans, list, maps and sets - */ - private void readCollections(XMLStreamReader reader, - SpringBeanElement bean, - List<SpringBeanElement> beans, - SpringPropertyElement property, - SpringConstructorArgElement constructorArg) throws ContributionReadException { - - SpringBeanElement innerbean = null; - - try { - int level = 0; - while (level >= 0) { - switch (reader.next()) { - case START_ELEMENT: - level++; - QName qname = reader.getName(); - if (matches(BEAN_ELEMENT, qname)) { - innerbean = - new SpringBeanElement(reader.getAttributeValue(null, "id"), - reader.getAttributeValue(null, "class")); - // Set the first name as bean name, when the @id attribute is absent. - if (reader.getAttributeValue(null, "id") == null) - if (reader.getAttributeValue(null, "name") != null) { - String[] names = (reader.getAttributeValue(null, "name")).split(","); - innerbean.setId(names[0]); - } - innerbean.setInnerBean(true); - beans.add(innerbean); - readBeanDefinition(reader, innerbean, beans); - } else if (matches(REF_ELEMENT, qname)) { - String ref = reader.getAttributeValue(null, "bean"); - if (property != null) - property.addRef(ref); - if (constructorArg != null) - constructorArg.addRef(ref); - } else if (matches(LIST_ELEMENT, qname) || matches(SET_ELEMENT, qname) || matches(MAP_ELEMENT, qname)) { - if (property != null) - readCollections(reader, innerbean, beans, property, null); - if (constructorArg != null) - readCollections(reader, innerbean, beans, null, constructorArg); - } else if (matches(ENTRY_ELEMENT, qname)) { - String keyRef = reader.getAttributeValue(null, "key-ref"); - String valueRef = reader.getAttributeValue(null, "value-ref"); - if (property != null) { - property.addRef(keyRef); - property.addRef(valueRef); - } - if (constructorArg != null) { - constructorArg.addRef(keyRef); - constructorArg.addRef(valueRef); - } - } // end if - // [rfeng] If it reaches end-element, proceed to the case END_ELEMENT test - if (reader.getEventType() != END_ELEMENT) { - break; - } - case END_ELEMENT: - level--; - break; - } // end switch - } // end while - } catch (XMLStreamException e) { - throw new ContributionReadException(e); - } - } - - /** * Generates the Spring implementation component type from the configuration contained in the * lists of beans, services, references and scaproperties derived from the application context */ @@ -643,7 +298,7 @@ public class SpringXMLComponentTypeLoader { String beanName = serviceElement.getTarget(); for (SpringBeanElement beanElement : beans) { if (beanName.equals(beanElement.getId())) { - if (isvalidBeanForService(beanElement)) { + if (isValidBeanForService(beanElement)) { // add the required intents and policySets for the service theService.getRequiredIntents().addAll(serviceElement.getRequiredIntents()); theService.getPolicySets().addAll(serviceElement.getPolicySets()); @@ -713,7 +368,7 @@ public class SpringXMLComponentTypeLoader { SpringBeanElement beanElement = itb.next(); // If its not a valid bean for service, ignore it - if (!isvalidBeanForService(beanElement)) { + if (!isValidBeanForService(beanElement)) { continue; } try { @@ -746,9 +401,9 @@ public class SpringXMLComponentTypeLoader { itb = beans.iterator(); while (itb.hasNext()) { SpringBeanElement beanElement = itb.next(); - + // If its not a valid bean for service, ignore it - if (!isvalidBeanForService(beanElement)) { + if (!isValidBeanForService(beanElement)) { continue; } // Ignore if the bean has no properties and constructor arguments @@ -794,7 +449,6 @@ public class SpringXMLComponentTypeLoader { break; } // end if } // end for - // Store the unresolved references as unresolvedBeanRef in the Spring Implementation type for (Property scaproperty : beanProperties) { @@ -1015,7 +669,7 @@ public class SpringXMLComponentTypeLoader { /** * Validates whether a bean definition is valid for exposing as service. */ - private boolean isvalidBeanForService(SpringBeanElement beanElement) { + private boolean isValidBeanForService(SpringBeanElement beanElement) { if (beanElement.isInnerBean()) return false; |