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/07/14 01:29:41 UTC

svn commit: r556182 - in /incubator/tuscany/java/sca/modules/contribution-impl/src/main/java/org/apache/tuscany/sca/contribution/service: impl/ContributionServiceImpl.java util/ConcurrentHashList.java

Author: lresende
Date: Fri Jul 13 16:29:40 2007
New Revision: 556182

URL: http://svn.apache.org/viewvc?view=rev&rev=556182
Log:
Tuscany-1161 - First cut of contribution import/export

Added:
    incubator/tuscany/java/sca/modules/contribution-impl/src/main/java/org/apache/tuscany/sca/contribution/service/util/ConcurrentHashList.java
Modified:
    incubator/tuscany/java/sca/modules/contribution-impl/src/main/java/org/apache/tuscany/sca/contribution/service/impl/ContributionServiceImpl.java

Modified: incubator/tuscany/java/sca/modules/contribution-impl/src/main/java/org/apache/tuscany/sca/contribution/service/impl/ContributionServiceImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/contribution-impl/src/main/java/org/apache/tuscany/sca/contribution/service/impl/ContributionServiceImpl.java?view=diff&rev=556182&r1=556181&r2=556182
==============================================================================
--- incubator/tuscany/java/sca/modules/contribution-impl/src/main/java/org/apache/tuscany/sca/contribution/service/impl/ContributionServiceImpl.java (original)
+++ incubator/tuscany/java/sca/modules/contribution-impl/src/main/java/org/apache/tuscany/sca/contribution/service/impl/ContributionServiceImpl.java Fri Jul 13 16:29:40 2007
@@ -36,7 +36,9 @@
 import org.apache.tuscany.sca.assembly.AssemblyFactory;
 import org.apache.tuscany.sca.assembly.Composite;
 import org.apache.tuscany.sca.contribution.Contribution;
+import org.apache.tuscany.sca.contribution.ContributionExport;
 import org.apache.tuscany.sca.contribution.ContributionFactory;
+import org.apache.tuscany.sca.contribution.ContributionImport;
 import org.apache.tuscany.sca.contribution.DeployedArtifact;
 import org.apache.tuscany.sca.contribution.processor.ContributionPostProcessor;
 import org.apache.tuscany.sca.contribution.processor.PackageProcessor;
@@ -46,6 +48,7 @@
 import org.apache.tuscany.sca.contribution.service.ContributionMetadataLoaderException;
 import org.apache.tuscany.sca.contribution.service.ContributionRepository;
 import org.apache.tuscany.sca.contribution.service.ContributionService;
+import org.apache.tuscany.sca.contribution.service.util.ConcurrentHashList;
 import org.apache.tuscany.sca.contribution.service.util.IOHelper;
 
 /**
@@ -80,7 +83,17 @@
      * xml factory used to create reader instance to load contribution metadata
      */
     private XMLInputFactory xmlFactory;
-    
+
+    /**
+     * Assembly factory
+     */
+    private AssemblyFactory assemblyFactory;
+
+    /**
+     * Contribution model facotry
+     */
+    private ContributionFactory contributionFactory;
+
     /**
      * contribution metadata loader
      */
@@ -90,12 +103,7 @@
      * Contribution registry This is a registry of processed Contributions indexed by URI
      */
     private Map<String, Contribution> contributionRegistry = new ConcurrentHashMap<String, Contribution>();
-
-    /**
-     * Contribution model facotry
-     */
-    private ContributionFactory contributionFactory;
-    
+    private ConcurrentHashList<String, Contribution> contributionByExportedNamespace = new ConcurrentHashList<String, Contribution>();
     
     public ContributionServiceImpl(ContributionRepository repository,
                                    PackageProcessor packageProcessor,
@@ -110,7 +118,7 @@
         this.artifactProcessor = artifactProcessor;
         this.postProcessor = postProcessor;
         this.xmlFactory = xmlFactory;
-
+        this.assemblyFactory = assemblyFactory;
         this.contributionFactory = contributionFactory;
         this.contributionLoader = new ContributionMetadataLoaderImpl(assemblyFactory, contributionFactory);
     }
@@ -236,6 +244,7 @@
         Contribution contribution = initializeContributionMetadata(locationURL, modelResolver);
         contribution.setURI(contributionURI.toString());
         contribution.setLocation(locationURL.toString());
+        contribution.setModelResolver(modelResolver);
 
         List<URI> contributionArtifacts = null;
 
@@ -281,6 +290,11 @@
         // store the contribution on the registry
         this.contributionRegistry.put(contribution.getURI(), contribution);
         
+        //store the contribution based on the namespaces being exported
+        for (ContributionExport export : contribution.getExports()) {
+            this.contributionByExportedNamespace.put(export.getNamespace(), contribution);
+        }
+        
         return contribution;
     }
 
@@ -328,12 +342,14 @@
      * @throws ContributionException
      */
     @SuppressWarnings("unchecked")
-    private void processResolvePhase(Contribution contribution) throws ContributionException {
+    private void processResolvePhase(Contribution contribution) throws ContributionException {       
         // for each artifact that was processed on the contribution
         for (DeployedArtifact artifact : contribution.getArtifacts()) {
             // resolve the model object
             if (artifact.getModel() != null) {
                 this.artifactProcessor.resolve(artifact.getModel(), contribution.getModelResolver());
+
+                processResolveImportsPhase(contribution, artifact);                
             }
         }
         
@@ -341,10 +357,64 @@
         List<Composite> resolvedDeployables = new ArrayList<Composite>();
         for (Composite deployableComposite : contribution.getDeployables()) {
             Composite resolvedDeployable = contribution.getModelResolver().resolveModel(Composite.class, deployableComposite);
+            
+            if (resolvedDeployable.isUnresolved()) {
+                resolvedDeployable = processResolveImportsPhase(contribution, resolvedDeployable);
+            }
+            
             resolvedDeployables.add(resolvedDeployable);
         }
-        
         contribution.getDeployables().clear();
         contribution.getDeployables().addAll(resolvedDeployables);
     }
+
+    @SuppressWarnings("unchecked")
+    private Object processResolveImportsPhase(Contribution contribution, DeployedArtifact artifact) throws ContributionException {
+        for(ContributionImport importedArtifact : contribution.getImports()) {
+            String importedContributionURI = importedArtifact.getLocation();
+            if (importedContributionURI != null && importedContributionURI.length() > 0) {
+                //location provided (contribution uri)
+                Contribution importedContribution = this.getContribution(importedContributionURI);
+                if (importedContribution != null) {
+                    this.artifactProcessor.resolve(artifact.getModel(), importedContribution.getModelResolver());
+                }
+            } else {
+                //look into all the contributions that match exported uri
+                for(Contribution importedContribution : this.contributionByExportedNamespace.get(importedArtifact.getNamespace())) {
+                    this.artifactProcessor.resolve(artifact.getModel(), importedContribution.getModelResolver());
+                }
+            }
+            
+
+        }
+        
+        return artifact.getModel();
+    }
+    
+    @SuppressWarnings("unchecked")
+    private Composite processResolveImportsPhase(Contribution contribution, Composite deployableComposite) throws ContributionException {
+        Composite resolvedDeployable = deployableComposite;
+        
+        for(ContributionImport importedArtifact : contribution.getImports()) {
+            String importedContributionURI = importedArtifact.getLocation();
+            if (importedContributionURI != null && importedContributionURI.length() > 0) {
+                //location provided (contribution uri)
+                Contribution importedContribution = this.getContribution(importedContributionURI);
+                if (importedContribution != null) {
+                    resolvedDeployable = importedContribution.getModelResolver().resolveModel(Composite.class, deployableComposite);
+                }
+            } else {
+                //look into all the contributions that match exported uri
+                for(Contribution importedContribution : this.contributionByExportedNamespace.get(importedArtifact.getNamespace())) {
+                    Composite resolvingDeployable = importedContribution.getModelResolver().resolveModel(Composite.class, deployableComposite);
+                    if (resolvingDeployable != null && resolvingDeployable.isUnresolved() == false) {
+                        resolvedDeployable = resolvingDeployable;
+                        break;
+                    }
+                }
+            }
+        }
+        
+        return resolvedDeployable;
+    }    
 }

Added: incubator/tuscany/java/sca/modules/contribution-impl/src/main/java/org/apache/tuscany/sca/contribution/service/util/ConcurrentHashList.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/contribution-impl/src/main/java/org/apache/tuscany/sca/contribution/service/util/ConcurrentHashList.java?view=auto&rev=556182
==============================================================================
--- incubator/tuscany/java/sca/modules/contribution-impl/src/main/java/org/apache/tuscany/sca/contribution/service/util/ConcurrentHashList.java (added)
+++ incubator/tuscany/java/sca/modules/contribution-impl/src/main/java/org/apache/tuscany/sca/contribution/service/util/ConcurrentHashList.java Fri Jul 13 16:29:40 2007
@@ -0,0 +1,76 @@
+/*
+ * 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.    
+ */
+
+package org.apache.tuscany.sca.contribution.service.util;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+public class ConcurrentHashList <K,T> {
+    private Map<K, List<T>> hashList;
+
+    public ConcurrentHashList() {
+        hashList = new  ConcurrentHashMap<K, List<T>>();
+    }
+
+    public ConcurrentHashList(int initialCapacity) {
+        hashList = new  ConcurrentHashMap<K, List<T>>(initialCapacity);
+    }
+    
+    public void clear() {
+        hashList.clear();
+    }
+
+    public List<T> get(K key) {
+        List<T> resultList = hashList.get(key);
+        if( resultList == null) {
+            resultList = new ArrayList<T>();
+            hashList.put(key, resultList);
+        }
+        return resultList;
+    }
+
+    public boolean isEmpty() {
+        return hashList.isEmpty();
+    }
+
+    public T put(K key, T value) {
+        this.get(key).add(value);
+        return value;
+    }
+
+    public int size() {
+        return hashList.size();
+    }
+
+
+    public static void main(String args[]) {
+        ConcurrentHashList<String, String> list = new ConcurrentHashList<String, String>();
+        list.put("a", "a1");
+        list.put("a", "a2");
+        list.put("a", "a3");
+        
+        for(String s : list.get("a")) {
+            System.out.println("Key a - " + s);
+        }
+    }
+    
+}



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