You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by lr...@apache.org on 2007/03/26 23:06:36 UTC

svn commit: r522627 - in /incubator/tuscany/java/sca/runtime/services/contribution: contribution-framework/src/main/java/org/apache/tuscany/services/contribution/model/ contribution-framework/src/main/java/org/apache/tuscany/services/contribution/spi/ ...

Author: lresende
Date: Mon Mar 26 14:06:34 2007
New Revision: 522627

URL: http://svn.apache.org/viewvc?view=rev&rev=522627
Log:
Adding/Merging couple testcases around contribution services components

Added:
    incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/test/java/org/
    incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/test/java/org/apache/
    incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/test/java/org/apache/tuscany/
    incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/test/java/org/apache/tuscany/services/
    incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/test/java/org/apache/tuscany/services/contribution/
    incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/test/java/org/apache/tuscany/services/contribution/ContentTypeDescriberImplTestCase.java
      - copied, changed from r519481, incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/test/java/org/apache/tuscany/core/services/deployment/ContentTypeDescriberImplTestCase.java
    incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/test/java/org/apache/tuscany/services/contribution/ContributionLoaderTestCase.java
      - copied, changed from r519481, incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/test/java/org/apache/tuscany/core/services/deployment/ContributionLoaderTestCase.java
    incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/test/java/org/apache/tuscany/services/contribution/ContributionRepositoryTestCase.java
      - copied, changed from r519481, incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/test/java/org/apache/tuscany/core/services/deployment/ContributionRepositoryTestCase.java
    incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/test/java/org/apache/tuscany/services/contribution/ContributionServiceImplTestCase.java
      - copied, changed from r519481, incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/test/java/org/apache/tuscany/core/services/deployment/ContributionServiceImplTestCase.java
    incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/test/java/org/apache/tuscany/services/contribution/processor/
    incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/test/java/org/apache/tuscany/services/contribution/processor/CompositeContributionProcessorTestCase.java
      - copied, changed from r519481, incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/test/java/org/apache/tuscany/core/services/deployment/contribution/CompositeContributionProcessorTestCase.java
    incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/test/java/org/apache/tuscany/services/contribution/processor/FolderContributionProcessorTestCase.java
      - copied, changed from r519481, incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/test/java/org/apache/tuscany/core/services/deployment/contribution/FolderContributionProcessorTestCase.java
    incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/test/java/org/apache/tuscany/services/contribution/processor/JarContributionProcessorTestCase.java
      - copied, changed from r519481, incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/test/java/org/apache/tuscany/core/services/deployment/contribution/JarContributionProcessorTestCase.java
    incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/test/java/org/apache/tuscany/services/contribution/processor/JavaContributionProcessorTestCase.java
      - copied, changed from r519481, incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/test/java/org/apache/tuscany/core/services/deployment/contribution/JavaContributionProcessorTestCase.java
    incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/test/resources/deployables/
      - copied from r519481, incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/test/resources/deployables/
    incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/test/resources/org/
    incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/test/resources/org/apache/
    incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/test/resources/org/apache/tuscany/
    incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/test/resources/org/apache/tuscany/services/
    incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/test/resources/org/apache/tuscany/services/contribution/
    incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/test/resources/org/apache/tuscany/services/contribution/test.ext
      - copied unchanged from r519481, incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/test/resources/org/apache/tuscany/core/services/deployment/test.ext
    incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/test/resources/org/apache/tuscany/services/contribution/test.scdl
      - copied unchanged from r519481, incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/test/resources/org/apache/tuscany/core/services/deployment/test.scdl
    incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/test/resources/repository/
      - copied from r519481, incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/test/resources/repository/
Modified:
    incubator/tuscany/java/sca/runtime/services/contribution/contribution-framework/src/main/java/org/apache/tuscany/services/contribution/model/ContentType.java
    incubator/tuscany/java/sca/runtime/services/contribution/contribution-framework/src/main/java/org/apache/tuscany/services/contribution/spi/ContributionService.java
    incubator/tuscany/java/sca/runtime/services/contribution/contribution/.checkstyle
    incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/main/java/org/apache/tuscany/services/contribution/ContentTypeDescriberImpl.java
    incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/main/java/org/apache/tuscany/services/contribution/ContributionDirectoryWatcher.java
    incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/main/java/org/apache/tuscany/services/contribution/ContributionLoader.java
    incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/main/java/org/apache/tuscany/services/contribution/ContributionRepositoryImpl.java
    incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/main/java/org/apache/tuscany/services/contribution/ContributionServiceImpl.java

Modified: incubator/tuscany/java/sca/runtime/services/contribution/contribution-framework/src/main/java/org/apache/tuscany/services/contribution/model/ContentType.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/runtime/services/contribution/contribution-framework/src/main/java/org/apache/tuscany/services/contribution/model/ContentType.java?view=diff&rev=522627&r1=522626&r2=522627
==============================================================================
--- incubator/tuscany/java/sca/runtime/services/contribution/contribution-framework/src/main/java/org/apache/tuscany/services/contribution/model/ContentType.java (original)
+++ incubator/tuscany/java/sca/runtime/services/contribution/contribution-framework/src/main/java/org/apache/tuscany/services/contribution/model/ContentType.java Mon Mar 26 14:06:34 2007
@@ -33,5 +33,11 @@
     public static final String COMPOSITE = "application/vnd.tuscany.composite";
     public static final String WSDL = "application/vnd.tuscany.wsdl";
     public static final String JAVA = "application/java-vm";
+    
+    /**
+     * Unkown contentType
+     */
+    
+    public static final String UNKNOWN = "content/unknown";
  
 }

Modified: incubator/tuscany/java/sca/runtime/services/contribution/contribution-framework/src/main/java/org/apache/tuscany/services/contribution/spi/ContributionService.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/runtime/services/contribution/contribution-framework/src/main/java/org/apache/tuscany/services/contribution/spi/ContributionService.java?view=diff&rev=522627&r1=522626&r2=522627
==============================================================================
--- incubator/tuscany/java/sca/runtime/services/contribution/contribution-framework/src/main/java/org/apache/tuscany/services/contribution/spi/ContributionService.java (original)
+++ incubator/tuscany/java/sca/runtime/services/contribution/contribution-framework/src/main/java/org/apache/tuscany/services/contribution/spi/ContributionService.java Mon Mar 26 14:06:34 2007
@@ -31,39 +31,61 @@
  */
 public interface ContributionService {
     /**
-     * Contribute an artifact to the SCA Domain. The type of the contribution is determined by the Content-Type of the
-     * resource or, if that is undefined, by some implementation-specific means (such as mapping an extension in the
-     * URL's path).
-     *
-     * @param contribution the location of the resource containing the artifact
-     * @param storeInRepository  flag that identifies if you want to copy the contribution to the repository 
-     * @return a URI that uniquely identifies this contribution within the SCA Domain
+     * Contribute an artifact to the SCA Domain. The type of the contribution is
+     * determined by the Content-Type of the resource or, if that is undefined,
+     * by some implementation-specific means (such as mapping an extension in
+     * the URL's path).
+     * 
+     * @param contributionURI The URI that is used as the contribution unique ID. 
+     * @param sourceURL the location of the resource containing the artifact
+     * @param storeInRepository flag that identifies if you want to copy the
+     *            contribution to the repository
      * @throws DeploymentException if there was a problem with the contribution
-     * @throws IOException         if there was a problem reading the resource
+     * @throws IOException if there was a problem reading the resource
      */
-    URI contribute(URL contribution, boolean storeInRepository) throws ContributionException, IOException;
+    void contribute(URI contributionURI, URL sourceURL, boolean storeInRepository) throws ContributionException,
+        IOException;
 
     /**
      * Contribute an artifact to the SCA Domain.
-     *
-     * @param source       an identifier for the source of this contribution
-     * @param contribution a stream containing the resource being contributed; the stream will not be closed but the
-     *                        read position after the call is undefined
-     * @param storeInRepository  flag that identifies if you want to copy the contribution to the repository
-     * @return a URI that uniquely identifies this contribution within the SCA Domain
+     * 
+     * @param contributionURI The URI that is used as the contribution unique ID.
+     * @param contributionContent a stream containing the resource being
+     *            contributed; the stream will not be closed but the read
+     *            position after the call is undefined
      * @throws DeploymentException if there was a problem with the contribution
-     * @throws IOException         if there was a problem reading the stream
+     * @throws IOException if there was a problem reading the stream
      */
-    URI contribute(URI source, InputStream contribution,  boolean storeInRepository)
+    void contribute(URI contributionURI, InputStream contributionContent)
         throws ContributionException, IOException;
-    
+
+    /**
+     * Get the model for an installed contribution
+     * 
+     * @param contribution The URI of an installed contribution
+     * @return The model for the contribution or null if there is no such
+     *         contribution
+     */
+    Object getContribution(URI contribution);
+
+    /**
+     * Adds or updates a deployment composite using a supplied composite
+     * ("composite by value" – a data structure, not an existing resource in the
+     * domain) to the contribution identified by a supplied contribution URI.
+     * The added or updated deployment composite is given a relative URI that
+     * matches the "name" attribute of the composite, with a ".composite"
+     * suffix.
+     */
+    void addDeploymentComposite(URI contribution, Object composite);
+
     /**
      * Remove a contribution from the SCA domain
+     * 
      * @param contribution The URI of the contribution
-     * @throws DeploymentException if there was a problem with the contribution
+     * @throws DeploymentException
      */
     void remove(URI contribution) throws ContributionException;
-    
+
     /**
      * Resolve an artifact by QName within the contribution
      * 
@@ -75,22 +97,25 @@
      * @return The resolved artifact
      */
     <T> T resolve(URI contribution, Class<T> definitionType, String namespace, String name);
-    
+
     /**
-     * Resolve the reference to an artifact by the location URI within the given contribution. 
-     * Some typical use cases are:
+     * Resolve the reference to an artifact by the location URI within the given
+     * contribution. Some typical use cases are:
      * <ul>
      * <li>Reference a XML schema using
      * {http://www.w3.org/2001/XMLSchema-instance}schemaLocation or
      * <li>Reference a list of WSDLs using
      * {http://www.w3.org/2004/08/wsdl-instance}wsdlLocation
      * </ul>
+     * 
      * @param contribution The URI of the contribution
-     * @param namespace The namespace of the artifact. This is for validation purpose. If the namespace is null,
-     * then no check will be performed.  
+     * @param namespace The namespace of the artifact. This is for validation
+     *            purpose. If the namespace is null, then no check will be
+     *            performed.
      * @param uri The location URI
-     * @param baseURI The URI of the base artifact where the reference is declared
+     * @param baseURI The URI of the base artifact where the reference is
+     *            declared
      * @return The URL of the resolved artifact
      */
     URL resolve(URI contribution, String namespace, URI uri, URI baseURI);
-}
+}
\ No newline at end of file

Modified: incubator/tuscany/java/sca/runtime/services/contribution/contribution/.checkstyle
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/runtime/services/contribution/contribution/.checkstyle?view=diff&rev=522627&r1=522626&r2=522627
==============================================================================
--- incubator/tuscany/java/sca/runtime/services/contribution/contribution/.checkstyle (original)
+++ incubator/tuscany/java/sca/runtime/services/contribution/contribution/.checkstyle Mon Mar 26 14:06:34 2007
@@ -1,24 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!--
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
--->
 <fileset-config file-format-version="1.2.0" simple-config="true">
-    <fileset name="all" enabled="true" check-config-name="Tuscany Checks" local="false">
+    <fileset name="all" enabled="true" check-config-name="Sun Checks" local="false">
         <file-match-pattern match-pattern="." include-pattern="true"/>
     </fileset>
 </fileset-config>

Modified: incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/main/java/org/apache/tuscany/services/contribution/ContentTypeDescriberImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/main/java/org/apache/tuscany/services/contribution/ContentTypeDescriberImpl.java?view=diff&rev=522627&r1=522626&r2=522627
==============================================================================
--- incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/main/java/org/apache/tuscany/services/contribution/ContentTypeDescriberImpl.java (original)
+++ incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/main/java/org/apache/tuscany/services/contribution/ContentTypeDescriberImpl.java Mon Mar 26 14:06:34 2007
@@ -25,12 +25,11 @@
 import java.util.HashMap;
 import java.util.Map;
 
-import org.osoa.sca.annotations.EagerInit;
-import org.osoa.sca.annotations.Service;
-
+import org.apache.tuscany.services.contribution.model.ContentType;
 import org.apache.tuscany.services.contribution.spi.ContentTypeDescriber;
-
 import org.apache.tuscany.services.contribution.util.FileHelper;
+import org.osoa.sca.annotations.EagerInit;
+import org.osoa.sca.annotations.Service;
 
 /**
  * Implementation of the content describer
@@ -51,10 +50,10 @@
      * Initialize contentType registry with know types based on known file extensions
      */
     private void init() {
-        contentTypeRegistry.put("SCDL", "application/v.tuscany.scdl");
-        contentTypeRegistry.put("COMPOSITE", "application/v.tuscany.scdl");
-        contentTypeRegistry.put("WSDL", "application/v.tuscany.wsdl");
-        contentTypeRegistry.put("JAR", "application/x-compressed");
+        contentTypeRegistry.put("COMPOSITE", ContentType.COMPOSITE);
+        contentTypeRegistry.put("SCDL", ContentType.COMPOSITE);
+        contentTypeRegistry.put("WSDL", ContentType.WSDL);
+        contentTypeRegistry.put("JAR", ContentType.JAR);
     }
 
     protected String resolveContentyTypeByExtension(URL resourceURL) {
@@ -84,7 +83,7 @@
                 connection = resourceURL.openConnection();
                 contentType = connection.getContentType();
 
-                if (contentType == null || contentType.equals("content/unknown")) {
+                if (contentType == null || contentType.equals(ContentType.UNKNOWN)) {
                     // here we couldn't figure out from our registry or from URL
                     // return defaultContentType if provided
                     contentType = defaultContentType;

Modified: incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/main/java/org/apache/tuscany/services/contribution/ContributionDirectoryWatcher.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/main/java/org/apache/tuscany/services/contribution/ContributionDirectoryWatcher.java?view=diff&rev=522627&r1=522626&r2=522627
==============================================================================
--- incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/main/java/org/apache/tuscany/services/contribution/ContributionDirectoryWatcher.java (original)
+++ incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/main/java/org/apache/tuscany/services/contribution/ContributionDirectoryWatcher.java Mon Mar 26 14:06:34 2007
@@ -51,6 +51,7 @@
 
         File[] files = extensionDir.listFiles();
         for (File file : files) {
+            /*
             try {
                 if (file.isDirectory()) {
                     this.contributionService.contribute(file.toURL(), false);
@@ -64,6 +65,7 @@
                 // FIXME handle this
                 ioe.printStackTrace();
             }
+            */
         }
     }
 }

Modified: incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/main/java/org/apache/tuscany/services/contribution/ContributionLoader.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/main/java/org/apache/tuscany/services/contribution/ContributionLoader.java?view=diff&rev=522627&r1=522626&r2=522627
==============================================================================
--- incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/main/java/org/apache/tuscany/services/contribution/ContributionLoader.java (original)
+++ incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/main/java/org/apache/tuscany/services/contribution/ContributionLoader.java Mon Mar 26 14:06:34 2007
@@ -30,8 +30,6 @@
 
 import org.apache.tuscany.services.contribution.model.Contribution;
 import org.apache.tuscany.services.contribution.model.ContributionImport;
-import org.osoa.sca.annotations.Constructor;
-import org.osoa.sca.annotations.Reference;
 
 /**
  * Loader that handles contribution metadata files
@@ -52,9 +50,10 @@
         return CONTRIBUTION;
     }
 
-    public Contribution load(ModelObject object,
-                             XMLStreamReader reader,
-                             DeploymentContext deploymentContext) throws XMLStreamException, LoaderException {
+    /* (non-Javadoc)
+     * @see org.apache.tuscany.services.contribution.ContributionMetadataLoader#load(javax.xml.stream.XMLStreamReader)
+     */
+    public Contribution load(XMLStreamReader reader) throws XMLStreamException, ContributionLoaderException {
 
         Contribution contribution = new Contribution();
         while (true) {

Modified: incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/main/java/org/apache/tuscany/services/contribution/ContributionRepositoryImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/main/java/org/apache/tuscany/services/contribution/ContributionRepositoryImpl.java?view=diff&rev=522627&r1=522626&r2=522627
==============================================================================
--- incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/main/java/org/apache/tuscany/services/contribution/ContributionRepositoryImpl.java (original)
+++ incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/main/java/org/apache/tuscany/services/contribution/ContributionRepositoryImpl.java Mon Mar 26 14:06:34 2007
@@ -44,9 +44,9 @@
 import javax.xml.stream.XMLStreamConstants;
 import javax.xml.stream.XMLStreamReader;
 
+import org.apache.tuscany.services.contribution.spi.ContributionRepository;
 import org.apache.tuscany.services.contribution.util.FileHelper;
 import org.apache.tuscany.services.contribution.util.IOHelper;
-import org.apache.tuscany.spi.deployer.ContributionRepository;
 import org.osoa.sca.annotations.Constructor;
 import org.osoa.sca.annotations.Destroy;
 import org.osoa.sca.annotations.EagerInit;

Modified: incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/main/java/org/apache/tuscany/services/contribution/ContributionServiceImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/main/java/org/apache/tuscany/services/contribution/ContributionServiceImpl.java?view=diff&rev=522627&r1=522626&r2=522627
==============================================================================
--- incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/main/java/org/apache/tuscany/services/contribution/ContributionServiceImpl.java (original)
+++ incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/main/java/org/apache/tuscany/services/contribution/ContributionServiceImpl.java Mon Mar 26 14:06:34 2007
@@ -21,13 +21,17 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.URI;
-import java.net.URISyntaxException;
 import java.net.URL;
+import java.net.URLClassLoader;
 import java.util.HashMap;
 import java.util.Map;
-import java.util.UUID;
+
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
 
 import org.apache.tuscany.services.contribution.model.Contribution;
+import org.apache.tuscany.services.contribution.model.DeployedArtifact;
 import org.apache.tuscany.services.contribution.spi.ContributionException;
 import org.apache.tuscany.services.contribution.spi.ContributionProcessorRegistry;
 import org.apache.tuscany.services.contribution.spi.ContributionRepository;
@@ -43,93 +47,193 @@
      * Repository where contributions are stored. Usually set by injection.
      */
     protected ContributionRepository contributionRepository;
+
     /**
      * Registry of available processors. Usually set by injection.
      */
     protected ContributionProcessorRegistry processorRegistry;
+
+    /**
+     * xml factory used to create reader instance to load contribution metadata
+     */
+    protected XMLInputFactory xmlFactory;
+    /**
+     * contribution metadata loader
+     */
+    protected ContributionLoader contributionLoader;
+
+
     /**
-     * Contribution registry This is a registry of processed Contributios index by URI
+     * Contribution registry This is a registry of processed Contributios index
+     * by URI
      */
     protected Map<URI, Contribution> contributionRegistry = new HashMap<URI, Contribution>();
 
-    public ContributionServiceImpl(@Reference ContributionRepository repository,
-                                   @Reference ContributionProcessorRegistry processorRegistry) {
+    //protected ArtifactResolverRegistry resolverRegistry;
+
+    public ContributionServiceImpl(@Reference
+    ContributionRepository repository, @Reference
+    ContributionProcessorRegistry processorRegistry/*, @Reference
+    ArtifactResolverRegistry resolverRegistry*/) {
         super();
         this.contributionRepository = repository;
         this.processorRegistry = processorRegistry;
+        //this.resolverRegistry = resolverRegistry;
+        
+        this.xmlFactory = XMLInputFactory.newInstance("javax.xml.stream.XMLInputFactory", getClass().getClassLoader());
+        this.contributionLoader = new ContributionLoader();
     }
 
-    public URI contribute(URL contribution, boolean storeInRepository) throws ContributionException, IOException {
-        if (contribution == null) {
-            throw new IllegalArgumentException("contribution is null");
+    public void contribute(URI contributionURI, URL sourceURL, boolean storeInRepository) throws ContributionException,
+        IOException {
+        if (contributionURI == null) {
+            throw new IllegalArgumentException("URI for the contribution is null");
         }
-
-        URI source;
-        try {
-            source = contribution.toURI();
-        } catch (URISyntaxException e) {
-            throw new IllegalArgumentException("contribution cannot be converted to a URI", e);
+        if (sourceURL == null) {
+            throw new IllegalArgumentException("Source URL for the contribution is null");
         }
 
-        InputStream is = contribution.openConnection().getInputStream();
+        addContribution(contributionURI, sourceURL, null, storeInRepository);
+    }
+
+    public void contribute(URI contributionURI, InputStream input) throws ContributionException, IOException {
+        addContribution(contributionURI, null, input, true);
+    }
+
+    private Contribution initializeContributionMetadata(URL sourceURL) throws ContributionException {
+        Contribution contributionMetadata = null;
+        URL contributionMetadataURL;
+        URL generatedContributionMetadataURL;
+        InputStream metadataStream = null;
+
+        URL[] clUrls = {sourceURL};
+        URLClassLoader cl = new URLClassLoader(clUrls, getClass().getClassLoader());
+
+        contributionMetadataURL = cl.getResource(Contribution.SCA_CONTRIBUTION_META);
+        generatedContributionMetadataURL = cl.getResource(Contribution.SCA_CONTRIBUTION_GENERATED_META);
+
         try {
-            return contribute(source, is, storeInRepository);
+            if (contributionMetadataURL == null && generatedContributionMetadataURL == null) {
+                contributionMetadata = new Contribution();
+            } else {
+                URL metadataURL =
+                    contributionMetadataURL != null ? contributionMetadataURL : generatedContributionMetadataURL;
+
+                try {
+                    metadataStream = metadataURL.openStream();
+                    XMLStreamReader xmlReader = this.xmlFactory.createXMLStreamReader(metadataStream);
+                    contributionMetadata = this.contributionLoader.load(xmlReader);
+
+                } catch (IOException ioe) {
+                    throw new 
+                        InvalidContributionMetadataException(ioe.getMessage(), metadataURL.toExternalForm(), ioe);
+                } catch (XMLStreamException xmle) {
+                    throw new 
+                        InvalidContributionMetadataException(xmle.getMessage(), metadataURL.toExternalForm(), xmle);
+                } catch (ContributionLoaderException le) {
+                    throw new 
+                        InvalidContributionMetadataException(le.getMessage(), metadataURL.toExternalForm(), le);
+                }
+            }
         } finally {
-            IOHelper.closeQuietly(is);
+            IOHelper.closeQuietly(metadataStream);
+            metadataStream = null;
         }
-    }
 
-    public URI contribute(URI source, InputStream contributionStream, boolean storeInRepository)
-        throws ContributionException, IOException {
-        if (source == null) {
-            throw new IllegalArgumentException("source URI for contribution is null");
+        if (contributionMetadata == null) {
+            contributionMetadata = new Contribution();
         }
 
-        if (contributionStream == null) {
-            throw new IllegalArgumentException("Invalid contribution stream : null");
+        return contributionMetadata;
+
+    }
+    
+    /**
+     * Note: 
+     * @param contributionURI ContributionID
+     * @param sourceURL contribution location
+     * @param contributionStream contribution content
+     * @param storeInRepository flag if we store the contribution into the repository or not
+     * @throws IOException
+     * @throws DeploymentException
+     */
+    private void addContribution(URI contributionURI, URL sourceURL, InputStream contributionStream, boolean storeInRepository)
+        throws IOException, ContributionException {
+        if (contributionStream == null && sourceURL == null) {
+            throw new IllegalArgumentException("The content of the contribution is null");
         }
 
         // store the contribution in the contribution repository
-        URI contributionURI = URI.create("sca://contribution/" + UUID.randomUUID());
-        URL locationURL;
-        if (storeInRepository) {
-            locationURL = this.contributionRepository.store(source, contributionStream);
-        } else {
-            locationURL = source.toURL();
+        URL locationURL = sourceURL;
+        if (contributionRepository != null && storeInRepository) {
+            if (sourceURL != null) {
+                locationURL = contributionRepository.store(contributionURI, sourceURL);
+            } else {
+                locationURL = contributionRepository.store(contributionURI, contributionStream);
+            }
         }
 
-
-        Contribution contribution = null;
-        contribution = new Contribution(contributionURI);
+        Contribution contribution = initializeContributionMetadata(locationURL);
+        contribution.setURI(contributionURI);
         contribution.setLocation(locationURL);
+        
+        if (contributionStream == null) {
+            contributionStream = sourceURL.openStream();
+            try {
+                // process the contribution
+                this.processorRegistry.processContent(contribution, contribution.getUri(), contributionStream);
+            } finally {
+                IOHelper.closeQuietly(contributionStream);
+                contributionStream = null;
+            }
 
-        //process the contribution
-        this.processorRegistry.processContent(contribution, contributionURI, locationURL.openStream());
+        } else {
+            // process the contribution
+            this.processorRegistry.processContent(contribution, contribution.getUri(), contributionStream);
+        }
+            
 
-        //store the contribution on the registry
+        // store the contribution on the registry
         this.contributionRegistry.put(contribution.getUri(), contribution);
-
-        return contribution.getUri();
     }
 
-    public Contribution getContribution(URI id) {
+    public Object getContribution(URI id) {
         return this.contributionRegistry.get(id);
     }
 
     public void remove(URI contribution) throws ContributionException {
-        //remove from repository
-        this.contributionRegistry.remove(contribution);
-        //remove from registry
+        // remove from repository
         this.contributionRegistry.remove(contribution);
     }
 
+    public void addDeploymentComposite(URI contribution, Object composite) {
+        /*
+        CompositeComponentType model = (CompositeComponentType)composite;
+        URI compositeURI = contribution.resolve(model.getName() + ".composite");
+        DeployedArtifact artifact = new DeployedArtifact(compositeURI);
+        // FIXME: the namespace should be from the CompositeComponentType model
+        artifact.addModelObject(composite.getClass(), null, composite);
+        Contribution contributionObject = (Contribution)getContribution(contribution);
+        contributionObject.addArtifact(artifact);
+        */
+    }
+
     public <T> T resolve(URI contribution, Class<T> definitionType, String namespace, String name) {
-        // TODO Auto-generated method stub
+        /*
+        Contribution contributionObject = (Contribution)getContribution(contribution);
+        return resolverRegistry.resolve(contributionObject, definitionType, namespace, name, null, null);
+        */
+        
         return null;
     }
 
     public URL resolve(URI contribution, String namespace, URI uri, URI baseURI) {
-        // TODO Auto-generated method stub
+        /*
+        Contribution contributionObject = (Contribution)getContribution(contribution);
+        return resolverRegistry.resolve(contributionObject, namespace, uri.toString(), baseURI.toString());
+        */
+        
         return null;
     }
-}
+
+}
\ No newline at end of file

Copied: incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/test/java/org/apache/tuscany/services/contribution/ContentTypeDescriberImplTestCase.java (from r519481, incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/test/java/org/apache/tuscany/core/services/deployment/ContentTypeDescriberImplTestCase.java)
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/test/java/org/apache/tuscany/services/contribution/ContentTypeDescriberImplTestCase.java?view=diff&rev=522627&p1=incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/test/java/org/apache/tuscany/core/services/deployment/ContentTypeDescriberImplTestCase.java&r1=519481&p2=incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/test/java/org/apache/tuscany/services/contribution/ContentTypeDescriberImplTestCase.java&r2=522627
==============================================================================
--- incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/test/java/org/apache/tuscany/core/services/deployment/ContentTypeDescriberImplTestCase.java (original)
+++ incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/test/java/org/apache/tuscany/services/contribution/ContentTypeDescriberImplTestCase.java Mon Mar 26 14:06:34 2007
@@ -16,13 +16,13 @@
  * specific language governing permissions and limitations
  * under the License.    
  */
-package org.apache.tuscany.core.services.deployment;
+package org.apache.tuscany.services.contribution;
 
 import java.net.URL;
 
 import junit.framework.TestCase;
 
-import org.apache.tuscany.spi.deployer.ContentType;
+import org.apache.tuscany.services.contribution.model.ContentType;
 
 public class ContentTypeDescriberImplTestCase extends TestCase {
     private ContentTypeDescriberImpl contentTypeBuilder;

Copied: incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/test/java/org/apache/tuscany/services/contribution/ContributionLoaderTestCase.java (from r519481, incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/test/java/org/apache/tuscany/core/services/deployment/ContributionLoaderTestCase.java)
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/test/java/org/apache/tuscany/services/contribution/ContributionLoaderTestCase.java?view=diff&rev=522627&p1=incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/test/java/org/apache/tuscany/core/services/deployment/ContributionLoaderTestCase.java&r1=519481&p2=incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/test/java/org/apache/tuscany/services/contribution/ContributionLoaderTestCase.java&r2=522627
==============================================================================
--- incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/test/java/org/apache/tuscany/core/services/deployment/ContributionLoaderTestCase.java (original)
+++ incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/test/java/org/apache/tuscany/services/contribution/ContributionLoaderTestCase.java Mon Mar 26 14:06:34 2007
@@ -17,18 +17,17 @@
  * under the License.    
  */
 
-package org.apache.tuscany.core.services.deployment;
+package org.apache.tuscany.services.contribution;
 
 import java.io.StringReader;
 
 import javax.xml.stream.XMLInputFactory;
 import javax.xml.stream.XMLStreamReader;
 
-import org.apache.tuscany.spi.loader.InvalidValueException;
-import org.apache.tuscany.spi.model.Contribution;
-
 import junit.framework.TestCase;
 
+import org.apache.tuscany.services.contribution.model.Contribution;
+
 /**
  * @version $Rev$ $Date$
  */
@@ -61,8 +60,8 @@
 
     public void testLoad() throws Exception {
         XMLStreamReader reader = factory.createXMLStreamReader(new StringReader(VALID_XML));
-        ContributionLoader loader = new ContributionLoader(null);
-        Contribution contribution = loader.load(null, null, reader, null);
+        ContributionLoader loader = new ContributionLoader();
+        Contribution contribution = loader.load(reader);
         assertNotNull(contribution);
         assertEquals(1, contribution.getImports().size());
         assertEquals(1, contribution.getExports().size());
@@ -71,9 +70,9 @@
 
     public void testLoadInvalid() throws Exception {
         XMLStreamReader reader = factory.createXMLStreamReader(new StringReader(INVALID_XML));
-        ContributionLoader loader = new ContributionLoader(null);
+        ContributionLoader loader = new ContributionLoader();
         try {
-            loader.load(null, null, reader, null);
+            loader.load(reader);
             fail("InvalidException should have been thrown");
         } catch (InvalidValueException e) {
             assertTrue(true);

Copied: incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/test/java/org/apache/tuscany/services/contribution/ContributionRepositoryTestCase.java (from r519481, incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/test/java/org/apache/tuscany/core/services/deployment/ContributionRepositoryTestCase.java)
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/test/java/org/apache/tuscany/services/contribution/ContributionRepositoryTestCase.java?view=diff&rev=522627&p1=incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/test/java/org/apache/tuscany/core/services/deployment/ContributionRepositoryTestCase.java&r1=519481&p2=incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/test/java/org/apache/tuscany/services/contribution/ContributionRepositoryTestCase.java&r2=522627
==============================================================================
--- incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/test/java/org/apache/tuscany/core/services/deployment/ContributionRepositoryTestCase.java (original)
+++ incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/test/java/org/apache/tuscany/services/contribution/ContributionRepositoryTestCase.java Mon Mar 26 14:06:34 2007
@@ -17,16 +17,16 @@
  * under the License.    
  */
 
-package org.apache.tuscany.core.services.deployment;
+package org.apache.tuscany.services.contribution;
 
 import java.io.File;
 import java.io.InputStream;
 import java.net.URI;
 import java.net.URL;
 
-import org.apache.tuscany.core.util.FileHelper;
-
 import junit.framework.TestCase;
+
+import org.apache.tuscany.services.contribution.util.FileHelper;
 
 public class ContributionRepositoryTestCase extends TestCase {
     private ContributionRepositoryImpl repository;

Copied: incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/test/java/org/apache/tuscany/services/contribution/ContributionServiceImplTestCase.java (from r519481, incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/test/java/org/apache/tuscany/core/services/deployment/ContributionServiceImplTestCase.java)
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/test/java/org/apache/tuscany/services/contribution/ContributionServiceImplTestCase.java?view=diff&rev=522627&p1=incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/test/java/org/apache/tuscany/core/services/deployment/ContributionServiceImplTestCase.java&r1=519481&p2=incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/test/java/org/apache/tuscany/services/contribution/ContributionServiceImplTestCase.java&r2=522627
==============================================================================
--- incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/test/java/org/apache/tuscany/core/services/deployment/ContributionServiceImplTestCase.java (original)
+++ incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/test/java/org/apache/tuscany/services/contribution/ContributionServiceImplTestCase.java Mon Mar 26 14:06:34 2007
@@ -17,19 +17,14 @@
  * under the License.    
  */
 
-package org.apache.tuscany.core.services.deployment;
-
-import java.net.URI;
-import java.net.URL;
+package org.apache.tuscany.services.contribution;
 
 import junit.framework.TestCase;
 
-import org.apache.tuscany.core.services.deployment.contribution.JarContributionProcessor;
-import org.apache.tuscany.core.services.deployment.contribution.JavaContributionProcessor;
-import org.apache.tuscany.host.deployment.ContributionService;
-import org.apache.tuscany.spi.deployer.ContentTypeDescriber;
-import org.apache.tuscany.spi.deployer.ContributionProcessorRegistry;
-import org.apache.tuscany.spi.deployer.ContributionRepository;
+import org.apache.tuscany.services.contribution.spi.ContentTypeDescriber;
+import org.apache.tuscany.services.contribution.spi.ContributionProcessorRegistry;
+import org.apache.tuscany.services.contribution.spi.ContributionRepository;
+import org.apache.tuscany.services.contribution.spi.ContributionService;
 
 /**
  * This is more intended to be a integration test then a unit test. *

Copied: incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/test/java/org/apache/tuscany/services/contribution/processor/CompositeContributionProcessorTestCase.java (from r519481, incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/test/java/org/apache/tuscany/core/services/deployment/contribution/CompositeContributionProcessorTestCase.java)
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/test/java/org/apache/tuscany/services/contribution/processor/CompositeContributionProcessorTestCase.java?view=diff&rev=522627&p1=incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/test/java/org/apache/tuscany/core/services/deployment/contribution/CompositeContributionProcessorTestCase.java&r1=519481&p2=incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/test/java/org/apache/tuscany/services/contribution/processor/CompositeContributionProcessorTestCase.java&r2=522627
==============================================================================
--- incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/test/java/org/apache/tuscany/core/services/deployment/contribution/CompositeContributionProcessorTestCase.java (original)
+++ incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/test/java/org/apache/tuscany/services/contribution/processor/CompositeContributionProcessorTestCase.java Mon Mar 26 14:06:34 2007
@@ -16,26 +16,13 @@
  * specific language governing permissions and limitations
  * under the License.    
  */
-package org.apache.tuscany.core.services.deployment.contribution;
+package org.apache.tuscany.services.contribution.processor;
 
 import java.net.URL;
 import java.util.jar.JarEntry;
 import java.util.jar.JarInputStream;
 
 import junit.framework.TestCase;
-
-import org.apache.tuscany.core.idl.java.JavaInterfaceProcessorRegistryImpl;
-import org.apache.tuscany.core.implementation.IntrospectionRegistryImpl;
-import org.apache.tuscany.core.implementation.processor.DestroyProcessor;
-import org.apache.tuscany.core.implementation.processor.ImplementationProcessorServiceImpl;
-import org.apache.tuscany.core.implementation.processor.InitProcessor;
-import org.apache.tuscany.core.implementation.processor.PropertyProcessor;
-import org.apache.tuscany.core.implementation.processor.ReferenceProcessor;
-import org.apache.tuscany.core.implementation.processor.ResourceProcessor;
-import org.apache.tuscany.core.implementation.processor.ScopeProcessor;
-import org.apache.tuscany.core.monitor.NullMonitorFactory;
-import org.apache.tuscany.spi.deployer.ContributionProcessor;
-import org.apache.tuscany.spi.implementation.java.ImplementationProcessorService;
 
 public class CompositeContributionProcessorTestCase extends TestCase {
     private static final String CONTRIBUTION = "/repository/sample-calculator.jar";

Copied: incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/test/java/org/apache/tuscany/services/contribution/processor/FolderContributionProcessorTestCase.java (from r519481, incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/test/java/org/apache/tuscany/core/services/deployment/contribution/FolderContributionProcessorTestCase.java)
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/test/java/org/apache/tuscany/services/contribution/processor/FolderContributionProcessorTestCase.java?view=diff&rev=522627&p1=incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/test/java/org/apache/tuscany/core/services/deployment/contribution/FolderContributionProcessorTestCase.java&r1=519481&p2=incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/test/java/org/apache/tuscany/services/contribution/processor/FolderContributionProcessorTestCase.java&r2=522627
==============================================================================
--- incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/test/java/org/apache/tuscany/core/services/deployment/contribution/FolderContributionProcessorTestCase.java (original)
+++ incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/test/java/org/apache/tuscany/services/contribution/processor/FolderContributionProcessorTestCase.java Mon Mar 26 14:06:34 2007
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.    
  */
-package org.apache.tuscany.core.services.deployment.contribution;
+package org.apache.tuscany.services.contribution.processor;
 
 import java.io.File;
 import java.net.URI;

Copied: incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/test/java/org/apache/tuscany/services/contribution/processor/JarContributionProcessorTestCase.java (from r519481, incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/test/java/org/apache/tuscany/core/services/deployment/contribution/JarContributionProcessorTestCase.java)
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/test/java/org/apache/tuscany/services/contribution/processor/JarContributionProcessorTestCase.java?view=diff&rev=522627&p1=incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/test/java/org/apache/tuscany/core/services/deployment/contribution/JarContributionProcessorTestCase.java&r1=519481&p2=incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/test/java/org/apache/tuscany/services/contribution/processor/JarContributionProcessorTestCase.java&r2=522627
==============================================================================
--- incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/test/java/org/apache/tuscany/core/services/deployment/contribution/JarContributionProcessorTestCase.java (original)
+++ incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/test/java/org/apache/tuscany/services/contribution/processor/JarContributionProcessorTestCase.java Mon Mar 26 14:06:34 2007
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.    
  */
-package org.apache.tuscany.core.services.deployment.contribution;
+package org.apache.tuscany.services.contribution.processor;
 
 import java.net.URI;
 import java.net.URL;

Copied: incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/test/java/org/apache/tuscany/services/contribution/processor/JavaContributionProcessorTestCase.java (from r519481, incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/test/java/org/apache/tuscany/core/services/deployment/contribution/JavaContributionProcessorTestCase.java)
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/test/java/org/apache/tuscany/services/contribution/processor/JavaContributionProcessorTestCase.java?view=diff&rev=522627&p1=incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/test/java/org/apache/tuscany/core/services/deployment/contribution/JavaContributionProcessorTestCase.java&r1=519481&p2=incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/test/java/org/apache/tuscany/services/contribution/processor/JavaContributionProcessorTestCase.java&r2=522627
==============================================================================
--- incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/test/java/org/apache/tuscany/core/services/deployment/contribution/JavaContributionProcessorTestCase.java (original)
+++ incubator/tuscany/java/sca/runtime/services/contribution/contribution/src/test/java/org/apache/tuscany/services/contribution/processor/JavaContributionProcessorTestCase.java Mon Mar 26 14:06:34 2007
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.    
  */
-package org.apache.tuscany.core.services.deployment.contribution;
+package org.apache.tuscany.services.contribution.processor;
 
 import java.net.URI;
 import java.net.URL;



---------------------------------------------------------------------
To unsubscribe, e-mail: tuscany-commits-unsubscribe@ws.apache.org
For additional commands, e-mail: tuscany-commits-help@ws.apache.org