The Node API is designed to bootstrap the Tuscany runtime to run a fully-resolved SCA composite application. Discovering contributions is a separate concern than creating a Node. Tangling different things together to provide "shortcut" APIs will mislead our users. Making sure the APIs reflect the basic concepts behind SCA domain is very important.
Can you provide a javadoc for the NodeFactory.createNode() method so that we can understand under what condition we can use this API? By looking at the diff, there are environment-dependent assumptions to ensure it works, for example, we need to have a META-INF/sca-contributions.xml on the classpath. Thanks, Raymond From: ant elder Sent: Monday, November 24, 2008 7:44 AM To: [email protected] Subject: Re: Node API, was: Re: svn commit: r719565 One of the goals of 2.0 is to be more user friendly and simple to use, this change helps with that. There are no "environment-dependent assumptions" and even if there were thats not necessarily a bad thing if they help make things easier for our users. Do you have any specific concrete scenarios or testcases that highlight any real issues with this? Till we have one of those i see no problem with doing this. ...ant On Fri, Nov 21, 2008 at 6:56 PM, Raymond Feng <[EMAIL PROTECTED]> wrote: Hi, I have concerns over this change. The Node API should deal with SCA concepts such as deployment composite and contributions so that it can be consistently supported in different hosting environment. It's very important to make sure that the Node API doesn't have "shortcut" for environment-dependent assumptions. IMO, "simplification" for one type of usages may complicate the API. ThaNt's the kind of "hack" we want to avoid for the core in 2.x stream. The callers of the Node API should know what they are doing. The ContributionLocationHelper is introduced to help locate contributions using different mechanisms such as searching for certain resources or classes on the classpath. I would suggest that you add such convenient methods to this class if it would be really helpful. Thanks, Raymond -------------------------------------------------- From: <[EMAIL PROTECTED]> Sent: Friday, November 21, 2008 4:16 AM To: <[EMAIL PROTECTED]> Subject: svn commit: r719565 - in /tuscany/java/sca: modules/node-api/src/main/java/org/apache/tuscany/sca/node/ modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/ modules/node-impl/src/test/java/org/apache/tuscany/sca/node/impl/ samples/calculat... Author: antelder Date: Fri Nov 21 04:16:29 2008 New Revision: 719565 URL: http://svn.apache.org/viewvc?rev=719565&view=rev Log: Simplify the Node API for a common default case so that creating a Node for simple samples and tests can be: node = NodeFactory.newInstance().createNode(); instead of: NodeFactory factory = NodeFactory.newInstance(); String root = ContributionLocationHelper.getContributionLocation("Calculator.composite"); Contribution contribution = new Contribution(root, root); node = factory.createNode("Calculator.composite", contribution); Modified: tuscany/java/sca/modules/node-api/src/main/java/org/apache/tuscany/sca/node/NodeFactory.java tuscany/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/NodeFactoryImpl.java tuscany/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/NodeImpl.java tuscany/java/sca/modules/node-impl/src/test/java/org/apache/tuscany/sca/node/impl/NodeImplTestCase.java tuscany/java/sca/samples/calculator/src/main/java/calculator/CalculatorClient.java tuscany/java/sca/samples/calculator/src/test/java/calculator/CalculatorTestCase.java Modified: tuscany/java/sca/modules/node-api/src/main/java/org/apache/tuscany/sca/node/NodeFactory.java URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/node-api/src/main/java/org/apache/tuscany/sca/node/NodeFactory.java?rev=719565&r1=719564&r2=719565&view=diff ============================================================================== --- tuscany/java/sca/modules/node-api/src/main/java/org/apache/tuscany/sca/node/NodeFactory.java (original) +++ tuscany/java/sca/modules/node-api/src/main/java/org/apache/tuscany/sca/node/NodeFactory.java Fri Nov 21 04:16:29 2008 @@ -156,6 +156,13 @@ } /** + * Creates a new SCA node using defaults for the contribution location and runnable composite + * + * @return a new SCA node. + */ + public abstract Node createNode(); + + /** * Creates a new SCA node from the configuration URL * * @param configurationURL the URL of the node configuration which is the ATOM feed Modified: tuscany/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/NodeFactoryImpl.java URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/NodeFactoryImpl.java?rev=719565&r1=719564&r2=719565&view=diff ============================================================================== --- tuscany/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/NodeFactoryImpl.java (original) +++ tuscany/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/NodeFactoryImpl.java Fri Nov 21 04:16:29 2008 @@ -47,4 +47,8 @@ return new NodeImpl(compositeURI, compositeContent, contributions); } + @Override + public Node createNode() { + return new NodeImpl(); + } } Modified: tuscany/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/NodeImpl.java URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/NodeImpl.java?rev=719565&r1=719564&r2=719565&view=diff ============================================================================== --- tuscany/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/NodeImpl.java (original) +++ tuscany/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/NodeImpl.java Fri Nov 21 04:16:29 2008 @@ -76,6 +76,7 @@ import org.apache.tuscany.sca.monitor.Problem; import org.apache.tuscany.sca.monitor.Problem.Severity; import org.apache.tuscany.sca.node.Client; +import org.apache.tuscany.sca.node.ContributionLocationHelper; import org.apache.tuscany.sca.node.Node; import org.apache.tuscany.sca.runtime.RuntimeComponent; import org.apache.tuscany.sca.runtime.RuntimeComponentContext; @@ -124,6 +125,50 @@ /** * Constructs a new SCA node. + */ + NodeImpl() { + configurationName = "default"; + logger.log(Level.INFO, "Creating node: " + configurationName); + + String root = ContributionLocationHelper.getContributionLocation("META-INF/sca-contribution.xml"); + if (root == null) { + throw new ServiceRuntimeException("no META-INF/sca-contribution.xml found"); + } + + String compositeURI = null; + org.apache.tuscany.sca.node.Contribution[] contributions = new org.apache.tuscany.sca.node.Contribution[]{new org.apache.tuscany.sca.node.Contribution(root, root)}; + + try { + // Initialize the runtime + init(); + + // Create a node configuration + NodeImplementationFactory nodeImplementationFactory = modelFactories.getFactory(NodeImplementationFactory.class); + ConfiguredNodeImplementation configuration = nodeImplementationFactory.createConfiguredNodeImplementation(); + + if (compositeURI != null) { + Composite composite = assemblyFactory.createComposite(); + composite.setURI(compositeURI); + composite.setUnresolved(true); + configuration.setComposite(composite); + } + + // Create contribution models + for (org.apache.tuscany.sca.node.Contribution c : contributions) { + Contribution contribution = contribution(contributionFactory, c); + configuration.getContributions().add(contribution); + } + + // Configure the node + configureNode(configuration); + + } catch (Exception e) { + throw new ServiceRuntimeException(e); + } + } + + /** + * Constructs a new SCA node. * * @param configurationURI the URI of the node configuration information. */ @@ -401,6 +446,10 @@ composite = configuration.getComposite(); + if (composite == null) { + setDefaultComposite(configuration, workspace); + } + // Find the composite in the given contributions boolean found = false; Artifact compositeFile = contributionFactory.createArtifact(); @@ -590,4 +639,20 @@ } } + /* + * Sets a default composite by using any deployable one. + */ + private void setDefaultComposite(ConfiguredNodeImplementation configuration, Workspace workspace) { + // just use the first deployable composte + for (Contribution contribution : workspace.getContributions()) { + for (Composite c : contribution.getDeployables()) { + composite = assemblyFactory.createComposite(); + composite.setURI(c.getURI()); + composite.setUnresolved(true); + configuration.setComposite(composite); + return; + } + } + throw new ServiceRuntimeException("no deployable composite found"); + } } Modified: tuscany/java/sca/modules/node-impl/src/test/java/org/apache/tuscany/sca/node/impl/NodeImplTestCase.java URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/node-impl/src/test/java/org/apache/tuscany/sca/node/impl/NodeImplTestCase.java?rev=719565&r1=719564&r2=719565&view=diff ============================================================================== --- tuscany/java/sca/modules/node-impl/src/test/java/org/apache/tuscany/sca/node/impl/NodeImplTestCase.java (original) +++ tuscany/java/sca/modules/node-impl/src/test/java/org/apache/tuscany/sca/node/impl/NodeImplTestCase.java Fri Nov 21 04:16:29 2008 @@ -25,7 +25,6 @@ import junit.framework.Assert; -import org.apache.tuscany.sca.node.Client; import org.apache.tuscany.sca.node.Contribution; import org.apache.tuscany.sca.node.Node; import org.apache.tuscany.sca.node.NodeFactory; @@ -63,6 +62,11 @@ testNode(node); } + @Test + public void testDefaultNode() { + testNode(new NodeFactoryImpl().createNode()); + } + private void testNode(Node node) { node.start(); HelloWorld hw = node.getService(HelloWorld.class, "HelloWorld"); Modified: tuscany/java/sca/samples/calculator/src/main/java/calculator/CalculatorClient.java URL: http://svn.apache.org/viewvc/tuscany/java/sca/samples/calculator/src/main/java/calculator/CalculatorClient.java?rev=719565&r1=719564&r2=719565&view=diff ============================================================================== --- tuscany/java/sca/samples/calculator/src/main/java/calculator/CalculatorClient.java (original) +++ tuscany/java/sca/samples/calculator/src/main/java/calculator/CalculatorClient.java Fri Nov 21 04:16:29 2008 @@ -20,8 +20,6 @@ package calculator; import org.apache.tuscany.sca.node.Client; -import org.apache.tuscany.sca.node.Contribution; -import org.apache.tuscany.sca.node.ContributionLocationHelper; import org.apache.tuscany.sca.node.Node; import org.apache.tuscany.sca.node.NodeFactory; @@ -32,10 +30,7 @@ public class CalculatorClient { public static void main(String[] args) throws Exception { - NodeFactory factory = NodeFactory.newInstance(); - String root = ContributionLocationHelper.getContributionLocation("Calculator.composite"); - Contribution contribution = new Contribution(root, root); - Node node = factory.createNode("Calculator.composite", contribution); + Node node = NodeFactory.newInstance().createNode(); node.start(); Modified: tuscany/java/sca/samples/calculator/src/test/java/calculator/CalculatorTestCase.java URL: http://svn.apache.org/viewvc/tuscany/java/sca/samples/calculator/src/test/java/calculator/CalculatorTestCase.java?rev=719565&r1=719564&r2=719565&view=diff ============================================================================== --- tuscany/java/sca/samples/calculator/src/test/java/calculator/CalculatorTestCase.java (original) +++ tuscany/java/sca/samples/calculator/src/test/java/calculator/CalculatorTestCase.java Fri Nov 21 04:16:29 2008 @@ -21,8 +21,6 @@ import junit.framework.TestCase; import org.apache.tuscany.sca.node.Client; -import org.apache.tuscany.sca.node.Contribution; -import org.apache.tuscany.sca.node.ContributionLocationHelper; import org.apache.tuscany.sca.node.Node; import org.apache.tuscany.sca.node.NodeFactory; @@ -36,11 +34,7 @@ @Override protected void setUp() throws Exception { - NodeFactory factory = NodeFactory.newInstance(); - String root = ContributionLocationHelper.getContributionLocation("Calculator.composite"); - Contribution contribution = new Contribution(root, root); - node = factory.createNode("Calculator.composite", contribution); - + node = NodeFactory.newInstance().createNode(); node.start(); calculatorService = ((Client)node).getService(CalculatorService.class, "CalculatorServiceComponent");
