Return-Path: Delivered-To: apmail-ws-tuscany-commits-archive@locus.apache.org Received: (qmail 20931 invoked from network); 1 Jun 2008 08:38:33 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 1 Jun 2008 08:38:33 -0000 Received: (qmail 76492 invoked by uid 500); 1 Jun 2008 08:38:33 -0000 Delivered-To: apmail-ws-tuscany-commits-archive@ws.apache.org Received: (qmail 76475 invoked by uid 500); 1 Jun 2008 08:38:33 -0000 Mailing-List: contact tuscany-commits-help@ws.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: tuscany-dev@ws.apache.org Delivered-To: mailing list tuscany-commits@ws.apache.org Received: (qmail 76461 invoked by uid 99); 1 Jun 2008 08:38:33 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 01 Jun 2008 01:38:33 -0700 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 01 Jun 2008 08:37:52 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 351772388A1B; Sun, 1 Jun 2008 01:38:09 -0700 (PDT) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r662176 - /incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/ Date: Sun, 01 Jun 2008 08:38:08 -0000 To: tuscany-commits@ws.apache.org From: jsdelfino@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20080601083809.351772388A1B@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: jsdelfino Date: Sun Jun 1 01:38:08 2008 New Revision: 662176 URL: http://svn.apache.org/viewvc?rev=662176&view=rev Log: Starting to implement some caching of contribution metadata in domain manager app. Modified: incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/CompositeGeneratorServiceImpl.java incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/ContributionCollectionImpl.java incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/DeployableCompositeCollectionImpl.java incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/DeployedCompositeCollectionImpl.java incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/DomainManagerUtil.java Modified: incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/CompositeGeneratorServiceImpl.java URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/CompositeGeneratorServiceImpl.java?rev=662176&r1=662175&r2=662176&view=diff ============================================================================== --- incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/CompositeGeneratorServiceImpl.java (original) +++ incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/CompositeGeneratorServiceImpl.java Sun Jun 1 01:38:08 2008 @@ -21,6 +21,7 @@ import static org.apache.tuscany.sca.domain.manager.impl.DomainManagerUtil.compositeQName; import static org.apache.tuscany.sca.domain.manager.impl.DomainManagerUtil.contributionURI; +import static org.apache.tuscany.sca.domain.manager.impl.DomainManagerUtil.lastModified; import static org.apache.tuscany.sca.domain.manager.impl.DomainManagerUtil.locationURL; import java.io.IOException; @@ -28,6 +29,8 @@ import java.net.URI; import java.net.URL; import java.net.URLDecoder; +import java.util.HashMap; +import java.util.Map; import java.util.logging.Logger; import javax.servlet.Servlet; @@ -58,6 +61,7 @@ import org.apache.tuscany.sca.contribution.service.ContributionWriteException; import org.apache.tuscany.sca.core.ExtensionPointRegistry; import org.apache.tuscany.sca.core.UtilityExtensionPoint; +import org.apache.tuscany.sca.domain.manager.impl.CompositeGeneratorServiceImpl.Cache.ContributionCache; import org.apache.tuscany.sca.implementation.data.collection.Item; import org.apache.tuscany.sca.implementation.data.collection.LocalItemCollection; import org.apache.tuscany.sca.implementation.data.collection.NotFoundException; @@ -94,6 +98,19 @@ private XMLOutputFactory outputFactory; /** + * Cache contribution models. + */ + static class Cache { + static class ContributionCache { + private Contribution contribution; + private long contributionLastModified; + } + private Map contributions = new HashMap(); + } + + private Cache cache = new Cache(); + + /** * Initialize the component. */ @Init @@ -199,15 +216,37 @@ 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); 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 (IOException e) { + throw new ContributionReadException(e); } catch (ContributionResolveException e) { throw new ContributionReadException(e); } Modified: incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/ContributionCollectionImpl.java URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/ContributionCollectionImpl.java?rev=662176&r1=662175&r2=662176&view=diff ============================================================================== --- incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/ContributionCollectionImpl.java (original) +++ incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/ContributionCollectionImpl.java Sun Jun 1 01:38:08 2008 @@ -22,6 +22,7 @@ import static org.apache.tuscany.sca.domain.manager.impl.DomainManagerUtil.DEPLOYMENT_CONTRIBUTION_URI; import static org.apache.tuscany.sca.domain.manager.impl.DomainManagerUtil.compositeSimpleTitle; import static org.apache.tuscany.sca.domain.manager.impl.DomainManagerUtil.compositeSourceLink; +import static org.apache.tuscany.sca.domain.manager.impl.DomainManagerUtil.lastModified; import static org.apache.tuscany.sca.domain.manager.impl.DomainManagerUtil.locationURL; import java.io.ByteArrayInputStream; @@ -33,7 +34,9 @@ import java.net.URI; import java.net.URL; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.logging.Logger; import javax.xml.namespace.QName; @@ -57,6 +60,7 @@ import org.apache.tuscany.sca.contribution.service.ContributionReadException; import org.apache.tuscany.sca.core.ExtensionPointRegistry; import org.apache.tuscany.sca.core.UtilityExtensionPoint; +import org.apache.tuscany.sca.domain.manager.impl.ContributionCollectionImpl.Cache.ContributionCache; import org.apache.tuscany.sca.implementation.data.collection.Entry; import org.apache.tuscany.sca.implementation.data.collection.Item; import org.apache.tuscany.sca.implementation.data.collection.ItemCollection; @@ -109,6 +113,22 @@ private DocumentBuilder documentBuilder; /** + * Cache workspace and contribution models. + */ + static class Cache { + private Workspace workspace; + private long workspaceLastModified; + + static class ContributionCache { + private Contribution contribution; + private long contributionLastModified; + } + private Map contributions = new HashMap(); + } + + private Cache cache = new Cache(); + + /** * Initialize the component. */ @Init @@ -392,16 +412,35 @@ Workspace workspace; File file = new File(rootDirectory + "/" + workspaceFile); if (file.exists()) { - try { - FileInputStream is = new FileInputStream(file); - XMLStreamReader reader = inputFactory.createXMLStreamReader(is); - reader.nextTag(); - workspace = (Workspace)staxProcessor.read(reader); - } catch (Exception e) { - throw new ServiceRuntimeException(e); + + // Get workspace from cache + if (cache.workspace != null && file.lastModified() == cache.workspaceLastModified) { + workspace = cache.workspace; + + } else { + + try { + FileInputStream is = new FileInputStream(file); + XMLStreamReader reader = inputFactory.createXMLStreamReader(is); + reader.nextTag(); + workspace = (Workspace)staxProcessor.read(reader); + } catch (Exception e) { + throw new ServiceRuntimeException(e); + } + + // Cache workspace + cache.workspaceLastModified = file.lastModified(); + cache.workspace = workspace; } + } else { + + // Create new workspace workspace = workspaceFactory.createWorkspace(); + + // Cache workspace + cache.workspaceLastModified = 0; + cache.workspace = workspace; } // Make sure that the workspace contains the cloud contribution @@ -420,6 +459,7 @@ contribution.setLocation(cloudDirectory.toURI().toString()); workspace.getContributions().add(contribution); } + return workspace; } @@ -444,10 +484,16 @@ format.setIndent(2); // Write to workspace.xml - FileOutputStream os = new FileOutputStream(new File(rootDirectory + "/" + workspaceFile)); + File file = new File(rootDirectory + "/" + workspaceFile); + FileOutputStream os = new FileOutputStream(file); XMLSerializer serializer = new XMLSerializer(os, format); serializer.serialize(document); os.close(); + + // Cache workspace + cache.workspace = workspace; + cache.workspaceLastModified = file.lastModified(); + } catch (Exception e) { throw new ServiceRuntimeException(e); } @@ -461,27 +507,51 @@ * @return */ private Workspace readContributions(Workspace workspace) { - Workspace dependencyWorkspace = workspaceFactory.createWorkspace(); + + Workspace contributions = workspaceFactory.createWorkspace(); try { for (Contribution c: workspace.getContributions()) { URI uri = URI.create(c.getURI()); - URL url = locationURL(c.getLocation()); + URL location = locationURL(c.getLocation()); + + // Get contribution from cache + ContributionCache contributionCache = cache.contributions.get(location); + long lastModified = lastModified(location); + if (contributionCache != null) { + if (contributionCache.contributionLastModified == lastModified) { + Contribution contribution = contributionCache.contribution; + contribution.setUnresolved(false); + contributions.getContributions().add(contribution); + continue; + } + + // Reset contribution cache + cache.contributions.remove(location); + } + try { - Contribution contribution = (Contribution)contributionProcessor.read(null, uri, url); + Contribution contribution = (Contribution)contributionProcessor.read(null, uri, location); contribution.setUnresolved(false); - dependencyWorkspace.getContributions().add(contribution); + contributions.getContributions().add(contribution); + + // Cache contribution + contributionCache = new ContributionCache(); + contributionCache.contribution = contribution; + contributionCache.contributionLastModified = lastModified; + cache.contributions.put(location, contributionCache); + } catch (ContributionReadException e) { Contribution contribution = contributionFactory.createContribution(); contribution.setURI(c.getURI()); contribution.setLocation(c.getLocation()); contribution.setUnresolved(true); - dependencyWorkspace.getContributions().add(contribution); + contributions.getContributions().add(contribution); } } } catch (Exception e) { throw new ServiceRuntimeException(e); } - return dependencyWorkspace; + return contributions; } } Modified: incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/DeployableCompositeCollectionImpl.java URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/DeployableCompositeCollectionImpl.java?rev=662176&r1=662175&r2=662176&view=diff ============================================================================== --- incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/DeployableCompositeCollectionImpl.java (original) +++ incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/DeployableCompositeCollectionImpl.java Sun Jun 1 01:38:08 2008 @@ -25,13 +25,16 @@ import static org.apache.tuscany.sca.domain.manager.impl.DomainManagerUtil.compositeSourceLink; import static org.apache.tuscany.sca.domain.manager.impl.DomainManagerUtil.compositeTitle; import static org.apache.tuscany.sca.domain.manager.impl.DomainManagerUtil.contributionURI; +import static org.apache.tuscany.sca.domain.manager.impl.DomainManagerUtil.lastModified; import static org.apache.tuscany.sca.domain.manager.impl.DomainManagerUtil.locationURL; import java.net.MalformedURLException; import java.net.URI; import java.net.URL; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.logging.Logger; import javax.xml.namespace.QName; @@ -57,6 +60,7 @@ 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.domain.manager.impl.DeployableCompositeCollectionImpl.Cache.ContributionCache; import org.apache.tuscany.sca.implementation.data.collection.Entry; import org.apache.tuscany.sca.implementation.data.collection.Item; import org.apache.tuscany.sca.implementation.data.collection.ItemCollection; @@ -98,6 +102,19 @@ private Monitor monitor; /** + * Cache contribution models. + */ + static class Cache { + static class ContributionCache { + private Contribution contribution; + private long contributionLastModified; + } + private Map contributions = new HashMap(); + } + + private Cache cache = new Cache(); + + /** * Initialize the component. */ @Init @@ -252,9 +269,29 @@ 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); 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) { Modified: incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/DeployedCompositeCollectionImpl.java URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/DeployedCompositeCollectionImpl.java?rev=662176&r1=662175&r2=662176&view=diff ============================================================================== --- incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/DeployedCompositeCollectionImpl.java (original) +++ incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/DeployedCompositeCollectionImpl.java Sun Jun 1 01:38:08 2008 @@ -114,6 +114,16 @@ private DocumentBuilder documentBuilder; /** + * Cache domain composite model. + */ + static class Cache { + private Composite compositeCollection; + private long compositeCollectionLastModified; + } + + private Cache cache = new Cache(); + + /** * Initialize the component. */ @Init @@ -352,14 +362,27 @@ Composite compositeCollection; File file = new File(rootDirectory + "/" + compositeFile); if (file.exists()) { - XMLInputFactory inputFactory = modelFactories.getFactory(XMLInputFactory.class); - try { - FileInputStream is = new FileInputStream(file); - XMLStreamReader reader = inputFactory.createXMLStreamReader(is); - compositeCollection = compositeProcessor.read(reader); - } catch (Exception e) { - throw new ServiceRuntimeException(e); + + // Get composite collection from cache + if (cache.compositeCollection != null && file.lastModified() == cache.compositeCollectionLastModified) { + compositeCollection = cache.compositeCollection; + + } else { + + XMLInputFactory inputFactory = modelFactories.getFactory(XMLInputFactory.class); + try { + FileInputStream is = new FileInputStream(file); + XMLStreamReader reader = inputFactory.createXMLStreamReader(is); + compositeCollection = compositeProcessor.read(reader); + } catch (Exception e) { + throw new ServiceRuntimeException(e); + } + + // Cache composite collection + cache.compositeCollectionLastModified = file.lastModified(); + cache.compositeCollection = compositeCollection; } + } else { compositeCollection = assemblyFactory.createComposite(); String name; @@ -370,6 +393,10 @@ name = compositeFile; } compositeCollection.setName(new QName(Constants.SCA10_TUSCANY_NS, name)); + + // Cache composite collection + cache.compositeCollectionLastModified = 0; + cache.compositeCollection = compositeCollection; } return compositeCollection; } @@ -395,9 +422,15 @@ format.setIndent(2); // Write to domain.composite - FileOutputStream os = new FileOutputStream(new File(rootDirectory + "/" + compositeFile)); + File file = new File(rootDirectory + "/" + compositeFile); + FileOutputStream os = new FileOutputStream(file); XMLSerializer serializer = new XMLSerializer(os, format); serializer.serialize(document); + + // Cache composite collection + cache.compositeCollection = compositeCollection; + cache.compositeCollectionLastModified = file.lastModified(); + } catch (Exception e) { throw new ServiceRuntimeException(e); } Modified: incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/DomainManagerUtil.java URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/DomainManagerUtil.java?rev=662176&r1=662175&r2=662176&view=diff ============================================================================== --- incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/DomainManagerUtil.java (original) +++ incubator/tuscany/java/sca/modules/domain-manager/src/main/java/org/apache/tuscany/sca/domain/manager/impl/DomainManagerUtil.java Sun Jun 1 01:38:08 2008 @@ -20,9 +20,11 @@ package org.apache.tuscany.sca.domain.manager.impl; import java.io.File; +import java.io.IOException; import java.net.MalformedURLException; import java.net.URI; import java.net.URL; +import java.net.URLConnection; import javax.xml.namespace.QName; @@ -239,4 +241,44 @@ } } + /** + * Returns the last modified time of the content at the given URL. + * + * @param url + * @return + * @throws IOException + */ + static long lastModified(URL url) throws IOException { + + if (url.getProtocol() == null || "file".equals(url.getProtocol())) { + return lastModified(new File(url.getPath())); + } else { + URLConnection connection = url.openConnection(); + long lastModified = connection.getLastModified(); + return lastModified; + } + } + + /** + * Returns the last modified time of the given file or directory. + * + * @param file + * @return + */ + static long lastModified(File file) { + if (file.isDirectory()) { + long lastModified = file.lastModified(); + + for (File child: file.listFiles()) { + long m = lastModified(child); + if (m > lastModified) { + lastModified = m; + } + } + return lastModified; + + } else { + return file.lastModified(); + } + } }