You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by sv...@apache.org on 2006/11/17 19:53:14 UTC
svn commit: r476243 -
/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/composite/CompositeLoader.java
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: tuscany-commits-unsubscribe@ws.apache.org
For additional commands, e-mail: tuscany-commits-help@ws.apache.org