Author: svkrish
Date: Fri Nov 17 10:53:14 2006
New Revision: 476243
URL: http://svn.apache.org/viewvc?view=rev&rev=476243
Log:
Fixed for JIRA TUSCANY-921
Modified:
incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/composite/CompositeLoader.java
Modified:
incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/composite/CompositeLoader.java
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/composite/CompositeLoader.java?view=diff&rev=476243&r1=476242&r2=476243
==============================================================================
---
incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/composite/CompositeLoader.java
(original)
+++
incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/composite/CompositeLoader.java
Fri Nov 17 10:53:14 2006
@@ -22,7 +22,9 @@
import static javax.xml.stream.XMLStreamConstants.START_ELEMENT;
import static org.osoa.sca.Version.XML_NAMESPACE_1_0;
+import java.net.URI;
import java.net.URL;
+import java.util.List;
import javax.xml.namespace.QName;
import javax.xml.stream.XMLStreamException;
@@ -34,16 +36,23 @@
import org.apache.tuscany.spi.deployer.CompositeClassLoader;
import org.apache.tuscany.spi.deployer.DeploymentContext;
import org.apache.tuscany.spi.extension.LoaderExtension;
+import org.apache.tuscany.spi.loader.InvalidServiceException;
+import org.apache.tuscany.spi.loader.InvalidWireException;
import org.apache.tuscany.spi.loader.LoaderException;
import org.apache.tuscany.spi.loader.LoaderRegistry;
+import org.apache.tuscany.spi.model.BindlessServiceDefinition;
+import org.apache.tuscany.spi.model.BoundServiceDefinition;
import org.apache.tuscany.spi.model.ComponentDefinition;
+import org.apache.tuscany.spi.model.ComponentType;
import org.apache.tuscany.spi.model.CompositeComponentType;
import org.apache.tuscany.spi.model.Implementation;
import org.apache.tuscany.spi.model.Include;
import org.apache.tuscany.spi.model.ModelObject;
import org.apache.tuscany.spi.model.Property;
import org.apache.tuscany.spi.model.ReferenceDefinition;
+import org.apache.tuscany.spi.model.ReferenceTarget;
import org.apache.tuscany.spi.model.ServiceDefinition;
+import org.apache.tuscany.spi.model.WireDefinition;
import org.apache.tuscany.spi.services.artifact.Artifact;
import org.apache.tuscany.spi.services.artifact.ArtifactRepository;
@@ -54,6 +63,7 @@
*/
public class CompositeLoader extends LoaderExtension<CompositeComponentType> {
public static final QName COMPOSITE = new QName(XML_NAMESPACE_1_0,
"composite");
+ public static final String URI_DELIMITER = "/";
private final ArtifactRepository artifactRepository;
@@ -107,6 +117,8 @@
}
}
}
+ } else if (o instanceof WireDefinition) {
+ composite.add((WireDefinition) o);
} else {
// HACK: [rfeng] Add as an unknown model extension
if (o != null) {
@@ -117,6 +129,9 @@
break;
case END_ELEMENT:
if (COMPOSITE.equals(reader.getName())) {
+ //if there are wire defintions then link them up to the
relevant components
+ resolveWires(composite);
+ verifyCompositeCompleteness(composite);
done = true;
break;
}
@@ -126,5 +141,148 @@
PropertyHelper.processProperties(composite, c, deploymentContext);
}
return composite;
+ }
+
+ protected void resolveWires(CompositeComponentType<ServiceDefinition,
ReferenceDefinition, Property<?>> composite)
+ throws
InvalidWireException {
+ List<WireDefinition> wireDefns = composite.getDeclaredWires();
+ String sourceSCAObjectName = null;
+ String componentReferenceName = null;
+ int index = -1;
+ ComponentDefinition componentDefinition = null;
+ ServiceDefinition serviceDefinition = null;
+
+ for ( WireDefinition aWireDefn : wireDefns ) {
+
+ //first validate the target before finding the source
+ validateTarget(aWireDefn.getTarget(), composite);
+
+ sourceSCAObjectName = aWireDefn.getSource().toString();
+ serviceDefinition =
composite.getDeclaredServices().get(sourceSCAObjectName);
+ if ( serviceDefinition != null ) {
+ if ( serviceDefinition instanceof BoundServiceDefinition ) {
+
((BoundServiceDefinition)serviceDefinition).setTarget(aWireDefn.getTarget());
+ } else if ( serviceDefinition instanceof
BindlessServiceDefinition ) {
+
((BoundServiceDefinition)serviceDefinition).setTarget(aWireDefn.getTarget());
+ } else {
+ BindlessServiceDefinition bindlessSvcDefn =
+ new
BindlessServiceDefinition(serviceDefinition.getName(),
+
serviceDefinition.getServiceContract(),
+ false,
+ aWireDefn.getTarget());
+ composite.getDeclaredServices().put(sourceSCAObjectName,
bindlessSvcDefn);
+ }
+ } else {
+ if ( (index = sourceSCAObjectName.indexOf(URI_DELIMITER)) !=
-1 ) {
+ componentReferenceName =
sourceSCAObjectName.substring(index + 1);
+ sourceSCAObjectName = sourceSCAObjectName.substring(0,
index);
+ }
+
+ componentDefinition =
composite.getDeclaredComponents().get(sourceSCAObjectName);
+ if ( componentDefinition != null ) {
+
componentDefinition.add(createReferenceTarget(componentReferenceName,
+
aWireDefn.getTarget(),
+
componentDefinition));
+ } else {
+ InvalidWireException le = new InvalidWireException("Unable
to resolve wire source '" + sourceSCAObjectName +
+ "' in composite " + composite.getName());
+ le.addContextName("composite=" + composite.getName());
+ le.setIdentifier(sourceSCAObjectName);
+ throw le;
+ }
+ }
+ }
+ }
+
+ private ReferenceTarget createReferenceTarget(String
componentReferenceName,
+
URI target,
+
ComponentDefinition componentDefn)
+
throws InvalidWireException {
+ ComponentType componentType =
componentDefn.getImplementation().getComponentType();
+ if ( componentReferenceName == null ) {
+ //if there is ambiguity in determining the source of the wire or
+ //there is no reference to be wired
+ if ( componentType.getReferences().size() > 1 ||
+ componentType.getReferences().isEmpty() ) {
+ InvalidWireException le =
+ new InvalidWireException("Unable to determine
unique component reference for wire...");
+ le.addContextName("loading wire defintions for " +
componentDefn.getName());
+ le.setIdentifier(componentDefn.getName() + "/?->" +
target.toString());
+ throw le;
+ } else {
+ componentReferenceName =
+
((ReferenceDefinition)componentType.getReferences().values().iterator().next()).getName();
+ }
+ }
+
+ ReferenceTarget referenceTarget = new ReferenceTarget();
+ referenceTarget.setReferenceName(componentReferenceName);
+ referenceTarget.addTarget(target);
+ return referenceTarget;
+ }
+
+ protected void
verifyCompositeCompleteness(CompositeComponentType<ServiceDefinition,
ReferenceDefinition, Property<?>> composite)
+
throws InvalidServiceException {
+ //check if all of the composites services have been wired
+ for ( ServiceDefinition svcDefn :
composite.getDeclaredServices().values() ) {
+ if ( svcDefn instanceof BoundServiceDefinition &&
+ ((BoundServiceDefinition)svcDefn).getTarget()
== null ) {
+ InvalidServiceException le = new
InvalidServiceException("Composite service not wired to any target...");
+ le.addContextName("loading composite " +
composite.getName());
+ le.setIdentifier(svcDefn.getName());
+ throw le;
+ }
+ }
+ }
+
+ private void validateTarget(URI target,
+ CompositeComponentType<ServiceDefinition,
ReferenceDefinition, Property<?>> composite )
+ throws InvalidWireException {
+ String targetSCAObjectName = target.toString();
+
+ //if target is not a reference of the composite
+ if ( composite.getReferences().get(targetSCAObjectName) == null ) {
+ String componentServiceName = null;
+ int index = -1;
+
+ //if target is qualified
+ if ( (index = targetSCAObjectName.indexOf(URI_DELIMITER)) != -1 ) {
+ componentServiceName = targetSCAObjectName.substring(index +
1);
+ targetSCAObjectName = targetSCAObjectName.substring(0, index);
+ }
+
+ ComponentDefinition componentDefinition =
+
composite.getDeclaredComponents().get(targetSCAObjectName);
+ //if a target component exists in this composite
+ if ( componentDefinition != null ) {
+ if ( componentServiceName == null ) {
+ if (
componentDefinition.getImplementation().getComponentType().getServices().size()
> 1 ||
+
componentDefinition.getImplementation().getComponentType().getServices().isEmpty()
) {
+ InvalidWireException le =
+ new InvalidWireException("Ambiguous target '" +
componentDefinition.getName() +
+ "' for wire definitions in composite - " +
composite.getName());
+ le.addContextName("loading composite " +
composite.getName());
+ le.setIdentifier(componentDefinition.getName());
+ throw le;
+ }
+ } else {
+ if (
componentDefinition.getImplementation().getComponentType().getServices().get(componentServiceName)
== null ) {
+ InvalidWireException le =
+ new InvalidWireException("Invalid target '" +
targetSCAObjectName + "/" +
+ componentServiceName + "' for wire
definitions in composite - " + composite.getName());
+ le.addContextName("loading composite " +
composite.getName());
+ le.setIdentifier(targetSCAObjectName + "/" +
componentServiceName);
+ throw le;
+ }
+ }
+ } else {
+ InvalidWireException le =
+ new InvalidWireException("Invalid target '" +
targetSCAObjectName +
+ "' for wire definitions in composite - " +
composite.getName());
+ le.addContextName("loading composite " + composite.getName());
+ le.setIdentifier(targetSCAObjectName);
+ throw le;
+ }
+ }
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]