You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by ad...@apache.org on 2009/08/10 03:40:04 UTC

svn commit: r802637 [1/2] - in /tuscany/branches/sca-java-1.x/modules: domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/ domain-manager/src/main/resources/ domain-manager/src/main/resources/icons/ domain-search/src/main/java/org/...

Author: adrianocrestani
Date: Mon Aug 10 01:40:02 2009
New Revision: 802637

URL: http://svn.apache.org/viewvc?rev=802637&view=rev
Log:
applying tuscany_2552_domain_search_phillipe_ramalho_08_08_2009.patch and tuscany_2552_domain_manager_phillipe_ramalho_08_08_2009.patch submitted to TUSCANY-2552

Added:
    tuscany/branches/sca-java-1.x/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/ContributionsReader.java
      - copied, changed from r791205, tuscany/branches/sca-java-1.x/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/WorkspaceReader.java
    tuscany/branches/sca-java-1.x/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/Searcher.java
    tuscany/branches/sca-java-1.x/modules/domain-manager/src/main/resources/icons/artifact.png   (with props)
    tuscany/branches/sca-java-1.x/modules/domain-manager/src/main/resources/icons/component.png   (with props)
    tuscany/branches/sca-java-1.x/modules/domain-manager/src/main/resources/icons/composite.png   (with props)
    tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/impl/DefaultFileContent.java
    tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/impl/PriorityFieldListResultFactory.java
      - copied, changed from r791205, tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/impl/ResultFactoryList.java
    tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/impl/WrappedFileContent.java
Removed:
    tuscany/branches/sca-java-1.x/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/WorkspaceReader.java
    tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/impl/ArtifactResult.java
    tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/impl/ArtifactResultProcessor.java
    tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/impl/BindingResult.java
    tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/impl/BindingResultFactory.java
    tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/impl/ComponentResult.java
    tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/impl/ComponentResultFactory.java
    tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/impl/ComponentTypeResult.java
    tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/impl/ComponentTypeResultFactory.java
    tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/impl/CompositeResult.java
    tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/impl/CompositeResultFactory.java
    tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/impl/ContributionResult.java
    tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/impl/ContributionResultFactory.java
    tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/impl/DirectoryDocumentProcessor.java
    tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/impl/FileContentResult.java
    tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/impl/PropertyResult.java
    tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/impl/ReferenceResult.java
    tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/impl/ResultFactoryList.java
    tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/impl/ServiceResult.java
Modified:
    tuscany/branches/sca-java-1.x/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/ContributionCollectionImpl.java
    tuscany/branches/sca-java-1.x/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/DeployableCompositeCollectionImpl.java
    tuscany/branches/sca-java-1.x/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/FileServiceImpl.java
    tuscany/branches/sca-java-1.x/modules/domain-manager/src/main/resources/DomainManager.composite
    tuscany/branches/sca-java-1.x/modules/domain-manager/src/main/resources/search-gadget.html
    tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/DomainSearch.java
    tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/Result.java
    tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/ResultFactory.java
    tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/ResultProcessor.java
    tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/impl/ArtifactDocumentProcessor.java
    tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/impl/ComponentDocumentProcessor.java
    tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/impl/ComponentTypeDocumentProcessor.java
    tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/impl/CompositeDocumentProcessor.java
    tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/impl/ContributionDocumentProcessor.java
    tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/impl/DefaultFileDocumentProcessor.java
    tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/impl/Document.java
    tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/impl/DomainPathAnalyzer.java
    tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/impl/DomainSearchDocumentProcessorsMap.java
    tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/impl/DomainSearchFormatter.java
    tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/impl/DomainSearchImpl.java
    tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/impl/DomainSearchResultFactory.java
    tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/impl/DomainSearchResultProcessor.java
    tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/impl/FileContentResultProcessor.java
    tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/impl/FileDocumentProcessor.java
    tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/impl/HighlightingUtil.java
    tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/impl/ParentField.java
    tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/impl/ResultImpl.java
    tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/impl/ResultProcessorList.java
    tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/impl/SearchFields.java
    tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/impl/SystemFileContent.java
    tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/impl/ZipDocumentProcessor.java
    tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/impl/ZipFileContent.java
    tuscany/branches/sca-java-1.x/modules/domain-search/src/test/java/org/apache/tuscany/sca/domain/search/impl/DomainPathAnalyzerTestCase.java

Modified: tuscany/branches/sca-java-1.x/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/ContributionCollectionImpl.java
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-java-1.x/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/ContributionCollectionImpl.java?rev=802637&r1=802636&r2=802637&view=diff
==============================================================================
--- tuscany/branches/sca-java-1.x/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/ContributionCollectionImpl.java (original)
+++ tuscany/branches/sca-java-1.x/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/ContributionCollectionImpl.java Mon Aug 10 01:40:02 2009
@@ -74,6 +74,7 @@
 import org.apache.tuscany.sca.data.collection.LocalItemCollection;
 import org.apache.tuscany.sca.data.collection.NotFoundException;
 import org.apache.tuscany.sca.domain.manager.impl.ContributionCollectionImpl.Cache.ContributionCache;
+import org.apache.tuscany.sca.domain.search.DomainSearch;
 import org.apache.tuscany.sca.monitor.Monitor;
 import org.apache.tuscany.sca.monitor.MonitorFactory;
 import org.apache.tuscany.sca.monitor.Problem;
@@ -97,8 +98,8 @@
  * @version $Rev$ $Date$
  */
 @Scope("COMPOSITE")
-@Service(interfaces={ItemCollection.class, LocalItemCollection.class, WorkspaceReader.class})
-public class ContributionCollectionImpl implements ItemCollection, LocalItemCollection, WorkspaceReader {
+@Service(interfaces={ItemCollection.class, LocalItemCollection.class})
+public class ContributionCollectionImpl implements ItemCollection, LocalItemCollection {
 
     private static final Logger logger = Logger.getLogger(ContributionCollectionImpl.class.getName());
 
@@ -111,6 +112,9 @@
     @Reference
     public DomainManagerConfiguration domainManagerConfiguration;
     
+    @Reference
+    public DomainSearch domainSearch;
+    
     private Monitor monitor;
     private ContributionFactory contributionFactory;
     private WorkspaceFactory workspaceFactory;
@@ -256,6 +260,7 @@
                 // Write the workspace
                 writeWorkspace(workspace);
                 return;
+                
             }
         }
         throw new NotFoundException(key);
@@ -479,7 +484,6 @@
     private static String title(String contributionURI) {
         return contributionURI;
     }
-
     
     /**
      * Read the workspace.
@@ -652,9 +656,5 @@
         }
         return contributions;
     }
-
-	public Workspace getWorkspace() {
-		return readContributions(readWorkspace());
-	}
     
 }

Copied: tuscany/branches/sca-java-1.x/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/ContributionsReader.java (from r791205, tuscany/branches/sca-java-1.x/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/WorkspaceReader.java)
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-java-1.x/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/ContributionsReader.java?p2=tuscany/branches/sca-java-1.x/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/ContributionsReader.java&p1=tuscany/branches/sca-java-1.x/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/WorkspaceReader.java&r1=791205&r2=802637&rev=802637&view=diff
==============================================================================
--- tuscany/branches/sca-java-1.x/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/WorkspaceReader.java (original)
+++ tuscany/branches/sca-java-1.x/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/ContributionsReader.java Mon Aug 10 01:40:02 2009
@@ -1,9 +1,9 @@
 package org.apache.tuscany.sca.domain.manager.impl;
 
-import org.apache.tuscany.sca.workspace.Workspace;
+import org.apache.tuscany.sca.contribution.Contribution;
 
-public interface WorkspaceReader {
+public interface ContributionsReader {
 	
-	Workspace getWorkspace();
+	Contribution[] readContributions();
 
 }

Modified: tuscany/branches/sca-java-1.x/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/DeployableCompositeCollectionImpl.java
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-java-1.x/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/DeployableCompositeCollectionImpl.java?rev=802637&r1=802636&r2=802637&view=diff
==============================================================================
--- tuscany/branches/sca-java-1.x/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/DeployableCompositeCollectionImpl.java (original)
+++ tuscany/branches/sca-java-1.x/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/DeployableCompositeCollectionImpl.java Mon Aug 10 01:40:02 2009
@@ -33,6 +33,7 @@
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.logging.Logger;
@@ -54,10 +55,8 @@
 import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessorExtensionPoint;
 import org.apache.tuscany.sca.contribution.processor.URLArtifactProcessor;
 import org.apache.tuscany.sca.contribution.processor.URLArtifactProcessorExtensionPoint;
-import org.apache.tuscany.sca.contribution.resolver.DefaultModelResolver;
 import org.apache.tuscany.sca.contribution.resolver.ModelResolverExtensionPoint;
 import org.apache.tuscany.sca.contribution.service.ContributionReadException;
-import org.apache.tuscany.sca.contribution.service.ContributionResolveException;
 import org.apache.tuscany.sca.core.ExtensionPointRegistry;
 import org.apache.tuscany.sca.core.UtilityExtensionPoint;
 import org.apache.tuscany.sca.data.collection.Entry;
@@ -78,331 +77,405 @@
 import org.osoa.sca.annotations.Service;
 
 /**
- * Implementation of a deployable composite collection service. 
- *
+ * Implementation of a deployable composite collection service.
+ * 
  * @version $Rev$ $Date$
  */
 @Scope("COMPOSITE")
-@Service(interfaces={ItemCollection.class, LocalItemCollection.class})
-public class DeployableCompositeCollectionImpl implements ItemCollection, LocalItemCollection {
-
-    private static final Logger logger = Logger.getLogger(DeployableCompositeCollectionImpl.class.getName());
-
-    @Reference
-    public LocalItemCollection contributionCollection;
-    
-    @Reference
-    public DomainManagerConfiguration domainManagerConfiguration;
-    
-    private ModelFactoryExtensionPoint modelFactories;
-    private ModelResolverExtensionPoint modelResolvers;
-    private URLArtifactProcessor<Contribution> contributionProcessor;
-    private XMLOutputFactory outputFactory;
-    private ContributionDependencyBuilder contributionDependencyBuilder;
-    private Monitor monitor;
-    
-    /**
-     * Cache contribution models. 
-     */
-    static class Cache {
-        static class ContributionCache {
-            private Contribution contribution;
-            private long contributionLastModified;
-        }
-        private Map<URL, ContributionCache> contributions = new HashMap<URL, ContributionCache>();
-    }
-    
-    private Cache cache = new Cache();
-    
-    /**
-     * Initialize the component.
-     */
-    @Init
-    public void initialize() throws ParserConfigurationException {
-        
-        ExtensionPointRegistry extensionPoints = domainManagerConfiguration.getExtensionPoints();
-        
-        // Create a monitor
-        UtilityExtensionPoint utilities = extensionPoints.getExtensionPoint(UtilityExtensionPoint.class);
-        MonitorFactory monitorFactory = utilities.getUtility(MonitorFactory.class);
-        monitor = monitorFactory.createMonitor();        
-        
-        // Get model factories
-        modelFactories = extensionPoints.getExtensionPoint(ModelFactoryExtensionPoint.class);
-        XMLInputFactory inputFactory = modelFactories.getFactory(XMLInputFactory.class);
-        outputFactory = modelFactories.getFactory(XMLOutputFactory.class);
-        outputFactory.setProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES, true);
-        
-        // Get and initialize artifact processors
-        StAXArtifactProcessorExtensionPoint staxProcessors = extensionPoints.getExtensionPoint(StAXArtifactProcessorExtensionPoint.class);
-        StAXArtifactProcessor<Object> staxProcessor = new ExtensibleStAXArtifactProcessor(staxProcessors, inputFactory, outputFactory, monitor);
-
-        URLArtifactProcessorExtensionPoint urlProcessors = extensionPoints.getExtensionPoint(URLArtifactProcessorExtensionPoint.class);
-        URLArtifactProcessor<Object> urlProcessor = new ExtensibleURLArtifactProcessor(urlProcessors, monitor);
-        
-        // Create contribution processor
-        modelResolvers = extensionPoints.getExtensionPoint(ModelResolverExtensionPoint.class);
-        contributionProcessor = new ContributionContentProcessor(extensionPoints, monitor);
-        
-        // Create contribution and composite builders
-        contributionDependencyBuilder = new ContributionDependencyBuilderImpl(monitor);
-    }
-    
-    public Entry<String, Item>[] getAll() {
-        logger.fine("getAll");
-        
-        // Return all the deployable composites in the contributions
-        List<Entry<String, Item>> entries = new ArrayList<Entry<String, Item>>();
-        
-        // Get the list of contributions in the workspace
-        Entry<String, Item>[] contributionEntries = contributionCollection.getAll();
-
-        // Read contribution metadata
-        for (Entry<String, Item> contributionEntry: contributionEntries) {
-            Item contributionItem = contributionEntry.getData();
-            Contribution contribution;
-            try {
-                contribution = contribution(contributionEntry.getKey(), contributionItem.getAlternate());
-            } catch (ContributionReadException e) {
-                continue;
-            }
-
-            // Create entries for the deployable composites
-            for (Composite deployable: contribution.getDeployables()) {
-                entries.add(entry(contribution, deployable));
-            }
-            
-        }
-        return entries.toArray(new Entry[entries.size()]);
-    }
-
-    public Item get(String key) throws NotFoundException {
-        logger.fine("get " + key);
-
-        // Get the specified contribution info 
-        String contributionURI = contributionURI(key);
-        Item contributionItem = contributionCollection.get(contributionURI);
-        
-        // Read the contribution
-        Contribution contribution;
-        try {
-            contribution = contribution(contributionURI, contributionItem.getAlternate());
-        } catch (ContributionReadException e) {
-            throw new NotFoundException(key);
-        }
-
-        // Find the specified deployable composite
-        QName qname = compositeQName(key);
-        for (Composite deployable: contribution.getDeployables()) {
-            if (qname.equals(deployable.getName())) {
-            	// find the deployable composite
-            	deployable = contribution.getModelResolver().resolveModel(Composite.class, deployable);
-            	
-                if (deployable.isUnresolved()) {
-                    throw new NotFoundException(key);
-                }
-                
-                // Return an item describing the deployable composite
-                return item(contribution, deployable);
-            }
-        }
-
-        throw new NotFoundException(key);
-    }
-    
-    public String post(String key, Item item) {
-        throw new UnsupportedOperationException();
-    }
-
-    public void put(String key, Item item) throws NotFoundException {
-        throw new UnsupportedOperationException();
-    }
-
-    public void delete(String key) throws NotFoundException {
-        throw new UnsupportedOperationException();
-    }
-    
-    public Entry<String, Item>[] query(String queryString) {
-        logger.fine("query " + queryString);
-        
-        if (queryString.startsWith("contribution=")) {
-
-            // Return all the deployable composites in the specified
-            // contribution
-            List<Entry<String, Item>> entries = new ArrayList<Entry<String, Item>>();
-
-            // Get the specified contribution info 
-            String contributionURI = queryString.substring(queryString.indexOf('=') + 1);
-            Item contributionItem;
-            try {
-                contributionItem = contributionCollection.get(contributionURI);
-            } catch (NotFoundException e) {
-                return entries.toArray(new Entry[entries.size()]);
-            }
-            
-            // Read the contribution
-            Contribution contribution;
-            try {
-                contribution = contribution(contributionURI, contributionItem.getAlternate());
-            } catch (ContributionReadException e) {
-                return entries.toArray(new Entry[entries.size()]);
-            }
-
-            // Create entries for the deployable composites
-            for (Composite deployable: contribution.getDeployables()) {
-                entries.add(entry(contribution, deployable));
-            }
-
-            return entries.toArray(new Entry[entries.size()]);
-            
-        } else {
-            throw new UnsupportedOperationException();
-        }
-    }
-    
-    /**
-     * Returns the contribution with the given URI.
-     * 
-     * @param contributionURI
-     * @param contributionLocation
-     * @return
-     * @throws NotFoundException
-     */
-    private Contribution contribution(String contributionURI, String contributionLocation) throws ContributionReadException {
-        try {
-            URI uri = URI.create(contributionURI);
-            URL location = locationURL(contributionLocation);
-            
-            // Get contribution from cache
-            ContributionCache contributionCache = cache.contributions.get(location);
-            long lastModified = lastModified(location);
-            if (contributionCache != null) {
-                if (contributionCache.contributionLastModified == lastModified) {
-                    return contributionCache.contribution;
-                }
-                
-                // Reset contribution cache
-                cache.contributions.remove(location);
-            }
-            
-            Contribution contribution = (Contribution)contributionProcessor.read(null, uri, location);
-            
-            // TODO - analyse dependencies here?
-            
-            //contributionProcessor.resolve(contribution, new DefaultModelResolver());
-            
-            // Cache contribution
-            contributionCache = new ContributionCache();
-            contributionCache.contribution = contribution;
-            contributionCache.contributionLastModified = lastModified;
-            cache.contributions.put(location, contributionCache);
-            
-            return contribution;
-
-        } catch (ContributionReadException e) {
-            throw e;
-        } catch (MalformedURLException e) {
-            throw new ContributionReadException(e);
-       // } catch (ContributionResolveException e) {
-       //     throw new ContributionReadException(e);
-        } catch (Throwable e) {
-            throw new ContributionReadException(e);
-        }
-    }
-    
-    /**
-     * Returns the entry contents describing a composite.
-     * 
-     * @param composite
-     * @return
-     */
-    private static String content(Composite composite) {
-        StringBuffer sb = new StringBuffer();
-        List<Component> components = composite.getComponents();
-        for (int i = 0, n = components.size(); i < n; i++) {
-            Component component = components.get(i);
-            if (component.getImplementation() instanceof NodeImplementation) {
-                List<ComponentService> services = component.getServices();
-                if (!services.isEmpty()) {
-                    List<Binding> bindings = services.get(0).getBindings();
-                    if (!bindings.isEmpty()) {
-                        
-                        // List node URIs
-                        sb.append("Node URI: <span id=\"nodeURI\">");
-                        sb.append(component.getServices().get(0).getBindings().get(0).getURI());
-                        break;
-                    }
-                }
-            } else {
-                
-                // List component names
-                if (sb.length() == 0) {
-                    sb.append("Components: <span id=\"components\">");
-                } else {
-                    sb.append(" ");
-                }
-                sb.append(component.getName());
-            }
-        }
-        if (sb.length() != 0) {
-            sb.append("</span>");
-        }
-        return sb.toString();
-    }
-    
-    /**
-     * Returns the link to the resource related to a composite.
-     * 
-     * @param composite
-     * @return
-     */
-    private static String relatedLink(Composite composite) {
-        for (Component component: composite.getComponents()) {
-            if (component.getImplementation() instanceof NodeImplementation) {
-                NodeImplementation nodeImplementation = (NodeImplementation)component.getImplementation();
-                Composite deployable = nodeImplementation.getComposite();
-                String contributionURI = deployable.getURI();
-                QName qname = deployable.getName();
-                String key = compositeKey(contributionURI, qname);
-                return "/composite-source/" + key;
-            }
-        }
-        return null;
-    }
-    
-    /**
-     * Returns an entry describing the given deployable.
-     * 
-     * @param contribution
-     * @param deployable
-     * @return
-     */
-    private static Entry<String, Item> entry(Contribution contribution, Composite deployable) {
-        Entry<String, Item> entry = new Entry<String, Item>();
-        entry.setKey(DomainManagerUtil.compositeKey(contribution.getURI(), deployable.getName()));
-        entry.setData(item(contribution, deployable));
-        return entry;
-    }
-
-    /**
-     * Returns an item describing the given deployable.
-     * 
-     * @param contribution
-     * @param deployable
-     * @return
-     */
-    private static Item item(Contribution contribution, Composite deployable) {
-        String contributionURI = contribution.getURI();
-        String contributionLocation = contribution.getLocation();
-        QName qname = deployable.getName();
-        String deployableURI = deployable.getURI();
-        Item item = new Item();
-        item.setTitle(compositeTitle(contributionURI, qname));
-        item.setContents(content(deployable));
-        item.setLink(compositeSourceLink(contributionURI, qname));
-        item.setAlternate(compositeAlternateLink(contributionLocation, deployableURI));
-        item.setRelated(relatedLink(deployable));
-        return item;
-    }
+@Service(interfaces = { ItemCollection.class, LocalItemCollection.class, ContributionsReader.class })
+public class DeployableCompositeCollectionImpl implements ItemCollection,
+		LocalItemCollection, ContributionsReader {
+
+	private static final Logger logger = Logger
+			.getLogger(DeployableCompositeCollectionImpl.class.getName());
+
+	@Reference
+	public LocalItemCollection contributionCollection;
+
+	@Reference
+	public DomainManagerConfiguration domainManagerConfiguration;
+
+	private ModelFactoryExtensionPoint modelFactories;
+	private ModelResolverExtensionPoint modelResolvers;
+	private URLArtifactProcessor<Contribution> contributionProcessor;
+	private XMLOutputFactory outputFactory;
+	private ContributionDependencyBuilder contributionDependencyBuilder;
+	private Monitor monitor;
+
+	/**
+	 * Cache contribution models.
+	 */
+	static class Cache {
+		static class ContributionCache {
+			private Contribution contribution;
+			private long contributionLastModified;
+		}
+
+		private Map<URL, ContributionCache> contributions = new HashMap<URL, ContributionCache>();
+	}
+
+	private Cache cache = new Cache();
+
+	/**
+	 * Initialize the component.
+	 */
+	@Init
+	public void initialize() throws ParserConfigurationException {
+
+		ExtensionPointRegistry extensionPoints = domainManagerConfiguration
+				.getExtensionPoints();
+
+		// Create a monitor
+		UtilityExtensionPoint utilities = extensionPoints
+				.getExtensionPoint(UtilityExtensionPoint.class);
+		MonitorFactory monitorFactory = utilities
+				.getUtility(MonitorFactory.class);
+		monitor = monitorFactory.createMonitor();
+
+		// Get model factories
+		modelFactories = extensionPoints
+				.getExtensionPoint(ModelFactoryExtensionPoint.class);
+		XMLInputFactory inputFactory = modelFactories
+				.getFactory(XMLInputFactory.class);
+		outputFactory = modelFactories.getFactory(XMLOutputFactory.class);
+		outputFactory.setProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES,
+				true);
+
+		// Get and initialize artifact processors
+		StAXArtifactProcessorExtensionPoint staxProcessors = extensionPoints
+				.getExtensionPoint(StAXArtifactProcessorExtensionPoint.class);
+		StAXArtifactProcessor<Object> staxProcessor = new ExtensibleStAXArtifactProcessor(
+				staxProcessors, inputFactory, outputFactory, monitor);
+
+		URLArtifactProcessorExtensionPoint urlProcessors = extensionPoints
+				.getExtensionPoint(URLArtifactProcessorExtensionPoint.class);
+		URLArtifactProcessor<Object> urlProcessor = new ExtensibleURLArtifactProcessor(
+				urlProcessors, monitor);
+
+		// Create contribution processor
+		modelResolvers = extensionPoints
+				.getExtensionPoint(ModelResolverExtensionPoint.class);
+		contributionProcessor = new ContributionContentProcessor(
+				extensionPoints, monitor);
+
+		// Create contribution and composite builders
+		contributionDependencyBuilder = new ContributionDependencyBuilderImpl(
+				monitor);
+	}
+
+	public Entry<String, Item>[] getAll() {
+		logger.fine("getAll");
+
+		// Return all the deployable composites in the contributions
+		List<Entry<String, Item>> entries = new ArrayList<Entry<String, Item>>();
+
+		// Get the list of contributions in the workspace
+		Entry<String, Item>[] contributionEntries = contributionCollection
+				.getAll();
+
+		// Read contribution metadata
+		for (Entry<String, Item> contributionEntry : contributionEntries) {
+			Item contributionItem = contributionEntry.getData();
+			Contribution contribution;
+			try {
+				contribution = contribution(contributionEntry.getKey(),
+						contributionItem.getAlternate());
+			} catch (ContributionReadException e) {
+				continue;
+			}
+
+			// Create entries for the deployable composites
+			for (Composite deployable : contribution.getDeployables()) {
+				entries.add(entry(contribution, deployable));
+			}
+
+		}
+		return entries.toArray(new Entry[entries.size()]);
+	}
+
+	public Contribution[] readContributions() {
+
+		// Get the list of contributions in the workspace
+		Entry<String, Item>[] contributionEntries = contributionCollection
+				.getAll();
+		
+		LinkedList<Contribution> contributions = new LinkedList<Contribution>();
+
+		// Read contribution metadata
+		for (Entry<String, Item> contributionEntry : contributionEntries) {
+			Item contributionItem = contributionEntry.getData();
+			Contribution contribution;
+			try {
+				contribution = contribution(contributionEntry.getKey(),
+						contributionItem.getAlternate());
+
+			} catch (ContributionReadException e) {
+				continue;
+			}
+
+			LinkedList<Composite> resolvedComposites = new LinkedList<Composite>();
+
+			for (Composite composite : contribution.getDeployables()) {
+
+				// find the deployable composite
+				composite = contribution.getModelResolver().resolveModel(
+						Composite.class, composite);
+				
+				resolvedComposites.add(composite);
+
+			}
+			
+			contribution.getDeployables().clear();
+			contribution.getDeployables().addAll(resolvedComposites);
+			
+			contributions.add(contribution);
+
+		}
+		
+		return contributions.toArray(new Contribution[0]);
+
+	}
+
+	public Item get(String key) throws NotFoundException {
+		logger.fine("get " + key);
+
+		// Get the specified contribution info
+		String contributionURI = contributionURI(key);
+		Item contributionItem = contributionCollection.get(contributionURI);
+
+		// Read the contribution
+		Contribution contribution;
+		try {
+			contribution = contribution(contributionURI, contributionItem
+					.getAlternate());
+		} catch (ContributionReadException e) {
+			throw new NotFoundException(key);
+		}
+
+		// Find the specified deployable composite
+		QName qname = compositeQName(key);
+		for (Composite deployable : contribution.getDeployables()) {
+			if (qname.equals(deployable.getName())) {
+				// find the deployable composite
+				deployable = contribution.getModelResolver().resolveModel(
+						Composite.class, deployable);
+
+				if (deployable.isUnresolved()) {
+					throw new NotFoundException(key);
+				}
+
+				// Return an item describing the deployable composite
+				return item(contribution, deployable);
+			}
+		}
+
+		throw new NotFoundException(key);
+	}
+
+	public String post(String key, Item item) {
+		throw new UnsupportedOperationException();
+	}
+
+	public void put(String key, Item item) throws NotFoundException {
+		throw new UnsupportedOperationException();
+	}
+
+	public void delete(String key) throws NotFoundException {
+		throw new UnsupportedOperationException();
+	}
+
+	public Entry<String, Item>[] query(String queryString) {
+		logger.fine("query " + queryString);
+
+		if (queryString.startsWith("contribution=")) {
+
+			// Return all the deployable composites in the specified
+			// contribution
+			List<Entry<String, Item>> entries = new ArrayList<Entry<String, Item>>();
+
+			// Get the specified contribution info
+			String contributionURI = queryString.substring(queryString
+					.indexOf('=') + 1);
+			Item contributionItem;
+			try {
+				contributionItem = contributionCollection.get(contributionURI);
+			} catch (NotFoundException e) {
+				return entries.toArray(new Entry[entries.size()]);
+			}
+
+			// Read the contribution
+			Contribution contribution;
+			try {
+				contribution = contribution(contributionURI, contributionItem
+						.getAlternate());
+			} catch (ContributionReadException e) {
+				return entries.toArray(new Entry[entries.size()]);
+			}
+
+			// Create entries for the deployable composites
+			for (Composite deployable : contribution.getDeployables()) {
+				entries.add(entry(contribution, deployable));
+			}
+
+			return entries.toArray(new Entry[entries.size()]);
+
+		} else {
+			throw new UnsupportedOperationException();
+		}
+	}
+
+	/**
+	 * Returns the contribution with the given URI.
+	 * 
+	 * @param contributionURI
+	 * @param contributionLocation
+	 * @return
+	 * @throws NotFoundException
+	 */
+	private Contribution contribution(String contributionURI,
+			String contributionLocation) throws ContributionReadException {
+		try {
+			URI uri = URI.create(contributionURI);
+			URL location = locationURL(contributionLocation);
+
+			// Get contribution from cache
+			ContributionCache contributionCache = cache.contributions
+					.get(location);
+			long lastModified = lastModified(location);
+			if (contributionCache != null) {
+				if (contributionCache.contributionLastModified == lastModified) {
+					return contributionCache.contribution;
+				}
+
+				// Reset contribution cache
+				cache.contributions.remove(location);
+			}
+
+			Contribution contribution = (Contribution) contributionProcessor
+					.read(null, uri, location);
+
+			// TODO - analyse dependencies here?
+
+			// contributionProcessor.resolve(contribution, new
+			// DefaultModelResolver());
+
+			// Cache contribution
+			contributionCache = new ContributionCache();
+			contributionCache.contribution = contribution;
+			contributionCache.contributionLastModified = lastModified;
+			cache.contributions.put(location, contributionCache);
+
+			return contribution;
+
+		} catch (ContributionReadException e) {
+			throw e;
+		} catch (MalformedURLException e) {
+			throw new ContributionReadException(e);
+			// } catch (ContributionResolveException e) {
+			// throw new ContributionReadException(e);
+		} catch (Throwable e) {
+			throw new ContributionReadException(e);
+		}
+	}
+
+	/**
+	 * Returns the entry contents describing a composite.
+	 * 
+	 * @param composite
+	 * @return
+	 */
+	private static String content(Composite composite) {
+		StringBuffer sb = new StringBuffer();
+		List<Component> components = composite.getComponents();
+		for (int i = 0, n = components.size(); i < n; i++) {
+			Component component = components.get(i);
+			if (component.getImplementation() instanceof NodeImplementation) {
+				List<ComponentService> services = component.getServices();
+				if (!services.isEmpty()) {
+					List<Binding> bindings = services.get(0).getBindings();
+					if (!bindings.isEmpty()) {
+
+						// List node URIs
+						sb.append("Node URI: <span id=\"nodeURI\">");
+						sb.append(component.getServices().get(0).getBindings()
+								.get(0).getURI());
+						break;
+					}
+				}
+			} else {
+
+				// List component names
+				if (sb.length() == 0) {
+					sb.append("Components: <span id=\"components\">");
+				} else {
+					sb.append(" ");
+				}
+				sb.append(component.getName());
+			}
+		}
+		if (sb.length() != 0) {
+			sb.append("</span>");
+		}
+		return sb.toString();
+	}
+
+	/**
+	 * Returns the link to the resource related to a composite.
+	 * 
+	 * @param composite
+	 * @return
+	 */
+	private static String relatedLink(Composite composite) {
+		for (Component component : composite.getComponents()) {
+			if (component.getImplementation() instanceof NodeImplementation) {
+				NodeImplementation nodeImplementation = (NodeImplementation) component
+						.getImplementation();
+				Composite deployable = nodeImplementation.getComposite();
+				String contributionURI = deployable.getURI();
+				QName qname = deployable.getName();
+				String key = compositeKey(contributionURI, qname);
+				return "/composite-source/" + key;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns an entry describing the given deployable.
+	 * 
+	 * @param contribution
+	 * @param deployable
+	 * @return
+	 */
+	private static Entry<String, Item> entry(Contribution contribution,
+			Composite deployable) {
+		Entry<String, Item> entry = new Entry<String, Item>();
+		entry.setKey(DomainManagerUtil.compositeKey(contribution.getURI(),
+				deployable.getName()));
+		entry.setData(item(contribution, deployable));
+		return entry;
+	}
+
+	/**
+	 * Returns an item describing the given deployable.
+	 * 
+	 * @param contribution
+	 * @param deployable
+	 * @return
+	 */
+	private static Item item(Contribution contribution, Composite deployable) {
+		String contributionURI = contribution.getURI();
+		String contributionLocation = contribution.getLocation();
+		QName qname = deployable.getName();
+		String deployableURI = deployable.getURI();
+		Item item = new Item();
+		item.setTitle(compositeTitle(contributionURI, qname));
+		item.setContents(content(deployable));
+		item.setLink(compositeSourceLink(contributionURI, qname));
+		item.setAlternate(compositeAlternateLink(contributionLocation,
+				deployableURI));
+		item.setRelated(relatedLink(deployable));
+		return item;
+	}
 
 }

Modified: tuscany/branches/sca-java-1.x/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/FileServiceImpl.java
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-java-1.x/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/FileServiceImpl.java?rev=802637&r1=802636&r2=802637&view=diff
==============================================================================
--- tuscany/branches/sca-java-1.x/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/FileServiceImpl.java (original)
+++ tuscany/branches/sca-java-1.x/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/FileServiceImpl.java Mon Aug 10 01:40:02 2009
@@ -39,6 +39,9 @@
 import org.apache.commons.fileupload.FileItem;
 import org.apache.commons.fileupload.disk.DiskFileItemFactory;
 import org.apache.commons.fileupload.servlet.ServletFileUpload;
+import org.apache.tuscany.sca.data.collection.Item;
+import org.apache.tuscany.sca.data.collection.LocalItemCollection;
+import org.apache.tuscany.sca.data.collection.NotFoundException;
 import org.osoa.sca.annotations.Init;
 import org.osoa.sca.annotations.Property;
 import org.osoa.sca.annotations.Reference;
@@ -47,107 +50,161 @@
 
 /**
  * Implementation of a servlet component supporting file upload/download.
- *
+ * 
  * @version $Rev$ $Date$
  */
 @Scope("COMPOSITE")
 @Service(Servlet.class)
 public class FileServiceImpl extends HttpServlet {
-    private static final long serialVersionUID = -4560385595481971616L;
-    
-    private static final Logger logger = Logger.getLogger(FileServiceImpl.class.getName());
-
-    @Property
-    public String directoryName;
-    
-    @Reference
-    public DomainManagerConfiguration domainManagerConfiguration;
-    
-    private ServletFileUpload upload;
-    
-    /**
-     * Initialize the component.
-     */
-    @Init
-    public void initialize() throws IOException {
-        upload = new ServletFileUpload(new DiskFileItemFactory());
-    }
-    
-    @Override
-    public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
-
-        // Upload files
-        String rootDirectory = domainManagerConfiguration.getRootDirectory();
-        try {
-            for (FileItem item: (List<FileItem>)upload.parseRequest(request)) {
-                if (!item.isFormField()) {
-                    File directory = new File(rootDirectory + "/" + directoryName);
-                    if (!directory.exists()) {
-                        directory.mkdirs();
-                    }
-                    logger.fine("post " + item.getName());
-                    item.write(new File(directory, item.getName()));
-                }
-            }
-            
-            // Redirect to the admin page
-            response.sendRedirect("/ui/files");
-        }
-        catch (Exception e) {
-            throw new IOException(e.toString());
-        }
-    }
-    
-    @Override
-    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
-        
-        // Download a file
-        String requestURI = URLDecoder.decode(request.getRequestURI(), "UTF-8");
-        String path = requestURI.substring(request.getServletPath().length());
-        if (path.startsWith("/")) {
-            path = path.substring(1);
-        }
-        logger.fine("get " + path);
-        
-        try {
-            
-            // Analyze the given path
-            URI uri = URI.create(path);
-            String scheme = uri.getScheme();
-            if (scheme == null) {
-
-                // If no scheme is specified then the path identifies file
-                // inside our directory
-                String rootDirectory = domainManagerConfiguration.getRootDirectory();
-                uri = new File(rootDirectory + "/" + directoryName, path).toURI();
-                
-            } else if (!scheme.equals("file")) {
-                
-                // If the scheme does not identify a local file, just redirect to the server
-                // hosting the file
-                response.sendRedirect(path);
-            }
-            
-            // Read the file and write to response 
-            URLConnection connection = uri.toURL().openConnection();
-            connection.setUseCaches(false);
-            connection.connect();
-            InputStream is = connection.getInputStream();
-            ServletOutputStream os = response.getOutputStream();
-            byte[] buffer = new byte[4096];
-            for (;;) {
-                int n = is.read(buffer);
-                if (n < 0) {
-                    break;
-                }
-                os.write(buffer, 0, n);
-            }
-            is.close();
-            os.flush();
-            
-      } catch (FileNotFoundException e) {
-          response.sendError(HttpServletResponse.SC_NOT_FOUND);
-      }
-    }
-    
+	private static final long serialVersionUID = -4560385595481971616L;
+
+	private static final Logger logger = Logger.getLogger(FileServiceImpl.class
+			.getName());
+
+	@Property
+	public String directoryName;
+
+	@Reference
+	public DomainManagerConfiguration domainManagerConfiguration;
+
+	@Reference
+	public LocalItemCollection contributionCollection;
+
+	private ServletFileUpload upload;
+
+	/**
+	 * Initialize the component.
+	 */
+	@Init
+	public void initialize() throws IOException {
+		upload = new ServletFileUpload(new DiskFileItemFactory());
+	}
+
+	@Override
+	public void doPost(HttpServletRequest request, HttpServletResponse response)
+			throws IOException {
+
+		// Upload files
+		String rootDirectory = domainManagerConfiguration.getRootDirectory();
+		try {
+			for (FileItem item : (List<FileItem>) upload.parseRequest(request)) {
+				if (!item.isFormField()) {
+					File directory = new File(rootDirectory + "/"
+							+ directoryName);
+					if (!directory.exists()) {
+						directory.mkdirs();
+					}
+					logger.fine("post " + item.getName());
+					item.write(new File(directory, item.getName()));
+				}
+			}
+
+			// Redirect to the admin page
+			response.sendRedirect("/ui/files");
+		} catch (Exception e) {
+			throw new IOException(e.toString());
+		}
+	}
+
+	@Override
+	protected void doGet(HttpServletRequest request,
+			HttpServletResponse response) throws ServletException, IOException {
+
+		// Download a file
+		String requestURI = URLDecoder.decode(request.getRequestURI(), "UTF-8");
+		String path = requestURI.substring(request.getServletPath().length());
+		if (path.startsWith("/")) {
+			path = path.substring(1);
+		}
+		logger.fine("get " + path);
+
+		try {
+
+			// Analyze the given path
+			String artifactURI;
+			if (path.startsWith("contribution=")) {
+				int semicolonIndex = path.indexOf(';');
+				String contributionName = path.substring("contribution="
+						.length(), semicolonIndex);
+				artifactURI = path.substring(semicolonIndex + 1);
+
+				try {
+					Item item = this.contributionCollection
+							.get(contributionName);
+
+					if (item == null) {
+						response.sendError(HttpServletResponse.SC_NOT_FOUND);
+
+						return;
+
+					}
+
+					path = item.getAlternate();
+
+				} catch (NotFoundException e) {
+					response.sendError(HttpServletResponse.SC_NOT_FOUND);
+
+					return;
+
+				}
+				
+				if (path.endsWith(".jar") || path.endsWith(".zip")) {
+					path = "jar:" + (path.startsWith("file:") ? "" : "file:") + path + '!' + (artifactURI.startsWith("/") ? "" : "/") + artifactURI;
+					
+				} else {
+					path += (path.endsWith("/") ? "" : "/") + artifactURI;
+				}
+
+			} else {
+				artifactURI = null;
+			}
+
+			URI uri = URI.create(path);
+			String scheme = uri.getScheme();
+			if (scheme == null) {
+
+				if (artifactURI != null) {
+					uri = URI.create("file:" + uri.toString());
+
+				} else {
+
+					// If no scheme is specified then the path identifies file
+					// inside our directory
+					String rootDirectory = domainManagerConfiguration
+							.getRootDirectory();
+					uri = new File(rootDirectory + "/" + directoryName, path)
+							.toURI();
+
+				}
+				
+			} else if (!scheme.equals("file") && !scheme.equals("jar")) {
+
+				// If the scheme does not identify a local file, just redirect
+				// to the server
+				// hosting the file
+				response.sendRedirect(path);
+			}
+			
+			// Read the file and write to response
+			URLConnection connection = uri.toURL().openConnection();
+			connection.setUseCaches(false);
+			connection.connect();
+			InputStream is = connection.getInputStream();
+			ServletOutputStream os = response.getOutputStream();
+			byte[] buffer = new byte[4096];
+			for (;;) {
+				int n = is.read(buffer);
+				if (n < 0) {
+					break;
+				}
+				os.write(buffer, 0, n);
+			}
+			is.close();
+			os.flush();
+
+		} catch (FileNotFoundException e) {
+			response.sendError(HttpServletResponse.SC_NOT_FOUND);
+		}
+	}
+
 }

Added: tuscany/branches/sca-java-1.x/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/Searcher.java
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-java-1.x/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/Searcher.java?rev=802637&view=auto
==============================================================================
--- tuscany/branches/sca-java-1.x/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/Searcher.java (added)
+++ tuscany/branches/sca-java-1.x/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/Searcher.java Mon Aug 10 01:40:02 2009
@@ -0,0 +1,502 @@
+package org.apache.tuscany.sca.domain.manager.impl;
+
+import java.io.IOException;
+import java.io.StringWriter;
+import java.io.Writer;
+import java.util.Arrays;
+import java.util.Map;
+
+import org.apache.commons.lang.StringEscapeUtils;
+import org.apache.tuscany.sca.contribution.Contribution;
+import org.apache.tuscany.sca.data.collection.Entry;
+import org.apache.tuscany.sca.data.collection.Item;
+import org.apache.tuscany.sca.data.collection.ItemCollection;
+import org.apache.tuscany.sca.data.collection.LocalItemCollection;
+import org.apache.tuscany.sca.data.collection.NotFoundException;
+import org.apache.tuscany.sca.domain.search.DomainSearch;
+import org.apache.tuscany.sca.domain.search.Result;
+import org.apache.tuscany.sca.domain.search.impl.DomainSearchFormatter;
+import org.apache.tuscany.sca.domain.search.impl.HighlightingUtil;
+import org.apache.tuscany.sca.domain.search.impl.SearchFields;
+import org.osoa.sca.annotations.Reference;
+import org.osoa.sca.annotations.Scope;
+import org.osoa.sca.annotations.Service;
+
+@Scope("COMPOSITE")
+@Service(interfaces = { ItemCollection.class, LocalItemCollection.class })
+public class Searcher implements ItemCollection, LocalItemCollection {
+
+	static char[] characters = { '\u0001'/*  */, '\u0003'/*  */,
+			'\u0004'/*  */, };
+
+	final private static String HTML_NEW_LINE = "<BR/>";
+
+	final private static String PATH_SEPARATOR = "/";
+
+	final private static int MAX_CONTENT_LINE_WIDTH = 300;
+
+	final private static String HIGHLIGHT_START = "<font color='#FF0000'>";
+
+	final private static String HIGHLIGHT_END = "</font>";
+
+	@Reference
+	public ContributionsReader contributionReader;
+
+	@Reference
+	public LocalItemCollection contributionCollection;
+
+	@Reference
+	public DomainSearch domainSearch;
+
+	private int elementCounter;
+
+	public void delete(String key) throws NotFoundException {
+		System.out.println("delete");
+	}
+
+	private static void startIndentation(int size, StringWriter writer) {
+		writer
+				.write("<p style='margin-top:0em;margin-bottom:0em;padding:0em;margin-left:");
+		writer.write(Integer.toString(size));
+		writer.write("em'>");
+
+	}
+
+	private static void endIndentation(StringWriter writer) {
+		writer.write("</p>");
+	}
+
+	public Item get(String key) throws NotFoundException {
+
+		try {
+
+			if (key.startsWith("highlight")) {
+				int lastSemicolonIndex = key.lastIndexOf(";");
+				String artifact = key.substring(lastSemicolonIndex + 1);
+				int secondLastSemicolonIndex = key.lastIndexOf(";",
+						lastSemicolonIndex - 1);
+				String contribution = key.substring(
+						secondLastSemicolonIndex + 1, lastSemicolonIndex);
+				String query = key.substring("highlight".length(),
+						secondLastSemicolonIndex);
+
+				return highlightArtifact(contribution, artifact, query);
+
+			} else if (key.startsWith("query")) {
+				return executeQuery(key.substring("query".length()));
+
+			} else {
+				throw new NotFoundException("Invalid operation!");
+			}
+
+		} catch (Exception t) {
+
+			if (t instanceof NotFoundException) {
+				throw (NotFoundException) t;
+			}
+
+			throw new NotFoundException("Internal error!");
+
+		}
+
+	}
+
+	private Item highlightArtifact(String contribution, String artifact,
+			String query) throws NotFoundException {
+
+		// Item item = this.contributionCollection.get(contribution);
+		//
+		// if (item == null) {
+		// throw new NotFoundException("contribution not found: " +
+		// contribution);
+		// }
+		//
+		// String location = item.getAlternate();
+		//		
+		// if (location.endsWith(".jar") || location.endsWith(".zip")) {
+		// location = "jar:" + (location.startsWith("file:") ? "" : "file:") +
+		// location + '!' + (artifact.startsWith("/") ? "" : "/") + artifact;
+		//			
+		// } else {
+		// location += (location.endsWith("/") ? "" : "/") + artifact;
+		// }
+		//		
+		// try {
+		// Reader reader = new InputStreamReader(new
+		// URL(location).openStream());
+		// StringBuilder sb = new StringBuilder();
+		// int c;
+		//
+		// // TODO: load the chars into an array buffer instead of one
+		// // at a
+		// // time
+		// while ((c = reader.read()) != -1) {
+		// char character = (char) c;
+		//
+		// if (!Character.isIdentifierIgnorable(character)) {
+		// sb.append(character);
+		// }
+		//
+		// }
+		//
+		// String highlightedText =
+		// this.domainSearch.highlight(SearchFields.FILE_CONTENT_FIELD,
+		// sb.toString(), query);
+		// highlightedText =
+		// HighlightingUtil.replaceHighlightMarkupBy(highlightedText,
+		// HIGHLIGHT_START, HIGHLIGHT_END);
+		//			
+		// item = new Item();
+		// item.setTitle("Highlighted Artifact");
+		// item.setContents(highlightedText);
+		//			
+		// return item;
+		//
+		// } catch (Exception e) {
+		// throw new NotFoundException("Could not highlight artifact: " +
+		// e.getMessage(), e);
+		// }
+
+		return null;
+
+	}
+
+	private Item executeQuery(String query) throws NotFoundException {
+
+		if (!this.domainSearch.indexExists()) {
+
+			Contribution[] contributions = this.contributionReader
+					.readContributions();
+
+			for (Contribution contribution : contributions) {
+
+				if (!contribution.getURI().equals(
+						DomainManagerUtil.DEPLOYMENT_CONTRIBUTION_URI)) {
+
+					this.domainSearch.contributionUpdated(contribution,
+							contribution);
+
+				}
+
+			}
+
+		}
+
+		Result[] results;
+		try {
+			results = this.domainSearch.parseAndSearch(query, true);
+
+		} catch (Exception e1) {
+
+			throw new NotFoundException("Exception while searching: "
+					+ e1.getMessage(), e1);
+
+		}
+
+		Item item = new Item();
+		item.setTitle("Results");
+
+		StringWriter sw = new StringWriter();
+		this.elementCounter = 0;
+
+		if (results.length > 0) {
+
+			for (Result result : results) {
+
+				try {
+					writeToHTML(0, result, sw);
+
+				} catch (IOException e) {
+					// ignore result
+				}
+
+			}
+			
+			String contents = HighlightingUtil.replaceHighlightMarkupBy(sw
+					.getBuffer(), HIGHLIGHT_START, HIGHLIGHT_END);
+
+			item.setContents(replaceAll(contents, 40) + "end");
+
+		} else {
+			item.setContents("No results match: <u>" + query + "</u>");
+		}
+
+		System.out.println(item.getContents());
+
+		return item;
+
+	}
+
+	//	
+	// private static String replaceAll(CharSequence c) {
+	// StringBuilder sb = new StringBuilder();
+	// // HashSet<Character> set = new HashSet<Character>();
+	// Arrays.sort(characters);
+	// // int start = 0, end = 4;
+	// // char[] chars = new char[end - start];
+	// // System.arraycopy(characters, start, chars, 0, end - start);
+	//		
+	// for (int i = 0 ; i < c.length() ; i++) {
+	// char actual = c.charAt(i);
+	//			
+	// //if (Arrays.binarySearch(characters, actual) < 0) {
+	//
+	// if (!Character.isIdentifierIgnorable(actual)) {
+	// sb.append(actual);
+	//				
+	// } else {
+	// //sb.append('0');
+	// }
+	//			
+	// }
+	// //
+	// // System.out.println("set-size: " + set.size());
+	// // for (char character : set) {
+	// // System.out.print(",");
+	// // System.out.print((int) character);
+	// // System.out.print("/*" + character + "*/");
+	// //
+	// // }
+	// //
+	// // System.out.println();
+	//		
+	// return sb.toString();
+	//		
+	// }
+
+	private static String replaceAll(CharSequence c, int less) {
+		StringBuilder sb = new StringBuilder();
+		// HashSet<Character> set = new HashSet<Character>();
+		Arrays.sort(characters);
+		// int start = 0, end = 4;
+		// char[] chars = new char[end - start];
+		// System.arraycopy(characters, start, chars, 0, end - start);
+
+		for (int i = 0; i < c.length(); i++) {
+			char actual = c.charAt(i);
+
+			// if (Arrays.binarySearch(characters, actual) < 0) {
+
+			// if (actual != '\u000b' && actual != '\u0020' &&
+			// actual != '\u000c' && actual != '\u0009' &&
+			// actual != ')' && actual != '(') {
+
+			if (actual > less || actual == '&' || actual == '#'
+					|| actual == '\'' || actual == ' ' || actual == '%'
+					|| actual == ':' || actual == '(' || actual == ')'
+					|| actual == '"') {
+
+				sb.append(actual);
+
+			} else {
+				// sb.append('0');
+			}
+
+		}
+		//		
+		// System.out.println("set-size: " + set.size());
+		// for (char character : set) {
+		// System.out.print(",");
+		// System.out.print((int) character);
+		// System.out.print("/*" + character + "*/");
+		//			
+		// }
+		//		
+		// System.out.println();
+
+		return sb.toString();
+
+	}
+
+	private static String getIconLocationForResult(Result result) {
+
+		if (SearchFields.COMPONENT_FIELD.equals(result.getField())) {
+			return "icons/component.png' title='Component";
+
+		} else if (SearchFields.COMPOSITE_FIELD.equals(result.getField())) {
+			return "icons/composite.png' title='Composite";
+
+		} else if (SearchFields.ARTIFACT_FIELD.equals(result.getField())) {
+			return "icons/artifact.png' title='Artifact";
+		}
+
+		return "icons/feed-icon.png";
+
+	}
+
+	private static void writeResultIcon(Writer writer, Result result)
+			throws IOException {
+		writer.write("<img src='");
+		writer.write(getIconLocationForResult(result));
+		writer.write("'/> ");
+
+	}
+
+	private static Result writeFileContentResultToHTML(int indentation,
+			Result result, StringWriter writer) throws IOException {
+
+		Map<String, Result> contents = result.getContents();
+		writeResultIcon(writer, result);
+
+		if (contents.size() == 1
+				&& SearchFields.ARTIFACT_FIELD.equals(contents.values()
+						.iterator().next().getField())) {
+
+			writer.write(result.getValue());
+			contents = result.getContents();
+
+			while (contents.size() == 1
+					&& SearchFields.ARTIFACT_FIELD.equals(contents.values()
+							.iterator().next().getField())) {
+
+				result = contents.values().iterator().next();
+
+				writer.write(PATH_SEPARATOR);
+				StringEscapeUtils.escapeHtml(writer, result.getValue());
+
+				contents = result.getContents();
+
+			}
+
+		} else {
+			StringEscapeUtils.escapeHtml(writer, result.getValue());
+		}
+
+		return result;
+
+	}
+
+	private static String removeHighlighting(String text) {
+		return HighlightingUtil.replaceHighlightMarkupBy(text, "", "");
+	}
+
+	private static void writeResultName(Result result, StringWriter writer)
+			throws IOException {
+
+		if (SearchFields.CONTRIBUTION_FIELD.equals(result.getField())) {
+			writer.write("<a href='/contribution/");
+			writer.write(removeHighlighting(result.getValue()));
+			writer.write("'>");
+			writer.write(StringEscapeUtils.escapeHtml(result.getValue()));
+			writer.write("</a>");
+
+		} else if (SearchFields.COMPOSITE_FIELD.equals(result.getField())) {
+			writer.write("<a href='/composite-source/composite:");
+			writer.write(getContributionURI(result));
+			writer.write(';');
+			writer.write(removeHighlighting(result.getValue()));
+			writer.write("'>");
+			writer.write(StringEscapeUtils.escapeHtml(result.getValue()));
+			writer.write("</a>");
+
+		} else {
+			StringEscapeUtils.escapeHtml(writer, result.getValue());
+		}
+
+	}
+
+	private static String getContributionURI(Result result) {
+
+		if (result == null) {
+			return "";
+
+		} else if (SearchFields.CONTRIBUTION_FIELD.equals(result.getField())) {
+			return removeHighlighting(result.getValue());
+
+		} else {
+			return getContributionURI(result.getContainer());
+		}
+
+	}
+
+	private void writeToHTML(int indentation, Result result, StringWriter writer)
+			throws IOException {
+
+		startIndentation(indentation++, writer);
+		String field = result.getField();
+
+		if (SearchFields.FILE_CONTENT_FIELD.equals(field)) {
+			String content = result.getValue();
+
+			if (content != null && content.length() > 0
+					&& DomainSearchFormatter.isHighlighted(content)) {
+
+				writer.write(HTML_NEW_LINE);
+
+				this.elementCounter++;
+				writer.write("<div style='margin-top:0em;margin-left:");
+				writer.write(Integer.toString(indentation));
+				writer
+						.write("em;background-color:#FFE175;max-width:100%;border-style:dashed;border-width:1px;padding:5px'>"
+								+ "<p style='margin:0px;padding:0px;font-size:70%'>"
+								+ "<a style='margin:0px;padding:0px' href='#filecontent");
+
+				writer.write(Integer.toString(this.elementCounter));
+
+				String contributionPlusArtifact = getContributionURI(result)
+						+ ";"
+						+ removeHighlighting(result.getContainer().getValue());
+
+				// writer.write("' onclick='search");
+				// writer.write("'>view all</a>&nbsp;&nbsp;<a href='/files/contribution=");
+				writer.write("' onclick='getHighlighted(\"");
+				writer.write(contributionPlusArtifact);
+				writer
+						.write("\")'>view all</a>&nbsp;&nbsp;<a href='/files/contribution=");
+
+				writer.write(contributionPlusArtifact);
+				writer
+						.write("'>download</a></p><p style='margin:8px 0px 0px 0px;padding:0px'>");
+
+				int i = 0;
+				while (i < content.length()) {
+					StringEscapeUtils.escapeHtml(writer, content.substring(i,
+							Math.min(i + MAX_CONTENT_LINE_WIDTH, content
+									.length())));
+					writer.write(HTML_NEW_LINE);
+					i += MAX_CONTENT_LINE_WIDTH;
+
+				}
+
+				writer.write("</p></div>");
+
+			}
+
+		} else if (SearchFields.ARTIFACT_FIELD.equals(field)) {
+			result = writeFileContentResultToHTML(indentation, result, writer);
+
+		} else {
+
+			writeResultIcon(writer, result);
+			writeResultName(result, writer);
+
+		}
+
+		endIndentation(writer);
+
+		for (Result actualResult : result.getContents().values()) {
+			writeToHTML(indentation, actualResult, writer);
+		}
+
+	}
+
+	public Entry<String, Item>[] getAll() {
+		System.out.println("getAll");
+		return null;
+	}
+
+	public String post(String key, Item item) {
+		System.out.println("post");
+		return null;
+	}
+
+	public void put(String key, Item item) throws NotFoundException {
+		System.out.println("put");
+	}
+
+	public Entry<String, Item>[] query(String queryString) {
+		System.out.println("query");
+		return null;
+	}
+
+}

Modified: tuscany/branches/sca-java-1.x/modules/domain-manager/src/main/resources/DomainManager.composite
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-java-1.x/modules/domain-manager/src/main/resources/DomainManager.composite?rev=802637&r1=802636&r2=802637&view=diff
==============================================================================
--- tuscany/branches/sca-java-1.x/modules/domain-manager/src/main/resources/DomainManager.composite (original)
+++ tuscany/branches/sca-java-1.x/modules/domain-manager/src/main/resources/DomainManager.composite Mon Aug 10 01:40:02 2009
@@ -128,6 +128,7 @@
    	 		<t:binding.atom uri="http://localhost:9990/workspace" title="Contributions"/>
    		</service>
    		<reference name="domainManagerConfiguration" target="DomainManagerConfigurationComponent"/>
+   		<reference name="domainSearch" target="DomainSearchComponent"/>
     </component>
 
     <component name="ContributionServiceComponent">
@@ -154,6 +155,7 @@
    	 		<t:binding.http uri="http://localhost:9990/files"/>
    		</service>
    		<reference name="domainManagerConfiguration" target="DomainManagerConfigurationComponent"/>
+   		<reference name="contributionCollection" target="ContributionCollectionComponent/LocalItemCollection"/>
     </component>
 
     <component name="DomainCompositeCollectionComponent">
@@ -274,7 +276,8 @@
    		</service>
    		
    		<reference name="domainSearch" target="DomainSearchComponent"/>
-   		<reference name="contributionCollection" target="ContributionCollectionComponent/WorkspaceReader"/>
+   		<reference name="contributionCollection" target="ContributionCollectionComponent/LocalItemCollection"/>
+   		<reference name="contributionReader" target="DeployableCompositeCollectionComponent/ContributionsReader"/>
    		
     </component>
 
@@ -311,6 +314,7 @@
     
     <component name="DomainSearchComponent">
         <implementation.java class="org.apache.tuscany.sca.domain.search.impl.DomainSearchImpl"/>
+        <!--<property name="indexDirectoryPath">domainSearchIndex</property>      -->
     </component>
-
+ 
 </composite>

Added: tuscany/branches/sca-java-1.x/modules/domain-manager/src/main/resources/icons/artifact.png
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-java-1.x/modules/domain-manager/src/main/resources/icons/artifact.png?rev=802637&view=auto
==============================================================================
Binary file - no diff available.

Propchange: tuscany/branches/sca-java-1.x/modules/domain-manager/src/main/resources/icons/artifact.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: tuscany/branches/sca-java-1.x/modules/domain-manager/src/main/resources/icons/component.png
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-java-1.x/modules/domain-manager/src/main/resources/icons/component.png?rev=802637&view=auto
==============================================================================
Binary file - no diff available.

Propchange: tuscany/branches/sca-java-1.x/modules/domain-manager/src/main/resources/icons/component.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: tuscany/branches/sca-java-1.x/modules/domain-manager/src/main/resources/icons/composite.png
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-java-1.x/modules/domain-manager/src/main/resources/icons/composite.png?rev=802637&view=auto
==============================================================================
Binary file - no diff available.

Propchange: tuscany/branches/sca-java-1.x/modules/domain-manager/src/main/resources/icons/composite.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Modified: tuscany/branches/sca-java-1.x/modules/domain-manager/src/main/resources/search-gadget.html
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-java-1.x/modules/domain-manager/src/main/resources/search-gadget.html?rev=802637&r1=802636&r2=802637&view=diff
==============================================================================
--- tuscany/branches/sca-java-1.x/modules/domain-manager/src/main/resources/search-gadget.html (original)
+++ tuscany/branches/sca-java-1.x/modules/domain-manager/src/main/resources/search-gadget.html Mon Aug 10 01:40:02 2009
@@ -25,11 +25,39 @@
 <script type="text/javascript" src="../search-gadget/search-gadget.js"></script>
 <script type="text/javascript" src="utils.js"></script>
 
-
-
 <link rel="stylesheet" type="text/css" href="manager.css">
 
+<script type="text/javascript">
 
+	function search() {
+		lastQuery = elementByID(gadget, 'searchField').value;
+		searcher.get("query" + lastQuery, searchResponse);
+		
+	}
+	
+	function getHighlighted(artifact) {
+		searcher.get("highlight" + lastQuery + ";" + artifact, searchResponse);
+	}
+	
+	function highlightResponse(feed) {
+		var entries = feed.getElementsByTagName("entry");
+		var content = entries[0].getElementsByTagName("content");
+		
+		var results = elementByID(gadget, "results");
+		results.innerHTML = content[0].firstChild.data;
+		
+	}
+	
+	function searchResponse(feed) {
+		var entries = feed.getElementsByTagName("entry");
+		var content = entries[0].getElementsByTagName("content");
+		
+		var results = elementByID(gadget, "results");
+		results.innerHTML = content[0].firstChild.data;
+		
+	}
+	
+</script>
 
 </head>
 
@@ -53,28 +81,14 @@
 </body>
 
 <script type="text/javascript">
-
 	//@Reference
 	var searcher = new tuscany.sca.Reference("searcher");
 	
 	var gadget = gadget(window, document);
 	
-	function search() {
-		searcher.get(elementByID(gadget, 'searchField').value, searchResponse);
-	}
-	
-	function searchResponse(feed) {
-		var entries = feed.getElementsByTagName("entry");
-		var content = entries[0].getElementsByTagName("content");
-		
-		// alert(content[0].firstChild.data);
-		
-		var results = elementByID(gadget, "results");
-		results.innerHTML = content[0].firstChild.data;
-		
-	}
+	var lastQuery = "";
 	
-	elementByID(gadget, 'searchButton').onclick = search
+	elementByID(gadget, 'searchButton').onclick = search;
 	
 </script>
 

Modified: tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/DomainSearch.java
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/DomainSearch.java?rev=802637&r1=802636&r2=802637&view=diff
==============================================================================
--- tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/DomainSearch.java (original)
+++ tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/DomainSearch.java Mon Aug 10 01:40:02 2009
@@ -2,15 +2,18 @@
 
 import org.apache.lucene.search.Query;
 import org.apache.tuscany.sca.contribution.Contribution;
-import org.apache.tuscany.sca.contribution.service.ContributionRepository;
 import org.osoa.sca.annotations.Remotable;
 
 @Remotable
 public interface DomainSearch {
 	
-	Result[] parseAndSearch(String searchQuery, boolean highlight);
+	boolean indexExists();
 	
-	Result[] search(Query searchQuery, boolean hightlight);
+	Result[] parseAndSearch(String searchQuery, boolean highlight) throws Exception;
+	
+	Result[] search(Query searchQuery, boolean hightlight) throws Exception;
+	
+	String highlight(String field, String text, String searchQuery) throws Exception;
 	
 	/**
      * Notifies the listener that a contribution has been added.
@@ -18,7 +21,7 @@
      * @param repository The contribution repository 
      * @param contribution The new contribution
      */
-    void contributionAdded(ContributionRepository repository, Contribution contribution);
+    void contributionAdded(Contribution contribution);
     
     /**
      * Notifies the listener that a contribution has been removed.
@@ -26,7 +29,7 @@
      * @param repository The contribution repository 
      * @param contribution The removed contribution.
      */
-    void contributionRemoved(ContributionRepository repository, Contribution contribution);
+    void contributionRemoved(Contribution contribution);
     
     /**
      * Notifies the listener that a contribution has been updated.
@@ -35,6 +38,6 @@
      * @param oldContribution The old contribution 
      * @param contribution The new contribution
      */
-    void contributionUpdated(ContributionRepository repository, Contribution oldContribution, Contribution contribution);
+    void contributionUpdated(Contribution oldContribution, Contribution contribution);
 
 }

Modified: tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/Result.java
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/Result.java?rev=802637&r1=802636&r2=802637&view=diff
==============================================================================
--- tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/Result.java (original)
+++ tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/Result.java Mon Aug 10 01:40:02 2009
@@ -5,9 +5,9 @@
 
 public interface Result extends Serializable {
 	
-	String getName();
+	String getValue();
 	
-	void setName(String name);
+	void setValue(String value);
 	
 	Result getContainer();
 	
@@ -18,5 +18,9 @@
 	void removeContent(Result artifactResult);
 	
 	void setContainer(Result container);
+	
+	String getField();
+	
+	void setField(String field);
 
 }

Modified: tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/ResultFactory.java
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/ResultFactory.java?rev=802637&r1=802636&r2=802637&view=diff
==============================================================================
--- tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/ResultFactory.java (original)
+++ tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/ResultFactory.java Mon Aug 10 01:40:02 2009
@@ -4,11 +4,7 @@
 
 public interface ResultFactory<T extends Result> {
 	
-	String getType();
-	
-	String getName(Document document);
-	
-	T createResult(String name);
+	T createResult(String field, String value);
 	
 	T createResult(Document document);
 

Modified: tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/ResultProcessor.java
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/ResultProcessor.java?rev=802637&r1=802636&r2=802637&view=diff
==============================================================================
--- tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/ResultProcessor.java (original)
+++ tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/ResultProcessor.java Mon Aug 10 01:40:02 2009
@@ -1,10 +1,9 @@
 package org.apache.tuscany.sca.domain.search;
 
 import org.apache.lucene.document.Document;
-import org.apache.lucene.search.Query;
 
 public interface ResultProcessor {
 	
-	Result process(Document document, Query query, Result result);
+	Result process(Document document, Result result);
 
 }

Modified: tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/impl/ArtifactDocumentProcessor.java
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/impl/ArtifactDocumentProcessor.java?rev=802637&r1=802636&r2=802637&view=diff
==============================================================================
--- tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/impl/ArtifactDocumentProcessor.java (original)
+++ tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/impl/ArtifactDocumentProcessor.java Mon Aug 10 01:40:02 2009
@@ -1,11 +1,11 @@
 package org.apache.tuscany.sca.domain.search.impl;
 
-import java.io.File;
-import java.net.MalformedURLException;
+import java.io.IOException;
 import java.net.URL;
 
 import org.apache.lucene.document.Field;
 import org.apache.tuscany.sca.contribution.Artifact;
+import org.apache.tuscany.sca.contribution.Contribution;
 import org.apache.tuscany.sca.domain.search.DocumentMap;
 import org.apache.tuscany.sca.domain.search.DocumentProcessor;
 
@@ -17,43 +17,68 @@
 
 		if (object instanceof Artifact) {
 			Artifact artifact = (Artifact) object;
-			String uri = artifact.getURI();
+			// String uri = artifact.getURI();
 
-			if (uri != null && uri.length() == 0) {
-				uri = null;
-			}
+			// if (uri != null && uri.length() == 0) {
+			// uri = null;
+			// }
+			//
+			// if (uri != null) {
+			//
+			// if (uri.endsWith(".composite")
+			// || uri.endsWith(".component")) {
+			//
+			// parent += DomainPathAnalyzer.PATH_SEPARATOR
+			// + SearchFields.ARTIFACT_FIELD
+			// + DomainPathAnalyzer.TYPE_SEPARATOR + uri;
+			//
+			// if (document == null) {
+			// document = documents.get(uri);
+			// }
+			//
+			// document.add(new Field(SearchFields.ARTIFACT_FIELD, uri,
+			// Field.Store.YES, Field.Index.ANALYZED));
+			//
+			// }
+			//
+			// }
 
-			if (uri != null) {
-
-				parent += DomainPathAnalyzer.PATH_SEPARATOR
-						+ SearchFields.ARTIFACT_FIELD
-						+ DomainPathAnalyzer.TYPE_SEPARATOR + uri;
-
-				if (document == null) {
-					document = documents.get(uri);
-				}
-
-				document.add(new Field(SearchFields.ARTIFACT_FIELD, uri,
-						Field.Store.YES, Field.Index.ANALYZED));
-
-			}
-
-			if (document != null) {
+			if (!(object instanceof Contribution)) {
 
 				String location = artifact.getLocation();
-				
-				document.add(new Field(SearchFields.LOCATION_FIELD, location,
-						Field.Store.YES, Field.Index.ANALYZED));
 
 				try {
+
+					if (document == null) {
+						document = documents.get(SearchFields.ARTIFACT_FIELD + location);
+					}
+
+					FileContent fileContent = new WrappedFileContent(new URL(
+							location));
+
+					document.add(new Field(SearchFields.ARTIFACT_FIELD,
+							fileContent.getName(), Field.Store.YES,
+							Field.Index.ANALYZED));
+
+					parent += DomainPathAnalyzer.PATH_SEPARATOR
+							+ SearchFields.ARTIFACT_FIELD
+							+ DomainPathAnalyzer.TYPE_SEPARATOR
+							+ location + DomainPathAnalyzer.URI_SEPARATOR
+							+ fileContent.getName();
+
+					// parent += DomainPathAnalyzer.PATH_SEPARATOR
+					// + SearchFields.FILE_FIELD
+					// + DomainPathAnalyzer.TYPE_SEPARATOR + location +
+					// DomainPathAnalyzer.URI_SEPARATOR + fileContent.getName();
+
 					Document fileDoc = parentProcessor.process(parentProcessor,
-							documents, new SystemFileContent(new File(new URL(location).getFile())), document, parent);
-					
+							documents, fileContent, null, parent);
+
 					fileDoc.add(new Field(SearchFields.PARENT_FIELD, parent,
 							Field.Store.YES, Field.Index.ANALYZED));
-					
-				} catch (MalformedURLException e) {
-					// ignore file
+
+				} catch (IOException e) {
+					// ignore location
 				}
 
 			}
@@ -70,13 +95,13 @@
 
 		if (obj instanceof Artifact) {
 			Artifact artifact = (Artifact) obj;
-			String uri = artifact.getURI();
+			String uri = artifact.getLocation();
 
 			if (uri != null && uri.length() == 0) {
 				return null;
 			}
 
-			return uri;
+			return SearchFields.ARTIFACT_FIELD + uri;
 
 		}
 

Modified: tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/impl/ComponentDocumentProcessor.java
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/impl/ComponentDocumentProcessor.java?rev=802637&r1=802636&r2=802637&view=diff
==============================================================================
--- tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/impl/ComponentDocumentProcessor.java (original)
+++ tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/impl/ComponentDocumentProcessor.java Mon Aug 10 01:40:02 2009
@@ -5,6 +5,7 @@
 import org.apache.tuscany.sca.assembly.ComponentProperty;
 import org.apache.tuscany.sca.assembly.ComponentReference;
 import org.apache.tuscany.sca.assembly.ComponentService;
+import org.apache.tuscany.sca.assembly.Property;
 import org.apache.tuscany.sca.domain.search.DocumentMap;
 import org.apache.tuscany.sca.domain.search.DocumentProcessor;
 import org.apache.tuscany.sca.domain.search.Result;
@@ -32,12 +33,16 @@
 				if (doc == null) {
 					doc = documents.get(uri);
 				}
-				
-				parent += DomainPathAnalyzer.PATH_SEPARATOR + SearchFields.COMPONENT_FIELD + DomainPathAnalyzer.TYPE_SEPARATOR + uri + DomainPathAnalyzer.URI_SEPARATOR + component.getName();
+
+				parent += DomainPathAnalyzer.PATH_SEPARATOR
+						+ SearchFields.COMPONENT_FIELD
+						+ DomainPathAnalyzer.TYPE_SEPARATOR + uri
+						+ DomainPathAnalyzer.URI_SEPARATOR
+						+ component.getName();
 
 				doc.add(new Field(SearchFields.COMPONENT_FIELD, uri,
 						Field.Store.YES, Field.Index.ANALYZED));
-				
+
 				for (ComponentService service : component.getServices()) {
 					Document serviceDoc = documents.get(uri + ':'
 							+ service.getName());
@@ -84,8 +89,9 @@
 					Document referenceDoc = documents.get(uri + ':'
 							+ reference.getName());
 
-					referenceDoc.add(new Field(SearchFields.REFERENCE_NAME_FIELD,
-							reference.getName(), Field.Store.YES,
+					referenceDoc.add(new Field(
+							SearchFields.REFERENCE_NAME_FIELD, reference
+									.getName(), Field.Store.YES,
 							Field.Index.ANALYZED));
 
 					InterfaceContract interfaceContract = reference
@@ -117,31 +123,38 @@
 
 					}
 
-					referenceDoc.add(new Field(SearchFields.PARENT_FIELD, parent,
-							Field.Store.YES, Field.Index.ANALYZED));
+					referenceDoc.add(new Field(SearchFields.PARENT_FIELD,
+							parent, Field.Store.YES, Field.Index.ANALYZED));
 
 				}
 
 			}
 
-			Document implementationDoc = parentProcessor.process(parentProcessor,
-					documents, component.getImplementation(), null, parent);
+			Document implementationDoc = parentProcessor.process(
+					parentProcessor, documents, component.getImplementation(),
+					null, parent);
 
 			if (uri != null && implementationDoc != null) {
 
-				implementationDoc.add(new Field(SearchFields.PARENT_FIELD,
-						uri, Field.Store.YES, Field.Index.ANALYZED));
-				
+				implementationDoc.add(new Field(SearchFields.PARENT_FIELD, uri,
+						Field.Store.YES, Field.Index.ANALYZED));
+
 			}
 
 			for (ComponentProperty componentProperty : component
 					.getProperties()) {
-				Document propertyDoc = parentProcessor.process(parentProcessor,
-						documents, componentProperty.getProperty(), null, parent);
 
-				if (uri != null) {
-					propertyDoc.add(new Field(SearchFields.PARENT_FIELD, parent,
-							Field.Store.YES, Field.Index.ANALYZED));
+				Property property = componentProperty.getProperty();
+				
+				if (property != null) {
+					Document propertyDoc = parentProcessor.process(
+							parentProcessor, documents, property, null, parent);
+
+					if (uri != null) {
+						propertyDoc.add(new Field(SearchFields.PARENT_FIELD,
+								parent, Field.Store.YES, Field.Index.ANALYZED));
+
+					}
 
 				}
 
@@ -176,17 +189,16 @@
 
 	}
 
-	public Result processDocument(org.apache.lucene.document.Document document, Result result) {
+	public Result processDocument(org.apache.lucene.document.Document document,
+			Result result) {
 		String componentName = document.get(SearchFields.COMPONENT_FIELD);
-		
+
 		if (componentName != null) {
-			
-			
-			
+
 		}
-		
+
 		return null;
-		
+
 	}
 
 }

Modified: tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/impl/ComponentTypeDocumentProcessor.java
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/impl/ComponentTypeDocumentProcessor.java?rev=802637&r1=802636&r2=802637&view=diff
==============================================================================
--- tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/impl/ComponentTypeDocumentProcessor.java (original)
+++ tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/impl/ComponentTypeDocumentProcessor.java Mon Aug 10 01:40:02 2009
@@ -7,6 +7,7 @@
 import org.apache.tuscany.sca.assembly.Service;
 import org.apache.tuscany.sca.domain.search.DocumentMap;
 import org.apache.tuscany.sca.domain.search.DocumentProcessor;
+import org.apache.tuscany.sca.interfacedef.Interface;
 import org.apache.tuscany.sca.interfacedef.InterfaceContract;
 import org.apache.tuscany.sca.interfacedef.Operation;
 
@@ -35,8 +36,10 @@
 			}
 
 			if (uri != null) {
-				
-				parent += DomainPathAnalyzer.PATH_SEPARATOR + SearchFields.COMPONENT_TYPE_FIELD + DomainPathAnalyzer.TYPE_SEPARATOR + uri;
+
+				parent += DomainPathAnalyzer.PATH_SEPARATOR
+						+ SearchFields.COMPONENT_TYPE_FIELD
+						+ DomainPathAnalyzer.TYPE_SEPARATOR + uri;
 
 				doc.add(new Field(SearchFields.COMPONENT_TYPE_FIELD, uri,
 						Field.Store.YES, Field.Index.ANALYZED));
@@ -54,25 +57,35 @@
 
 					if (interfaceContract != null) {
 
-						for (Operation operation : interfaceContract
-								.getInterface().getOperations()) {
+						Interface interfac = interfaceContract.getInterface();
 
-							serviceDoc.add(new Field(
-									SearchFields.SERVICE_INTERFACE_FIELD,
-									operation.getName(), Field.Store.YES,
-									Field.Index.ANALYZED));
+						if (interfac != null) {
+
+							for (Operation operation : interfac.getOperations()) {
+
+								serviceDoc.add(new Field(
+										SearchFields.SERVICE_INTERFACE_FIELD,
+										operation.getName(), Field.Store.YES,
+										Field.Index.ANALYZED));
+
+							}
 
 						}
 
-						for (Operation operation : interfaceContract
-								.getCallbackInterface().getOperations()) {
+						interfac = interfaceContract.getCallbackInterface();
 
-							serviceDoc
-									.add(new Field(
-											SearchFields.SERVICE_INTERFACE_CALLBACK_FIELD,
-											operation.getName(),
-											Field.Store.YES,
-											Field.Index.ANALYZED));
+						if (interfac != null) {
+
+							for (Operation operation : interfac.getOperations()) {
+
+								serviceDoc
+										.add(new Field(
+												SearchFields.SERVICE_INTERFACE_CALLBACK_FIELD,
+												operation.getName(),
+												Field.Store.YES,
+												Field.Index.ANALYZED));
+
+							}
 
 						}
 
@@ -122,8 +135,8 @@
 
 					}
 
-					referenceDoc.add(new Field(SearchFields.PARENT_FIELD, parent,
-							Field.Store.YES, Field.Index.ANALYZED));
+					referenceDoc.add(new Field(SearchFields.PARENT_FIELD,
+							parent, Field.Store.YES, Field.Index.ANALYZED));
 
 				}
 
@@ -135,8 +148,8 @@
 
 				if (uri != null) {
 
-					propertyDoc.add(new Field(SearchFields.PARENT_FIELD, parent,
-							Field.Store.YES, Field.Index.ANALYZED));
+					propertyDoc.add(new Field(SearchFields.PARENT_FIELD,
+							parent, Field.Store.YES, Field.Index.ANALYZED));
 
 				}
 

Modified: tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/impl/CompositeDocumentProcessor.java
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/impl/CompositeDocumentProcessor.java?rev=802637&r1=802636&r2=802637&view=diff
==============================================================================
--- tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/impl/CompositeDocumentProcessor.java (original)
+++ tuscany/branches/sca-java-1.x/modules/domain-search/src/main/java/org/apache/tuscany/sca/domain/search/impl/CompositeDocumentProcessor.java Mon Aug 10 01:40:02 2009
@@ -15,11 +15,9 @@
 
 		if (object instanceof Composite) {
 			Composite composite = (Composite) object;
-			String uri = composite.getURI();
 			QName name = composite.getName();
-
-			uri = (uri == null ? "" : uri) + (name == null ? "" : name.toString());
-
+			String uri = (name == null ? "" : name.getNamespaceURI() + ';'  + name.getLocalPart());
+			
 			if (uri.length() == 0) {
 				uri = null;
 				
@@ -28,7 +26,7 @@
 			}
 			
 			if (uri != null) {
-				parent += DomainPathAnalyzer.PATH_SEPARATOR + SearchFields.COMPOSITE_FIELD + DomainPathAnalyzer.TYPE_SEPARATOR + composite.getURI() + DomainPathAnalyzer.URI_SEPARATOR + composite.getName();
+				parent += DomainPathAnalyzer.PATH_SEPARATOR + SearchFields.COMPOSITE_FIELD + DomainPathAnalyzer.TYPE_SEPARATOR + uri;
 			}
 			
 			for (Component component : composite.getComponents()) {