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");



Reply via email to