summaryrefslogtreecommitdiffstats
path: root/branches/sca-java-1.x/modules/implementation-spring/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'branches/sca-java-1.x/modules/implementation-spring/src/main/java')
-rw-r--r--branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/SpringImplementation.java50
-rw-r--r--branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/introspect/SpringXMLComponentTypeLoader.java294
-rw-r--r--branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/invocation/SpringContextStub.java4
-rw-r--r--branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/invocation/SpringImplementationTie.java18
-rw-r--r--branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/xml/SpringImplementationProcessor.java65
5 files changed, 265 insertions, 166 deletions
diff --git a/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/SpringImplementation.java b/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/SpringImplementation.java
index 48608a4b34..bee0e462fc 100644
--- a/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/SpringImplementation.java
+++ b/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/SpringImplementation.java
@@ -6,15 +6,15 @@
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
- * under the License.
+ * under the License.
*/
package org.apache.tuscany.sca.implementation.spring;
@@ -35,9 +35,9 @@ import org.apache.tuscany.sca.interfacedef.InterfaceContract;
import org.apache.tuscany.sca.runtime.RuntimeComponent;
/**
- * Represents a Spring implementation.
- *
- * @version $Rev: 511195 $ $Date: 2007-02-24 02:29:46 +0000 (Sat, 24 Feb 2007) $
+ * Represents a Spring implementation.
+ *
+ * @version $Rev: 511195 $ $Date: 2007-02-24 02:29:46 +0000 (Sat, 24 Feb 2007) $
*/
public class SpringImplementation extends ImplementationImpl implements Implementation, ComponentPreProcessor, Extensible {
@@ -53,6 +53,8 @@ public class SpringImplementation extends ImplementationImpl implements Implemen
// List of unresolved bean property references
private Hashtable<String, Reference> unresolvedBeanRef;
+ private ClassLoader classLoader;
+
public SpringImplementation() {
this.location = null;
this.resource = null;
@@ -84,8 +86,8 @@ public class SpringImplementation extends ImplementationImpl implements Implemen
return resource;
}
- /*
- * Returns the componentType for this Spring implementation
+ /*
+ * Returns the componentType for this Spring implementation
*/
public ComponentType getComponentType() {
return componentType;
@@ -145,35 +147,35 @@ public class SpringImplementation extends ImplementationImpl implements Implemen
} // end method setPropertyClass
/**
- * Gets the Java Class for an SCA property
+ * Gets the Java Class for an SCA property
* @param propertyName - the property name
* @return - a Class object for the type of the property
*/
public Class getPropertyClass(String propertyName) {
return propertyMap.get(propertyName);
} // end method getPropertyClass
-
+
public void setUnresolvedBeanRef(String refName, Reference reference) {
if (refName == null || reference == null)
return;
unresolvedBeanRef.put(refName, reference);
return;
} // end method setUnresolvedBeanRef
-
+
public Reference getUnresolvedBeanRef(String refName) {
return unresolvedBeanRef.get(refName);
} // end method getUnresolvedBeanRef
-
-
+
+
/**
- * Use preProcess to validate and map the references and properties dynamically
+ * Use preProcess to validate and map the references and properties dynamically
*/
public void preProcess(Component component) {
if (!(component instanceof RuntimeComponent))
return;
-
+
RuntimeComponent rtc = (RuntimeComponent) component;
-
+
for (Reference reference : rtc.getReferences()) {
if (unresolvedBeanRef.containsKey(reference.getName())) {
Reference ref = unresolvedBeanRef.get(reference.getName());
@@ -184,14 +186,14 @@ public class SpringImplementation extends ImplementationImpl implements Implemen
}
for (Property property : rtc.getProperties()) {
- if (unresolvedBeanRef.containsKey(property.getName())) {
+ if (unresolvedBeanRef.containsKey(property.getName())) {
componentType.getProperties().add(createProperty(property));
this.setPropertyClass(property.getName(), property.getClass());
unresolvedBeanRef.remove(property.getName());
}
- }
+ }
}
-
+
protected Reference createReference(Reference reference, InterfaceContract interfaze) {
Reference newReference;
try {
@@ -203,7 +205,7 @@ public class SpringImplementation extends ImplementationImpl implements Implemen
}
return newReference;
}
-
+
protected Property createProperty(Property property) {
Property newProperty;
try {
@@ -213,4 +215,12 @@ public class SpringImplementation extends ImplementationImpl implements Implemen
}
return newProperty;
}
+
+ public ClassLoader getClassLoader() {
+ return classLoader;
+ }
+
+ public void setClassLoader(ClassLoader classLoader) {
+ this.classLoader = classLoader;
+ }
}
diff --git a/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/introspect/SpringXMLComponentTypeLoader.java b/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/introspect/SpringXMLComponentTypeLoader.java
index 3ed3060d8f..d021d27dfc 100644
--- a/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/introspect/SpringXMLComponentTypeLoader.java
+++ b/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/introspect/SpringXMLComponentTypeLoader.java
@@ -24,8 +24,14 @@ import static javax.xml.stream.XMLStreamConstants.START_ELEMENT;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URI;
import java.net.URL;
import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
@@ -45,6 +51,11 @@ 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.contribution.Artifact;
+import org.apache.tuscany.sca.contribution.ContributionFactory;
+import org.apache.tuscany.sca.contribution.ModelFactoryExtensionPoint;
+import org.apache.tuscany.sca.contribution.resolver.ClassReference;
+import org.apache.tuscany.sca.contribution.resolver.ModelResolver;
import org.apache.tuscany.sca.contribution.service.ContributionReadException;
import org.apache.tuscany.sca.contribution.service.ContributionResolveException;
import org.apache.tuscany.sca.implementation.java.JavaImplementation;
@@ -68,28 +79,30 @@ import org.apache.tuscany.sca.policy.PolicyFactory;
/**
* Introspects a Spring XML application-context configuration file to create <implementation-spring../>
- * component type information.
- *
+ * component type information.
+ *
*
* @version $Rev: 512919 $ $Date: 2007-02-28 19:32:56 +0000 (Wed, 28 Feb 2007) $
*/
public class SpringXMLComponentTypeLoader {
-
+ private XMLInputFactory xmlInputFactory;
+ private ContributionFactory contributionFactory;
private AssemblyFactory assemblyFactory;
private JavaInterfaceFactory javaFactory;
private PolicyFactory policyFactory;
- private ClassLoader cl;
private SpringBeanIntrospector beanIntrospector;
- private String contextPath;
- public SpringXMLComponentTypeLoader(AssemblyFactory assemblyFactory,
+ public SpringXMLComponentTypeLoader(ModelFactoryExtensionPoint factories,
+ AssemblyFactory assemblyFactory,
JavaInterfaceFactory javaFactory,
PolicyFactory policyFactory) {
super();
this.assemblyFactory = assemblyFactory;
this.javaFactory = javaFactory;
this.policyFactory = policyFactory;
+ this.contributionFactory = factories.getFactory(ContributionFactory.class);
+ this.xmlInputFactory = factories.getFactory(XMLInputFactory.class);
}
protected Class<SpringImplementation> getImplementationClass() {
@@ -97,11 +110,11 @@ public class SpringXMLComponentTypeLoader {
}
/**
- * Base method which loads the component type from the application-context attached to the
+ * Base method which loads the component type from the application-context attached to the
* Spring implementation
- *
+ *
*/
- public void load(SpringImplementation implementation) throws ContributionReadException {
+ public void load(SpringImplementation implementation, ModelResolver resolver) throws ContributionReadException {
//System.out.println("Spring TypeLoader - load method start");
ComponentType componentType = implementation.getComponentType();
/* Check that there is a component type object already set */
@@ -110,45 +123,54 @@ public class SpringXMLComponentTypeLoader {
}
if (componentType.isUnresolved()) {
/* Fetch the location of the application-context file from the implementation */
- loadFromXML(implementation);
+ loadFromXML(implementation, resolver);
if (!componentType.isUnresolved())
implementation.setUnresolved(false);
} // end if
//System.out.println("Spring TypeLoader - load method complete");
} // end method load
+
+ private Class<?> resolveClass(ModelResolver resolver, String className) throws ClassNotFoundException {
+ ClassReference classReference = new ClassReference(className);
+ classReference = resolver.resolveModel(ClassReference.class, classReference);
+ if (classReference.isUnresolved()) {
+ throw new ClassNotFoundException(className);
+ }
+ Class<?> javaClass = classReference.getJavaClass();
+ return javaClass;
+ }
+
/**
- * Method which fills out the component type for a Spring implementation by reading the
+ * Method which fills out the component type for a Spring implementation by reading the
* Spring application-context.xml file.
- *
+ *
* @param implementation SpringImplementation into which to load the component type information
* @throws ContributionReadException Failed to read the contribution
*/
- private void loadFromXML(SpringImplementation implementation) throws ContributionReadException {
+ private void loadFromXML(SpringImplementation implementation, ModelResolver resolver) throws ContributionReadException {
XMLStreamReader reader;
List<SpringBeanElement> beans = new ArrayList<SpringBeanElement>();
List<SpringSCAServiceElement> services = new ArrayList<SpringSCAServiceElement>();
List<SpringSCAReferenceElement> references = new ArrayList<SpringSCAReferenceElement>();
- List<SpringSCAPropertyElement> scaproperties = new ArrayList<SpringSCAPropertyElement>();
+ List<SpringSCAPropertyElement> scaproperties = new ArrayList<SpringSCAPropertyElement>();
URL resource;
- contextPath = implementation.getLocation();
+ String contextPath = implementation.getLocation();
try {
- // FIXME - is the ContextClassLoader the right place to start the search?
- cl = Thread.currentThread().getContextClassLoader();
+ resource = resolveLocation(resolver, contextPath);
+ resource = getApplicationContextResource(resource);
- resource = getApplicationContextResource(contextPath, cl);
+ implementation.setClassLoader(new ContextClassLoader(resolver));
implementation.setResource(resource);
// The URI is used to uniquely identify the Implementation
- implementation.setURI(resource.toString());
- // FIXME - need a better way to handle the XMLInputFactory than allocating a new one every time
- XMLInputFactory xmlFactory = XMLInputFactory.newInstance();
- reader = xmlFactory.createXMLStreamReader(resource.openStream());
+ implementation.setURI(resource.toString());
+ reader = xmlInputFactory.createXMLStreamReader(resource.openStream());
- // System.out.println("Spring TypeLoader - starting to read context file");
- readContextDefinition(reader, beans, services, references, scaproperties);
+ // System.out.println("Spring TypeLoader - starting to read context file");
+ readContextDefinition(resolver, reader, contextPath, beans, services, references, scaproperties);
} catch (IOException e) {
throw new ContributionReadException(e);
@@ -159,44 +181,64 @@ public class SpringXMLComponentTypeLoader {
/* At this point, the complete application-context.xml file has been read and its contents */
/* stored in the lists of beans, services, references. These are now used to generate */
/* the implied componentType for the application context */
- generateComponentType(implementation, beans, services, references, scaproperties);
+ generateComponentType(implementation, resolver, beans, services, references, scaproperties);
return;
} // end method loadFromXML
+
+ private URL resolveLocation(ModelResolver resolver, String contextPath) throws MalformedURLException,
+ ContributionReadException {
+ URL resource = null;
+ URI uri = URI.create(contextPath);
+ if (!uri.isAbsolute()) {
+ Artifact artifact = contributionFactory.createArtifact();
+ artifact.setUnresolved(true);
+ artifact.setURI(contextPath);
+ artifact = resolver.resolveModel(Artifact.class, artifact);
+ if (!artifact.isUnresolved()) {
+ resource = new URL(artifact.getLocation());
+ } else {
+ throw new ContributionReadException("Location cannot be resloved: " + contextPath);
+ }
+ } else {
+ resource = new URL(contextPath);
+ }
+ return resource;
+ }
+
/**
* Method which returns the XMLStreamReader for the Spring application-context.xml file
* specified in the location attribute
*/
- private XMLStreamReader getApplicationContextReader(String location) throws ContributionReadException {
-
+ private XMLStreamReader getApplicationContextReader(ModelResolver resolver, String location) throws ContributionReadException {
+
try {
- // FIXME - is the ContextClassLoader the right place to start the search?
- cl = Thread.currentThread().getContextClassLoader();
- URL resource = getApplicationContextResource(location, cl);
- // FIXME - need a better way to handle the XMLInputFactory than allocating a new one every time
- XMLInputFactory xmlFactory = XMLInputFactory.newInstance();
- XMLStreamReader reader = xmlFactory.createXMLStreamReader(resource.openStream());
+ URL resource = getApplicationContextResource(resolveLocation(resolver, location));
+ XMLStreamReader reader =
+ xmlInputFactory.createXMLStreamReader(resource.openStream());
return reader;
} catch (IOException e) {
throw new ContributionReadException(e);
} catch (XMLStreamException e) {
throw new ContributionReadException(e);
}
- }
-
+ }
+
/**
- * Method which reads the spring context definitions from Spring application-context.xml
- * file and identifies the defined beans, properties, services and references
+ * Method which reads the spring context definitions from Spring application-context.xml
+ * file and identifies the defined beans, properties, services and references
*/
- private void readContextDefinition(XMLStreamReader reader,
- List<SpringBeanElement> beans,
- List<SpringSCAServiceElement> services,
- List<SpringSCAReferenceElement> references,
- List<SpringSCAPropertyElement> scaproperties) throws ContributionReadException {
-
+ private void readContextDefinition(ModelResolver resolver,
+ XMLStreamReader reader,
+ String contextPath,
+ List<SpringBeanElement> beans,
+ List<SpringSCAServiceElement> services,
+ List<SpringSCAReferenceElement> references,
+ List<SpringSCAPropertyElement> scaproperties) throws ContributionReadException {
+
SpringBeanElement bean = null;
-
+
try {
boolean completed = false;
while (!completed) {
@@ -210,9 +252,9 @@ public class SpringXMLComponentTypeLoader {
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(resourcePath);
+ XMLStreamReader ireader = getApplicationContextReader(resolver, resourcePath);
// Read the context definition for the identified imported resource
- readContextDefinition(ireader, beans, services, references, scaproperties);
+ readContextDefinition(resolver, ireader, contextPath, beans, services, references, scaproperties);
}
} else if (SpringImplementationConstants.SERVICE_ELEMENT.equals(qname)) {
SpringSCAServiceElement service =
@@ -234,7 +276,7 @@ public class SpringXMLComponentTypeLoader {
.getAttributeValue(null, "class"));
beans.add(bean);
// Read the <bean> element and its child elements
- readBeanDefinition(reader, bean, beans, services, references, scaproperties);
+ readBeanDefinition(resolver, reader, contextPath, bean, beans, services, references, scaproperties);
} // end if*/
break;
case END_ELEMENT:
@@ -249,24 +291,26 @@ public class SpringXMLComponentTypeLoader {
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
+ * the defined beans, properties, services and references
*/
- private void readBeanDefinition(XMLStreamReader reader,
- SpringBeanElement bean,
- List<SpringBeanElement> beans,
- List<SpringSCAServiceElement> services,
- List<SpringSCAReferenceElement> references,
- List<SpringSCAPropertyElement> scaproperties) throws ContributionReadException {
-
+ private void readBeanDefinition(ModelResolver resolver,
+ XMLStreamReader reader,
+ String contextPath,
+ SpringBeanElement bean,
+ List<SpringBeanElement> beans,
+ List<SpringSCAServiceElement> services,
+ List<SpringSCAReferenceElement> references,
+ List<SpringSCAPropertyElement> scaproperties) throws ContributionReadException {
+
SpringBeanElement innerbean = null;
SpringPropertyElement property = null;
SpringConstructorArgElement constructorArg = null;
int autoConstructorIndex = -1;
-
+
try {
boolean completed = false;
while (!completed) {
@@ -278,13 +322,13 @@ public class SpringXMLComponentTypeLoader {
.getAttributeValue(null, "class"));
innerbean.setInnerBean(true);
beans.add(innerbean);
- readBeanDefinition(reader, innerbean, beans, services, references, scaproperties);
+ readBeanDefinition(resolver, reader, contextPath, innerbean, beans, services, references, scaproperties);
} else if (SpringImplementationConstants.PROPERTY_ELEMENT.equals(qname)) {
property = new SpringPropertyElement(reader.getAttributeValue(null, "name"), reader
.getAttributeValue(null, "ref"));
bean.addProperty(property);
} else if (SpringImplementationConstants.CONSTRUCTORARG_ELEMENT.equals(qname)) {
- constructorArg = new SpringConstructorArgElement(reader.getAttributeValue(null, "ref"),
+ constructorArg = new SpringConstructorArgElement(reader.getAttributeValue(null, "ref"),
reader.getAttributeValue(null, "type"));
autoConstructorIndex++;
constructorArg.setAutoIndex(autoConstructorIndex);
@@ -294,17 +338,17 @@ public class SpringXMLComponentTypeLoader {
String value = reader.getAttributeValue(null, "value");
constructorArg.addValue(value);
if ((value.indexOf(".xml") != -1)) {
- if (bean.getClassName().indexOf(".ClassPathXmlApplicationContext") != -1) {
- XMLStreamReader creader = getApplicationContextReader(value);
+ if (bean.getClassName().indexOf(".ClassPathXmlApplicationContext") != -1) {
+ XMLStreamReader creader = getApplicationContextReader(resolver, value);
// Read the context definition for the constructor-arg resources
- readContextDefinition(creader, beans, services, references, scaproperties);
+ readContextDefinition(resolver, creader, contextPath, beans, services, references, scaproperties);
}
}
}
bean.addCustructorArgs(constructorArg);
} else if (SpringImplementationConstants.REF_ELEMENT.equals(qname)) {
String ref = reader.getAttributeValue(null, "bean");
- // Check if the parent element is a property
+ // Check if the parent element is a property
if (property != null) property.setRef(ref);
// Check if the parent element is a constructor-arg
if (constructorArg != null) constructorArg.setRef(ref);
@@ -315,10 +359,10 @@ public class SpringXMLComponentTypeLoader {
constructorArg.addValue(value);
// Identify the XML resource specified for the constructor-arg element
if ((value.indexOf(".xml") != -1)) {
- if (bean.getClassName().indexOf(".ClassPathXmlApplicationContext") != -1) {
- XMLStreamReader creader = getApplicationContextReader(value);
+ if (bean.getClassName().indexOf(".ClassPathXmlApplicationContext") != -1) {
+ XMLStreamReader creader = getApplicationContextReader(resolver, value);
// Read the context definition for the constructor-arg resources
- readContextDefinition(creader, beans, services, references, scaproperties);
+ readContextDefinition(resolver, creader, contextPath, beans, services, references, scaproperties);
}
}
}
@@ -345,6 +389,7 @@ public class SpringXMLComponentTypeLoader {
* lists of beans, services, references and scaproperties derived from the application context
*/
private void generateComponentType(SpringImplementation implementation,
+ ModelResolver resolver,
List<SpringBeanElement> beans,
List<SpringSCAServiceElement> services,
List<SpringSCAReferenceElement> references,
@@ -354,9 +399,9 @@ public class SpringXMLComponentTypeLoader {
* 2. Each sca:reference becomes a reference in the component type
* 3. Each sca:property becomes a property in the component type
* 4. IF there are no explicit service elements, each bean becomes a service
- * 5. Each bean property which is a reference not pointing at another bean in the
+ * 5. Each bean property which is a reference not pointing at another bean in the
* application context becomes a reference unless it is pointing at one of the references
- * 6. Each bean property which is not a reference and which is not pointing
+ * 6. Each bean property which is not a reference and which is not pointing
* at another bean in the application context becomes a property in the component type
*/
@@ -364,11 +409,11 @@ public class SpringXMLComponentTypeLoader {
ComponentType componentType = implementation.getComponentType();
try {
- // Deal with the services first....
+ // Deal with the services first....
Iterator<SpringSCAServiceElement> its = services.iterator();
while (its.hasNext()) {
SpringSCAServiceElement serviceElement = its.next();
- Class<?> interfaze = cl.loadClass(serviceElement.getType());
+ Class<?> interfaze = resolveClass(resolver, serviceElement.getType());
Service theService = createService(interfaze, serviceElement.getName());
componentType.getServices().add(theService);
// Add this service to the Service / Bean map
@@ -384,11 +429,11 @@ public class SpringXMLComponentTypeLoader {
Iterator<SpringSCAReferenceElement> itr = references.iterator();
while (itr.hasNext()) {
SpringSCAReferenceElement referenceElement = itr.next();
- Class<?> interfaze = cl.loadClass(referenceElement.getType());
+ Class<?> interfaze = resolveClass(resolver, referenceElement.getType());
Reference theReference = createReference(interfaze, referenceElement.getName());
componentType.getReferences().add(theReference);
} // end while
-
+
// Next handle the properties
Iterator<SpringSCAPropertyElement> itsp = scaproperties.iterator();
while (itsp.hasNext()) {
@@ -404,7 +449,7 @@ public class SpringXMLComponentTypeLoader {
componentType.getProperties().add(theProperty);
// Remember the Java Class (ie the type) for this property
implementation.setPropertyClass(theProperty.getName(), propType);
- } // end if
+ } // end if
} // end while
// Finally deal with the beans
@@ -418,7 +463,7 @@ public class SpringXMLComponentTypeLoader {
// If its a innerBean, ignore it
if (beanElement.isInnerBean()) continue;
// Load the Spring bean class
- Class<?> beanClass = cl.loadClass(beanElement.getClassName());
+ Class<?> beanClass = resolveClass(resolver, beanElement.getClassName());
// Introspect the bean
beanIntrospector =
new SpringBeanIntrospector(assemblyFactory, javaFactory, policyFactory, beanElement.getCustructorArgs());
@@ -434,15 +479,15 @@ public class SpringXMLComponentTypeLoader {
}
} // end while
} // end if
-
+
itb = beans.iterator();
while (itb.hasNext()) {
- SpringBeanElement beanElement = itb.next();
+ SpringBeanElement beanElement = itb.next();
// Ignore if the bean has no properties and constructor arguments
- if (beanElement.getProperties().isEmpty() && beanElement.getCustructorArgs().isEmpty())
+ if (beanElement.getProperties().isEmpty() && beanElement.getCustructorArgs().isEmpty())
continue;
-
- Class<?> beanClass = cl.loadClass(beanElement.getClassName());
+
+ Class<?> beanClass = resolveClass(resolver, beanElement.getClassName());
// Introspect the bean
beanIntrospector =
new SpringBeanIntrospector(assemblyFactory, javaFactory, policyFactory, beanElement.getCustructorArgs());
@@ -454,7 +499,7 @@ public class SpringXMLComponentTypeLoader {
// the component type of the Spring Assembly
List<Reference> beanReferences = beanComponentType.getReferences();
List<Property> beanProperties = beanComponentType.getProperties();
-
+
Iterator<SpringPropertyElement> itp = beanElement.getProperties().iterator();
while (itp.hasNext()) {
SpringPropertyElement propertyElement = itp.next();
@@ -469,33 +514,33 @@ public class SpringXMLComponentTypeLoader {
componentType.getReferences().add(reference);
} // end if
} // end for
-
+
// Store the unresolved references as unresolvedBeanRef in the Spring Implementation type
for (Property scaproperty : beanProperties) {
if (propertyElement.getName().equals(scaproperty.getName())) {
// The name of the reference in this case is the string in
// the @ref attribute of the Spring property element, NOT the
// name of the field in the Spring bean....
- Class<?> interfaze = cl.loadClass((propertyMap.get(propertyElement.getName()).getType()).getName());
+ Class<?> interfaze = resolveClass(resolver, (propertyMap.get(propertyElement.getName()).getType()).getName());
Reference theReference = createReference(interfaze, propertyElement.getRef());
implementation.setUnresolvedBeanRef(propertyElement.getRef(), theReference);
} // end if
} // end for
} // end if
} // end while
-
+
Iterator<SpringConstructorArgElement> itcr = beanElement.getCustructorArgs().iterator();
while (itcr.hasNext()) {
SpringConstructorArgElement conArgElement = itcr.next();
if (propertyRefUnresolved(conArgElement.getRef(), beans, references, scaproperties)) {
for (JavaParameterImpl parameter : constructor.getParameters()) {
String paramType = parameter.getType().getName();
- Class<?> interfaze = cl.loadClass(paramType);
+ Class<?> interfaze = resolveClass(resolver, paramType);
// Create a component type reference/property if the constructor-arg element has a
// type attribute OR index attribute declared...
- if ((conArgElement.getType() != null && paramType.equals(conArgElement.getType())) ||
- (conArgElement.getIndex() != -1 && (conArgElement.getIndex() == parameter.getIndex())) ||
- (conArgElement.getAutoIndex() == parameter.getIndex()))
+ if ((conArgElement.getType() != null && paramType.equals(conArgElement.getType())) ||
+ (conArgElement.getIndex() != -1 && (conArgElement.getIndex() == parameter.getIndex())) ||
+ (conArgElement.getAutoIndex() == parameter.getIndex()))
{
if (parameter.getClassifer().getName().equals("org.osoa.sca.annotations.Reference")) {
Reference theReference = createReference(interfaze, conArgElement.getRef());
@@ -507,11 +552,11 @@ public class SpringXMLComponentTypeLoader {
Reference theReference = createReference(interfaze, conArgElement.getRef());
implementation.setUnresolvedBeanRef(conArgElement.getRef(), theReference);
}
- }
- } // end for
+ }
+ } // end for
} // end if
} // end while
-
+
} // end while
} catch (ClassNotFoundException e) {
@@ -520,7 +565,7 @@ public class SpringXMLComponentTypeLoader {
} catch (InvalidInterfaceException e) {
throw new ContributionReadException(e);
} catch (ContributionResolveException e) {
-
+
} // end try
// If we get here, the Spring assembly component type is resolved
@@ -592,25 +637,24 @@ public class SpringXMLComponentTypeLoader {
* @param locationAttr - the location attribute from the <implementation.spring../> element
* @param cl - the ClassLoader for the Spring implementation
*/
- protected URL getApplicationContextResource(String locationAttr, ClassLoader cl)
+ protected URL getApplicationContextResource(URL url)
throws ContributionReadException {
File manifestFile = null;
File appXmlFile;
File locationFile = null;
-
- URL url = cl.getResource(locationAttr);
+
if (url != null) {
String path = url.getPath();
- locationFile = new File(path);
+ locationFile = new File(path);
} else {
throw new ContributionReadException(
- "SpringXMLLoader getApplicationContextResource: " + "unable to find resource file "
- + locationAttr);
+ "SpringXMLLoader getApplicationContextResource: " + "unable to find resource file "
+ + url);
}
if (locationFile.isDirectory()) {
try {
- manifestFile = new File(locationFile, "META-INF"+ File.separator +"MANIFEST.MF");
+ manifestFile = new File(locationFile, "META-INF"+ File.separator +"MANIFEST.MF");
if (manifestFile.exists()) {
Manifest mf = new Manifest(new FileInputStream(manifestFile));
Attributes mainAttrs = mf.getMainAttributes();
@@ -623,7 +667,7 @@ public class SpringXMLComponentTypeLoader {
}
}
// no manifest-specified Spring context, use default
- appXmlFile = new File(locationFile, "META-INF" + File.separator + "spring"
+ appXmlFile = new File(locationFile, "META-INF" + File.separator + "spring"
+ File.separator + SpringImplementationConstants.APPLICATION_CONTEXT);
if (appXmlFile.exists()) {
return appXmlFile.toURL();
@@ -631,7 +675,7 @@ public class SpringXMLComponentTypeLoader {
} catch (IOException e) {
throw new ContributionReadException("Error reading manifest " + manifestFile);
}
- } else {
+ } else {
if (locationFile.isFile() && locationFile.getName().endsWith(".jar")) {
try {
JarFile jf = new JarFile(locationFile);
@@ -655,21 +699,21 @@ public class SpringXMLComponentTypeLoader {
} catch (IOException e) {
// bad archive
// TODO: create a more appropriate exception type
- throw new ContributionReadException("SpringXMLLoader getApplicationContextResource: "
+ throw new ContributionReadException("SpringXMLLoader getApplicationContextResource: "
+ " IO exception reading context file.", e);
}
}
else {
if (locationFile.getName().endsWith(".xml")) {
return url;
- }
+ }
else {
// Deal with the directory inside a jar file, in case the contribution itself is a JAR file.
try {
if (locationFile.getPath().indexOf(".jar") > 0) {
String jarEntry = url.getPath().substring(6, url.getPath().indexOf("!"));
- JarFile jf = new JarFile(jarEntry);
- JarEntry je = jf.getJarEntry(url.getPath().substring(url.getPath().indexOf("!/")+2)
+ JarFile jf = new JarFile(jarEntry);
+ JarEntry je = jf.getJarEntry(url.getPath().substring(url.getPath().indexOf("!/")+2)
+ "/" + "META-INF" + "/" + "MANIFEST.MF");
if (je != null) {
Manifest mf = new Manifest(jf.getInputStream(je));
@@ -682,15 +726,15 @@ public class SpringXMLComponentTypeLoader {
}
}
}
- }
+ }
} catch (IOException e) {
throw new ContributionReadException("Error reading manifest " + manifestFile);
}
- }
+ }
}
}
- throw new ContributionReadException("SpringXMLLoader getApplicationContextResource: "
+ throw new ContributionReadException("SpringXMLLoader getApplicationContextResource: "
+ "META-INF/spring/" + SpringImplementationConstants.APPLICATION_CONTEXT + "not found");
} // end method getApplicationContextResource
@@ -739,4 +783,38 @@ public class SpringXMLComponentTypeLoader {
return reference;
}
+
+ private class ContextClassLoader extends ClassLoader {
+ public ContextClassLoader(ModelResolver resolver) {
+ super();
+ this.resolver = resolver;
+ }
+
+ private ModelResolver resolver;
+
+ @Override
+ protected Class<?> findClass(String name) throws ClassNotFoundException {
+ return SpringXMLComponentTypeLoader.this.resolveClass(resolver, name);
+ }
+
+ @Override
+ protected URL findResource(String name) {
+ try {
+ return resolveLocation(resolver, name);
+ } catch (Exception e) {
+ return null;
+ }
+ }
+
+ @Override
+ protected Enumeration<URL> findResources(String name) throws IOException {
+ URL url = findResource(name);
+ if (url != null) {
+ return Collections.enumeration(Arrays.asList(url));
+ } else {
+ Collection<URL> urls = Collections.emptyList();
+ return Collections.enumeration(urls);
+ }
+ }
+ }
} // end class SpringXMLComponentTypeLoader
diff --git a/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/invocation/SpringContextStub.java b/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/invocation/SpringContextStub.java
index e8b398bd3a..55dd1d6027 100644
--- a/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/invocation/SpringContextStub.java
+++ b/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/invocation/SpringContextStub.java
@@ -89,6 +89,7 @@ public class SpringContextStub {
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
} catch (InvocationTargetException e) {
+ e.printStackTrace();
throw new RuntimeException(e);
}
}
@@ -101,6 +102,7 @@ public class SpringContextStub {
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
} catch (InvocationTargetException e) {
+ e.printStackTrace();
throw new RuntimeException(e);
}
}
@@ -113,6 +115,7 @@ public class SpringContextStub {
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
} catch (InvocationTargetException e) {
+ e.printStackTrace();
throw new RuntimeException(e);
}
}
@@ -127,6 +130,7 @@ public class SpringContextStub {
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
} catch (InvocationTargetException e) {
+ e.printStackTrace();
throw new RuntimeException(e);
}
}
diff --git a/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/invocation/SpringImplementationTie.java b/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/invocation/SpringImplementationTie.java
index ac913fdee2..0a069c032f 100644
--- a/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/invocation/SpringImplementationTie.java
+++ b/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/invocation/SpringImplementationTie.java
@@ -6,15 +6,15 @@
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
- * under the License.
+ * under the License.
*/
package org.apache.tuscany.sca.implementation.spring.invocation;
@@ -35,20 +35,20 @@ import org.apache.tuscany.sca.runtime.RuntimeComponent;
* It enables the Sping code in the runtime module to invoke methods on a
* Tuscany SpringImplementation without the Spring runtime module
* needing to know about any Tuscany classes. See the SpringImplementationStub class
- * in the implementation-spring-runtime module for what the stub does.
+ * in the implementation-spring-runtime module for what the stub does.
*/
public class SpringImplementationTie {
private SpringImplementation implementation;
private RuntimeComponent component;
private JavaPropertyValueObjectFactory propertyFactory;
-
+
public SpringImplementationTie(SpringImplementation implementation, RuntimeComponent component, JavaPropertyValueObjectFactory propertyFactory) {
this.implementation = implementation;
this.component = component;
this.propertyFactory = propertyFactory;
}
-
+
public String getURI() {
throw new IllegalStateException("Not yet impl");
}
@@ -132,7 +132,7 @@ public class SpringImplementationTie {
throw new RuntimeException("Unable to find Bean with name " + name);
} // end method getBean( String, Class )
-
+
public Object getComponentTie() {
return new ComponentTie(component);
}
@@ -140,4 +140,8 @@ public class SpringImplementationTie {
public Object getPropertyValueTie() {
return new PropertyValueTie(component, propertyFactory);
}
+
+ public ClassLoader getClassLoader() {
+ return implementation.getClassLoader();
+ }
}
diff --git a/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/xml/SpringImplementationProcessor.java b/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/xml/SpringImplementationProcessor.java
index abe3954b9a..869935be6e 100644
--- a/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/xml/SpringImplementationProcessor.java
+++ b/branches/sca-java-1.x/modules/implementation-spring/src/main/java/org/apache/tuscany/sca/implementation/spring/xml/SpringImplementationProcessor.java
@@ -6,15 +6,15 @@
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
- * under the License.
+ * under the License.
*/
package org.apache.tuscany.sca.implementation.spring.xml;
@@ -31,12 +31,12 @@ import org.apache.tuscany.sca.assembly.ComponentType;
import org.apache.tuscany.sca.assembly.builder.impl.ProblemImpl;
import org.apache.tuscany.sca.assembly.xml.Constants;
import org.apache.tuscany.sca.assembly.xml.PolicyAttachPointProcessor;
+import org.apache.tuscany.sca.contribution.ModelFactoryExtensionPoint;
+import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor;
+import org.apache.tuscany.sca.contribution.resolver.ModelResolver;
import org.apache.tuscany.sca.contribution.service.ContributionReadException;
import org.apache.tuscany.sca.contribution.service.ContributionResolveException;
import org.apache.tuscany.sca.contribution.service.ContributionWriteException;
-import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor;
-import org.apache.tuscany.sca.contribution.resolver.ModelResolver;
-import org.apache.tuscany.sca.contribution.ModelFactoryExtensionPoint;
import org.apache.tuscany.sca.implementation.spring.SpringImplementation;
import org.apache.tuscany.sca.implementation.spring.introspect.SpringXMLComponentTypeLoader;
import org.apache.tuscany.sca.interfacedef.java.JavaInterfaceFactory;
@@ -48,8 +48,8 @@ import org.apache.tuscany.sca.policy.PolicyFactory;
/**
* SpringArtifactProcessor is responsible for processing the XML of an <implementation.spring.../>
* element in an SCA SCDL file.
- *
- * @version $Rev: 511195 $ $Date: 2007-02-24 02:29:46 +0000 (Sat, 24 Feb 2007) $
+ *
+ * @version $Rev: 511195 $ $Date: 2007-02-24 02:29:46 +0000 (Sat, 24 Feb 2007) $
*/
public class SpringImplementationProcessor implements StAXArtifactProcessor<SpringImplementation> {
@@ -63,18 +63,21 @@ public class SpringImplementationProcessor implements StAXArtifactProcessor<Spri
private PolicyFactory policyFactory;
private PolicyAttachPointProcessor policyProcessor;
private Monitor monitor;
-
+
+ private ModelFactoryExtensionPoint factories;
+
public SpringImplementationProcessor(ModelFactoryExtensionPoint modelFactories, Monitor monitor) {
+ this.factories = modelFactories;
this.assemblyFactory = modelFactories.getFactory(AssemblyFactory.class);
this.javaFactory = modelFactories.getFactory(JavaInterfaceFactory.class);
this.policyFactory = modelFactories.getFactory(PolicyFactory.class);
this.policyProcessor = new PolicyAttachPointProcessor(policyFactory);
this.monitor = monitor;
}
-
+
/**
* Report a exception.
- *
+ *
* @param problems
* @param message
* @param model
@@ -85,10 +88,10 @@ public class SpringImplementationProcessor implements StAXArtifactProcessor<Spri
monitor.problem(problem);
}
}
-
+
/**
* Report a error.
- *
+ *
* @param problems
* @param message
* @param model
@@ -102,21 +105,21 @@ public class SpringImplementationProcessor implements StAXArtifactProcessor<Spri
/*
* Read the XML and parse out the attributes.
- *
+ *
* <implementation.spring.../> has a single required attribute:
* "location" - which is the target URI of of an archive file or a directory that contains the Spring
* application context files.
- * If the resource identified by the location attribute is an archive file, then the file
- * META-INF/MANIFEST.MF is read from the archive.
+ * If the resource identified by the location attribute is an archive file, then the file
+ * META-INF/MANIFEST.MF is read from the archive.
* If the location URI identifies a directory, then META-INF/MANIFEST.MF must exist
- * underneath that directory.
+ * underneath that directory.
* If the manifest file contains a header "Spring-Context" of the format:
* Spring-Context ::= path ( ';' path )*
- *
- * Where path is a relative path with respect to the location URI, then the set of paths
- * specified in the header identify the context configuration files.
- * If there is no MANIFEST.MF file or no Spring-Context header within that file,
- * then the default behaviour is to build an application context using all the *.xml files
+ *
+ * Where path is a relative path with respect to the location URI, then the set of paths
+ * specified in the header identify the context configuration files.
+ * If there is no MANIFEST.MF file or no Spring-Context header within that file,
+ * then the default behaviour is to build an application context using all the *.xml files
* in the METAINF/spring directory.
*/
public SpringImplementation read(XMLStreamReader reader) throws ContributionReadException, XMLStreamException {
@@ -135,7 +138,7 @@ public class SpringImplementationProcessor implements StAXArtifactProcessor<Spri
error("LocationAttributeMissing", reader);
//throw new ContributionReadException(MSG_LOCATION_MISSING);
}
-
+
// Read policies
policyProcessor.readPolicies(springImplementation, reader);
@@ -153,7 +156,7 @@ public class SpringImplementationProcessor implements StAXArtifactProcessor<Spri
* Handles the component type for the Spring implementation
* @param springImplementation - a Spring implementation. The component type information
* is created for this implementation
- *
+ *
*/
private void processComponentType(SpringImplementation springImplementation) {
@@ -173,7 +176,7 @@ public class SpringImplementationProcessor implements StAXArtifactProcessor<Spri
policyProcessor.writePolicyPrefixes(springImplementation, writer);
writer.writeStartElement(Constants.SCA10_NS, IMPLEMENTATION_SPRING);
policyProcessor.writePolicyAttributes(springImplementation, writer);
-
+
if (springImplementation.getLocation() != null) {
writer.writeAttribute(LOCATION, springImplementation.getLocation());
}
@@ -188,16 +191,16 @@ public class SpringImplementationProcessor implements StAXArtifactProcessor<Spri
*/
public void resolve(SpringImplementation springImplementation, ModelResolver resolver)
throws ContributionResolveException {
-
+
if (springImplementation == null)
return;
/* Load the Spring component type by reading the Spring application context */
SpringXMLComponentTypeLoader springLoader =
- new SpringXMLComponentTypeLoader(assemblyFactory, javaFactory, policyFactory);
+ new SpringXMLComponentTypeLoader(factories, assemblyFactory, javaFactory, policyFactory);
try {
// Load the Spring Implementation information from its application context file...
- springLoader.load(springImplementation);
+ springLoader.load(springImplementation, resolver);
} catch (ContributionReadException e) {
ContributionResolveException ce = new ContributionResolveException(e);
error("ContributionResolveException", resolver, ce);
@@ -210,12 +213,12 @@ public class SpringImplementationProcessor implements StAXArtifactProcessor<Spri
ComponentType componentType = resolver.resolveModel(ComponentType.class, ct);
if (componentType.isUnresolved()) {
error("UnableToResolveComponentType", resolver);
- //throw new ContributionResolveException("SpringArtifactProcessor: unable to resolve componentType for Spring component");
+ //throw new ContributionResolveException("SpringArtifactProcessor: unable to resolve componentType for Spring component");
} else {
springImplementation.setComponentType(componentType);
springImplementation.setUnresolved(false);
- }
-
+ }
+
} // end if
} // end method resolve