You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by sl...@apache.org on 2007/12/10 18:52:38 UTC
svn commit: r602979 [2/2] - in /incubator/tuscany/java/sca/modules:
assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/
binding-sca-axis2/src/test/java/org/apache/tuscany/sca/binding/sca/axis2/
core/src/main/java/org/apache/tuscany/sca...
Modified: incubator/tuscany/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/SCANodeImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/SCANodeImpl.java?rev=602979&r1=602978&r2=602979&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/SCANodeImpl.java (original)
+++ incubator/tuscany/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/SCANodeImpl.java Mon Dec 10 09:52:35 2007
@@ -19,6 +19,9 @@
package org.apache.tuscany.sca.node.impl;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.StringBufferInputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.URI;
@@ -31,6 +34,10 @@
import java.util.logging.Logger;
import javax.xml.namespace.QName;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLOutputFactory;
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.stream.XMLStreamWriter;
import org.apache.tuscany.sca.assembly.AssemblyFactory;
import org.apache.tuscany.sca.assembly.Binding;
@@ -41,15 +48,19 @@
import org.apache.tuscany.sca.assembly.Reference;
import org.apache.tuscany.sca.assembly.Service;
import org.apache.tuscany.sca.assembly.builder.CompositeBuilderException;
+import org.apache.tuscany.sca.assembly.builder.impl.DomainWireBuilderImpl;
import org.apache.tuscany.sca.assembly.xml.Constants;
import org.apache.tuscany.sca.contribution.Contribution;
import org.apache.tuscany.sca.contribution.DeployedArtifact;
import org.apache.tuscany.sca.contribution.ModelFactoryExtensionPoint;
+import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor;
+import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessorExtensionPoint;
import org.apache.tuscany.sca.contribution.resolver.ModelResolver;
import org.apache.tuscany.sca.contribution.resolver.impl.ModelResolverImpl;
import org.apache.tuscany.sca.contribution.service.ContributionService;
import org.apache.tuscany.sca.core.ExtensionPointRegistry;
import org.apache.tuscany.sca.core.assembly.ActivationException;
+import org.apache.tuscany.sca.databinding.impl.XSDDataTypeConverter.Base64Binary;
import org.apache.tuscany.sca.domain.SCADomain;
import org.apache.tuscany.sca.domain.SCADomainEventService;
import org.apache.tuscany.sca.host.embedded.impl.ReallySmallRuntime;
@@ -59,6 +70,8 @@
import org.apache.tuscany.sca.node.NodeFactoryImpl;
import org.apache.tuscany.sca.node.SCANode;
import org.apache.tuscany.sca.node.SCANodeSPI;
+import org.apache.tuscany.sca.runtime.RuntimeComponent;
+import org.apache.tuscany.sca.runtime.RuntimeComponentReference;
/**
* A local representation of the sca domain running on a single node
@@ -100,16 +113,19 @@
// Used to pipe node information into the model
NodeFactoryImpl nodeFactory;
+ // domain level wiring
+ DomainWireBuilderImpl domainWireBuilder = new DomainWireBuilderImpl();
+
// methods defined on the implementation only
/**
* Creates a node connected to a wider domain. To find its place in the domain
* node and domain identifiers must be provided.
- *
+ *
+ * @param physicalNodeUri - if this is a url it is assumed that this will be used as root url for management components, e.g. http://localhost:8082
* @param domainUri - identifies what host and port the domain service is running on, e.g. http://localhost:8081
- * @param nodeUri - if this is a url it is assumed that this will be used as root url for management components, e.g. http://localhost:8082
- * @param nodeGroupURI the uri of the node group. This is the enpoint URI of the head of the
+ * @param logicalNodeURI the uri of the node group. This is the enpoint URI of the head of the
* group of nodes. For example, in load balancing scenarios this will be the loaded balancer itself
* @throws ActivationException
*/
@@ -125,9 +141,9 @@
* Creates a node connected to a wider domain and allows a classpath to be specified.
* To find its place in the domain node and domain identifiers must be provided.
*
+ * @param physicalNodeUri - if this is a url it is assumed that this will be used as root url for management components, e.g. http://localhost:8082
* @param domainUri - identifies what host and port the domain service is running on, e.g. http://localhost:8081
- * @param nodeUri - if this is a url it is assumed that this will be used as root url for management components, e.g. http://localhost:8082
- * @param nodeGroupURI the uri of the node group. This is the enpoint URI of the head of the
+ * @param logicalNodeURI the uri of the node group. This is the enpoint URI of the head of the
* group of nodes. For example, in load balancing scenarios this will be the loaded balancer itself
* @param cl - the ClassLoader to use for loading system resources for the node
* @throws ActivationException
@@ -214,9 +230,7 @@
}
// temp methods to help integrate with existing code
-
-
-
+
public Component getComponent(String componentName) {
for (Composite composite: nodeComposite.getIncludes()) {
for (Component component: composite.getComponents()) {
@@ -265,6 +279,12 @@
if ((!nodeStarted) && (nodeComposite.getIncludes().size() > 0)){
startComposites();
nodeStarted = true;
+
+ try {
+ scaDomain.registerNodeStart(nodeURI);
+ } catch (Exception ex) {
+ throw new NodeException(ex);
+ }
}
}
@@ -272,6 +292,12 @@
if (nodeStarted){
stopComposites();
nodeStarted = false;
+
+ try {
+ scaDomain.registerNodeStop(nodeURI);
+ } catch (Exception ex) {
+ throw new NodeException(ex);
+ }
}
}
@@ -598,6 +624,21 @@
// don't try and restart the management composite
// they will already have been started by the domain proxy
if (!composite.getName().equals(nodeManagementCompositeName)){
+ buildComposite(composite);
+ }
+ }
+
+ // do cross composite wiring. This is here just in case
+ // the node has more than one composite and is stand alone
+ // If the node is not stand alone the domain will do this
+ if (domainURI == null){
+ domainWireBuilder.wireDomain(nodeComposite);
+ }
+
+ for (Composite composite : nodeComposite.getIncludes()) {
+ // don't try and restart the management composite
+ // they will already have been started by the domain proxy
+ if (!composite.getName().equals(nodeManagementCompositeName)){
startComposite(composite);
}
}
@@ -607,21 +648,22 @@
throw new NodeException(ex);
}
}
-
- private void startComposite(Composite composite) throws CompositeBuilderException, ActivationException {
- logger.log(Level.INFO, "Starting composite: " + composite.getName());
+
+ private void buildComposite(Composite composite) throws CompositeBuilderException, ActivationException {
+ logger.log(Level.INFO, "Building composite: " + composite.getName());
// Create the model for the composite
nodeRuntime.getCompositeBuilder().build(composite);
// activate the composite
nodeRuntime.getCompositeActivator().activate(composite);
+ }
+
+ private void startComposite(Composite composite) throws CompositeBuilderException, ActivationException {
+ logger.log(Level.INFO, "Starting composite: " + composite.getName());
// tell the domain where all the service endpoints are
- scaDomain.registerRemoteServices(nodeURI, composite);
-
- // get up to date with where all services we depend on are
- resolveRemoteReferences(composite);
+ registerRemoteServices(nodeURI, composite);
//start the composite
nodeRuntime.getCompositeActivator().start(composite);
@@ -642,7 +684,6 @@
} catch (Exception ex) {
throw new NodeException(ex);
}
-
}
private void stopComposite(Composite composite)
@@ -651,98 +692,164 @@
nodeRuntime.getCompositeActivator().stop(composite);
nodeRuntime.getCompositeActivator().deactivate(composite);
}
-
- private void resolveRemoteReferences(Composite composite){
- // Loop through all reference binding URIs. Any that are not resolved
- // should be looked up in the domain
+ private void registerRemoteServices(String nodeURI, Composite composite){
+ // Loop through all service binding URIs registering them with the domain
+ for (Service service: composite.getServices()) {
+ for (Binding binding: service.getBindings()) {
+ registerRemoteServiceBinding(nodeURI, null, service, binding);
+ }
+ }
- for (Reference reference: composite.getReferences()) {
- for ( ComponentService service : reference.getTargets()){
+ for (Component component: composite.getComponents()) {
+ for (ComponentService service: component.getServices()) {
for (Binding binding: service.getBindings()) {
- resolveRemoteReferenceBinding(reference, service, binding);
+ registerRemoteServiceBinding(nodeURI, component, service, binding);
}
- }
- }
-
- for (Component component: composite.getComponents()) {
- for (ComponentReference reference: component.getReferences()) {
- for ( ComponentService service : reference.getTargets()){
- for (Binding binding: service.getBindings()) {
- resolveRemoteReferenceBinding(reference, service, binding);
- }
- }
}
- }
+ }
}
- private void resolveRemoteReferenceBinding(Reference reference, Service service, Binding binding){
- if (binding.isUnresolved()) {
- // find the right endpoint for this reference/binding. This relies on looking
- // up every binding URI. If a response is returned then it's set back into the
- // binding uri
- String uri = "";
-
- try {
- uri = ((SCADomainEventService)scaDomain).findServiceEndpoint(domainURI,
- service.getName(),
- binding.getClass().getName());
- } catch(Exception ex) {
- logger.log(Level.WARNING,
- "Unable to find service: " +
- domainURI + " " +
- nodeURI + " " +
- binding.getURI() + " " +
- binding.getClass().getName() + " " +
- uri);
- }
-
- if (!uri.equals(SCADomainEventService.SERVICE_NOT_REGISTERED)){
- binding.setURI(uri);
- }
- }
- }
-
- public void setReferenceEndpoint(String referenceName, String bindingClassName, String serviceURI) throws NodeException {
- // find the named reference and binding and update the uri from this message
- Reference reference = findReference(referenceName);
-
- if (reference != null){
- // find the matching binding and set it's uri
- for( Binding binding : reference.getBindings()){
- if (binding.getClass().getName().equals(bindingClassName)){
- binding.setURI(serviceURI);
+ private void registerRemoteServiceBinding(String nodeURI, Component component, Service service, Binding binding ){
+ if (service.getInterfaceContract().getInterface().isRemotable()) {
+ String uriString = binding.getURI();
+ if (uriString != null) {
+
+
+ String serviceName = service.getName();
+
+ if (component != null){
+ serviceName = component.getName() + '/' + serviceName;
+ }
+
+ try {
+ scaDomain.registerServiceEndpoint(domainURI,
+ nodeURI,
+ serviceName,
+ binding.getClass().getName(),
+ uriString);
+ } catch(Exception ex) {
+ logger.log(Level.WARNING,
+ "Unable to register service: " +
+ domainURI + " " +
+ nodeURI + " " +
+ service.getName()+ " " +
+ binding.getClass().getName() + " " +
+ uriString);
}
}
}
- }
+ }
- private Reference findReference(String referenceName){
+ public void updateComposite(QName compositeQName, String compositeXMLBase64 ) throws NodeException {
+ logger.log(Level.INFO, "Updating composite " + compositeQName.toString() +
+ " at node " + nodeURI);
+
+ ByteArrayInputStream bais = new ByteArrayInputStream(Base64Binary.decode(compositeXMLBase64));
- for (Reference reference: nodeComposite.getReferences()) {
- if (reference.getName().equals(referenceName)){
- return reference;
- }
- }
+ // find the composite that will be updated
+ Composite composite = composites.get(compositeQName);
- for (Component component: nodeComposite.getComponents()) {
- for (ComponentReference reference: component.getReferences()) {
- if (reference.getName().equals(referenceName)){
- return reference;
- }
- }
+ if (composite == null) {
+ throw new NodeException("trying to update composite " + compositeQName.toString() +
+ " which can't be found in node " + nodeURI);
}
- for (Composite composite : nodeComposite.getIncludes()) {
- for (Component component: composite.getComponents()) {
- for (ComponentReference reference: component.getReferences()) {
- if (reference.getName().equals(referenceName)){
- return reference;
+ // parse the XML into an composite object
+ Composite newComposite = null;
+
+ ExtensionPointRegistry registry = nodeRuntime.getExtensionPointRegistry();
+ StAXArtifactProcessorExtensionPoint staxProcessors =
+ registry.getExtensionPoint(StAXArtifactProcessorExtensionPoint.class);
+
+ StAXArtifactProcessor<Composite> processor = staxProcessors.getProcessor(Composite.class);
+
+ try {
+ XMLInputFactory inputFactory = XMLInputFactory.newInstance();
+ XMLStreamReader reader = inputFactory.createXMLStreamReader(bais);
+ newComposite = processor.read(reader);
+ reader.close();
+ } catch (Exception ex) {
+ throw new NodeException(ex);
+ }
+
+ // for each component in the composite compare it against the live component
+ for (Component newComponent : newComposite.getComponents()){
+ for (Component component : composite.getComponents()){
+ if (component.getName().equals(newComponent.getName())){
+ // compare the component references
+ for (Reference newReference : newComponent.getReferences()){
+ for (Reference reference : component.getReferences()) {
+ if (reference.getName().equals(newReference.getName())) {
+ boolean referenceChanged = false;
+ Binding removalCandidates[] = new Binding[reference.getBindings().size()];
+ int bindingIndex = 0;
+ for (Binding binding : reference.getBindings()){
+ removalCandidates[bindingIndex] = binding;
+ bindingIndex++;
+ }
+
+ for (Binding newBinding : newReference.getBindings()){
+ boolean bindingFound = false;
+ bindingIndex = 0;
+ for (Binding binding : reference.getBindings()){
+ if (binding.getName().equals(newBinding.getName())){
+ if ((binding.getURI() != null) &&
+ (newBinding.getURI() != null) &&
+ !binding.getURI().equals(newBinding.getURI())){
+ binding.setURI(newBinding.getURI());
+ referenceChanged = true;
+
+ logger.log(Level.INFO, "Updating component " +
+ component.getName() +
+ " reference " +
+ reference.getName() +
+ " binding " +
+ binding.getClass().getName() +
+ " URI " +
+ binding.getURI());
+ }
+ bindingFound = true;
+ removalCandidates[bindingIndex] = null;
+ }
+ bindingIndex++;
+ }
+
+ // if the new binding is not currently deployed then add it
+ if (bindingFound == false){
+ reference.getBindings().add(newBinding);
+ referenceChanged = true;
+ }
+ }
+
+ // remove all of the old bindings
+ for ( int i = 0; i < removalCandidates.length; i++){
+ if (removalCandidates[i] != null){
+ reference.getBindings().remove(removalCandidates[i]);
+ referenceChanged = true;
+ }
+ }
+
+ // if the node is running restart the reference
+ if (referenceChanged && nodeStarted){
+ nodeRuntime.getCompositeActivator().deactivate((RuntimeComponent)component,
+ (RuntimeComponentReference)reference);
+
+ nodeRuntime.getCompositeActivator().start((RuntimeComponent)component,
+ (RuntimeComponentReference)reference);
+
+ }
+ }
+ }
}
+
+ // TODO - compare other parts of the component
}
}
- }
+ }
+
+ // TODO - Compare other parts of the composite?
+
+ }
- return null;
- }
}
Modified: incubator/tuscany/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/management/impl/SCANodeManagerServiceImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/management/impl/SCANodeManagerServiceImpl.java?rev=602979&r1=602978&r2=602979&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/management/impl/SCANodeManagerServiceImpl.java (original)
+++ incubator/tuscany/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/management/impl/SCANodeManagerServiceImpl.java Mon Dec 10 09:52:35 2007
@@ -96,8 +96,8 @@
node.destroy();
}
- public void setReferenceEndpoint(String refererenceName, String bindingName, String serviceURI) throws NodeException {
- node.setReferenceEndpoint(refererenceName, bindingName, serviceURI);
+ public void updateComposite(String compositeQName, String compositeXMLBase64 ) throws NodeException {
+ ((SCANodeImpl)node).updateComposite(QName.valueOf(compositeQName), compositeXMLBase64 );
}
// ComponentManagerService
Modified: incubator/tuscany/java/sca/modules/node/src/main/java/org/apache/tuscany/sca/node/management/SCANodeManagerService.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/node/src/main/java/org/apache/tuscany/sca/node/management/SCANodeManagerService.java?rev=602979&r1=602978&r2=602979&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/node/src/main/java/org/apache/tuscany/sca/node/management/SCANodeManagerService.java (original)
+++ incubator/tuscany/java/sca/modules/node/src/main/java/org/apache/tuscany/sca/node/management/SCANodeManagerService.java Mon Dec 10 09:52:35 2007
@@ -86,12 +86,11 @@
public void destroyNode() throws NodeException;
/**
- * Set a reference endpoint based on information registered with the domain
- *
- * @param refererenceName the name of the reference in question
- * @param bindingClassName the class name of the binding on the reference
- * @param serviceURI the uri to set
+ * Pass in an updated version of a composite in base64 encoded XML form. The node will compare
+ * this against the version of the composite it has and apply and changes found
+ * @param compositeQName
+ * @param compositeXMLBase64
* @throws NodeException
*/
- public void setReferenceEndpoint(String refererenceName, String bindingClassName, String serviceURI) throws NodeException;
+ public void updateComposite(String compositeQName, String compositeXMLBase64 ) throws NodeException;
}
---------------------------------------------------------------------
To unsubscribe, e-mail: tuscany-commits-unsubscribe@ws.apache.org
For additional commands, e-mail: tuscany-commits-help@ws.apache.org