You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by bd...@apache.org on 2008/11/04 13:17:39 UTC
svn commit: r711237 - in /incubator/sling/trunk/extensions/jcrinstall/src:
main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/
main/java/org/apache/sling/jcr/jcrinstall/osgi/
main/java/org/apache/sling/jcr/jcrinstall/osgi/impl/
test/java/org/apache/sli...
Author: bdelacretaz
Date: Tue Nov 4 04:17:38 2008
New Revision: 711237
URL: http://svn.apache.org/viewvc?rev=711237&view=rev
Log:
SLING-719 - provide for non-file data via InstallableData
Added:
incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/osgi/InstallableData.java (with props)
incubator/sling/trunk/extensions/jcrinstall/src/test/java/org/apache/sling/jcr/jcrinstall/osgi/impl/MockInstallableData.java (with props)
Modified:
incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/FileDataProvider.java
incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/WatchedFolder.java
incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/osgi/OsgiController.java
incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/osgi/OsgiResourceProcessor.java
incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/osgi/impl/BundleResourceProcessor.java
incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/osgi/impl/ConfigResourceProcessor.java
incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/osgi/impl/OsgiControllerImpl.java
incubator/sling/trunk/extensions/jcrinstall/src/test/java/org/apache/sling/jcr/jcrinstall/jcr/impl/ContentHelper.java
incubator/sling/trunk/extensions/jcrinstall/src/test/java/org/apache/sling/jcr/jcrinstall/jcr/impl/ResourceDetectionTest.java
incubator/sling/trunk/extensions/jcrinstall/src/test/java/org/apache/sling/jcr/jcrinstall/osgi/impl/BundleResourceProcessorTest.java
Modified: incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/FileDataProvider.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/FileDataProvider.java?rev=711237&r1=711236&r2=711237&view=diff
==============================================================================
--- incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/FileDataProvider.java (original)
+++ incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/FileDataProvider.java Tue Nov 4 04:17:38 2008
@@ -23,11 +23,13 @@
import javax.jcr.Node;
import javax.jcr.RepositoryException;
+import org.apache.sling.jcr.jcrinstall.osgi.InstallableData;
+
/** Provides data (InputStream, last modified data) about
* JCR nodes which are files.
* TODO: Yes, this should be a generic JCR utility.
*/
-class FileDataProvider {
+class FileDataProvider implements InstallableData {
/**
* The relative path of the data and last modified date of an nt:file node
*/
@@ -37,13 +39,13 @@
public static final String JCR_CONTENT_LAST_MODIFIED = JCR_CONTENT + "/" + JCR_LAST_MODIFIED;
private final InputStream inputStream;
- private final long lastModified;
+ private final String digest;
FileDataProvider(Node n) throws RepositoryException {
if (n.hasProperty(JCR_CONTENT_LAST_MODIFIED)) {
- lastModified = n.getProperty(JCR_CONTENT_LAST_MODIFIED).getDate().getTimeInMillis();
+ digest = String.valueOf(n.getProperty(JCR_CONTENT_LAST_MODIFIED).getDate().getTimeInMillis());
} else {
- lastModified = -1;
+ digest = null;
}
if(n.hasProperty(JCR_CONTENT_DATA)) {
@@ -54,14 +56,22 @@
}
boolean isFile() {
- return inputStream != null && lastModified != -1;
+ return inputStream != null && digest != null;
}
InputStream getInputStream() {
return inputStream;
}
- long getLastModified() {
- return lastModified;
+ @SuppressWarnings("unchecked")
+ public <AdapterType> AdapterType adaptTo(Class<AdapterType> type) {
+ if(type.equals(InputStream.class)) {
+ return (AdapterType)inputStream;
+ }
+ return null;
+ }
+
+ public String getDigest() {
+ return digest;
}
-}
+}
\ No newline at end of file
Modified: incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/WatchedFolder.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/WatchedFolder.java?rev=711237&r1=711236&r2=711237&view=diff
==============================================================================
--- incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/WatchedFolder.java (original)
+++ incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/WatchedFolder.java Tue Nov 4 04:17:38 2008
@@ -158,20 +158,10 @@
}
} else {
// a single failure must not block the whole thing (SLING-655)
- InputStream is = null;
try {
- is = dp.getInputStream();
- installOrUpdate(n.getPath(), is, dp.getLastModified());
+ installOrUpdate(n.getPath(), dp);
} catch(JcrInstallException jie) {
log.warn("Failed to install resource " + n.getPath(), jie);
- } finally {
- if(is != null) {
- try {
- is.close();
- } catch(IOException ioe) {
- log.warn("IOException while closing stream of node " + n.getPath(), ioe);
- }
- }
}
}
}
@@ -196,14 +186,14 @@
}
/** Install or update the given resource, as needed */
- protected void installOrUpdate(String path, InputStream data, Long lastModified) throws IOException, JcrInstallException {
- final long currentLastModified = controller.getLastModified(path);
- if(currentLastModified == -1) {
+ protected void installOrUpdate(String path, FileDataProvider fdp) throws IOException, JcrInstallException {
+ final String digest = controller.getDigest(path);
+ if(digest == null) {
log.info("Resource {} was not installed yet, installing in OsgiController", path);
- controller.installOrUpdate(path, lastModified, data);
- } else if(currentLastModified < lastModified) {
+ controller.installOrUpdate(path, fdp);
+ } else if(!digest.equals(fdp.getDigest())) {
log.info("Resource {} has been updated, updating in OsgiController", path);
- controller.installOrUpdate(path, lastModified, data);
+ controller.installOrUpdate(path, fdp);
} else {
log.info("Resource {} not modified, ignoring", path);
}
Added: incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/osgi/InstallableData.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/osgi/InstallableData.java?rev=711237&view=auto
==============================================================================
--- incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/osgi/InstallableData.java (added)
+++ incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/osgi/InstallableData.java Tue Nov 4 04:17:38 2008
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.jcr.jcrinstall.osgi;
+
+/** A piece of data that can be installed by
+ * the OSGi controller.
+ */
+public interface InstallableData {
+ /** String that must change if the underlying data
+ * changes. Stored by the OsgiController when installing
+ * the data, meant to be used by the OsgiController client
+ * when deciding if the data needs to be updated.
+ */
+ String getDigest();
+
+ /** Adapt the underlying data to the provided type.
+ * @return null if cannot be adapted */
+ <AdapterType> AdapterType adaptTo(Class<AdapterType> type);
+}
Propchange: incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/osgi/InstallableData.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/osgi/InstallableData.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision Rev URL
Modified: incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/osgi/OsgiController.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/osgi/OsgiController.java?rev=711237&r1=711236&r2=711237&view=diff
==============================================================================
--- incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/osgi/OsgiController.java (original)
+++ incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/osgi/OsgiController.java Tue Nov 4 04:17:38 2008
@@ -19,7 +19,6 @@
package org.apache.sling.jcr.jcrinstall.osgi;
import java.io.IOException;
-import java.io.InputStream;
import java.util.Set;
/** jcrinstall component that installs/updates/removes
@@ -30,14 +29,12 @@
/** Install or update supplied resource
* @param uri Unique identifier for the resource
- * @param lastModified if the resource is installed, this is stored
- * and can be retrieved using getLastModified().
- * @param data resource contents
+ * @param data The data to install
* @return one of the {@link InstallResultCode} result codes.
*/
- int installOrUpdate(String uri, long lastModified, InputStream data) throws IOException, JcrInstallException;
+ int installOrUpdate(String uri, InstallableData data) throws IOException, JcrInstallException;
- /** Uninstall the resource that was installed via given uri
+ /** Uninstall the data that was installed via given uri
* @param uri Unique identifier for the resource
* @param attributes metadata stored by the OsgiController, will be
* removed after calling this method
@@ -53,5 +50,5 @@
* to by that uri was installed.
* @return -1 if we don't have info for given uri
*/
- long getLastModified(String uri);
+ String getDigest(String uri);
}
Modified: incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/osgi/OsgiResourceProcessor.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/osgi/OsgiResourceProcessor.java?rev=711237&r1=711236&r2=711237&view=diff
==============================================================================
--- incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/osgi/OsgiResourceProcessor.java (original)
+++ incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/osgi/OsgiResourceProcessor.java Tue Nov 4 04:17:38 2008
@@ -18,7 +18,6 @@
*/
package org.apache.sling.jcr.jcrinstall.osgi;
-import java.io.InputStream;
import java.util.Map;
@@ -34,10 +33,10 @@
* @param uri Unique identifier for the resource
* @param attributes metadata stored by the OsgiController, can be used to
* store additional information
- * @param data resource contents
+ * @param data The data to install
* @return one of the {@link InstallResultCode} result codes.
*/
- int installOrUpdate(String uri, Map<String, Object> attributes, InputStream data) throws Exception;
+ int installOrUpdate(String uri, Map<String, Object> attributes, InstallableData data) throws Exception;
/** Uninstall the resource that was installed via given uri
* @param uri Unique identifier for the resource
Modified: incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/osgi/impl/BundleResourceProcessor.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/osgi/impl/BundleResourceProcessor.java?rev=711237&r1=711236&r2=711237&view=diff
==============================================================================
--- incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/osgi/impl/BundleResourceProcessor.java (original)
+++ incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/osgi/impl/BundleResourceProcessor.java Tue Nov 4 04:17:38 2008
@@ -35,6 +35,7 @@
import java.util.jar.JarInputStream;
import java.util.jar.Manifest;
+import org.apache.sling.jcr.jcrinstall.osgi.InstallableData;
import org.apache.sling.jcr.jcrinstall.osgi.OsgiResourceProcessor;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
@@ -126,7 +127,13 @@
* java.util.Map, java.io.InputStream)
*/
public int installOrUpdate(String uri, Map<String, Object> attributes,
- InputStream data) throws BundleException, IOException {
+ InstallableData installableData) throws BundleException, IOException {
+
+ InputStream data = installableData.adaptTo(InputStream.class);
+ if(data == null) {
+ throw new IOException("InstallableData does not adapt to an InputStream: " + uri);
+ }
+
// Update if we already have a bundle id, else install
Bundle b = null;
boolean updated = false;
Modified: incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/osgi/impl/ConfigResourceProcessor.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/osgi/impl/ConfigResourceProcessor.java?rev=711237&r1=711236&r2=711237&view=diff
==============================================================================
--- incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/osgi/impl/ConfigResourceProcessor.java (original)
+++ incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/osgi/impl/ConfigResourceProcessor.java Tue Nov 4 04:17:38 2008
@@ -26,6 +26,8 @@
import java.util.Dictionary;
import java.util.Map;
+import org.apache.sling.jcr.jcrinstall.osgi.InstallableData;
+import org.apache.sling.jcr.jcrinstall.osgi.JcrInstallException;
import org.apache.sling.jcr.jcrinstall.osgi.OsgiResourceProcessor;
import org.osgi.framework.InvalidSyntaxException;
import org.osgi.service.cm.Configuration;
@@ -55,10 +57,22 @@
}
@SuppressWarnings("unchecked")
- public int installOrUpdate(String uri, Map<String, Object> attributes, InputStream data) throws Exception {
+ public int installOrUpdate(String uri, Map<String, Object> attributes,
+ InstallableData installableData) throws Exception {
- // Load configuration properties
- final Dictionary dict = reader.load(data);
+ // Convert data to a configuration Dictionary
+ Dictionary dict = installableData.adaptTo(Dictionary.class);
+ if(dict == null) {
+ InputStream data = installableData.adaptTo(InputStream.class);
+ if(data == null) {
+ throw new IOException("InstallableData does not adapt to an InputStream: " + uri);
+ }
+ dict = reader.load(data);
+ }
+
+ if(dict == null) {
+ throw new JcrInstallException("Null Dictionary for uri=" + uri);
+ }
// Get pids from node name
final ConfigurationPid pid = new ConfigurationPid(uri);
Modified: incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/osgi/impl/OsgiControllerImpl.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/osgi/impl/OsgiControllerImpl.java?rev=711237&r1=711236&r2=711237&view=diff
==============================================================================
--- incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/osgi/impl/OsgiControllerImpl.java (original)
+++ incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/osgi/impl/OsgiControllerImpl.java Tue Nov 4 04:17:38 2008
@@ -27,6 +27,7 @@
import java.util.Map;
import java.util.Set;
+import org.apache.sling.jcr.jcrinstall.osgi.InstallableData;
import org.apache.sling.jcr.jcrinstall.osgi.JcrInstallException;
import org.apache.sling.jcr.jcrinstall.osgi.OsgiController;
import org.apache.sling.jcr.jcrinstall.osgi.OsgiResourceProcessor;
@@ -72,8 +73,8 @@
/** @scr.reference */
private PackageAdmin packageAdmin;
- /** Storage key: last modified as a Long */
- public static final String KEY_LAST_MODIFIED = "last.modified";
+ /** Storage key: digest of an InstallableData */
+ public static final String KEY_DIGEST = "data.digest";
/** Default value for getLastModified() */
public static final long LAST_MODIFIED_NOT_FOUND = -1;
@@ -113,7 +114,7 @@
processors = null;
}
- public int installOrUpdate(String uri, long lastModified, InputStream data) throws IOException, JcrInstallException {
+ public int installOrUpdate(String uri, InstallableData data) throws IOException, JcrInstallException {
int result = IGNORED;
final OsgiResourceProcessor p = getProcessor(uri);
if (p != null) {
@@ -121,7 +122,7 @@
final Map<String, Object> map = storage.getMap(uri);
result = p.installOrUpdate(uri, map, data);
if (result != IGNORED) {
- map.put(KEY_LAST_MODIFIED, new Long(lastModified));
+ map.put(KEY_DIGEST, data.getDigest());
}
storage.saveToFile();
} catch(IOException ioe) {
@@ -151,17 +152,14 @@
}
/** {@inheritDoc}
- * @return LAST_MODIFIED_NOT_FOUND if uri not found
+ * @return null if uri not found
*/
- public long getLastModified(String uri) {
- long result = LAST_MODIFIED_NOT_FOUND;
+ public String getDigest(String uri) {
+ String result = null;
if(storage.contains(uri)) {
final Map<String, Object> uriData = storage.getMap(uri);
- final Long lastMod = (Long)uriData.get(KEY_LAST_MODIFIED);
- if(lastMod != null) {
- result = lastMod.longValue();
- }
+ result = (String)uriData.get(KEY_DIGEST);
}
return result;
}
Modified: incubator/sling/trunk/extensions/jcrinstall/src/test/java/org/apache/sling/jcr/jcrinstall/jcr/impl/ContentHelper.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/extensions/jcrinstall/src/test/java/org/apache/sling/jcr/jcrinstall/jcr/impl/ContentHelper.java?rev=711237&r1=711236&r2=711237&view=diff
==============================================================================
--- incubator/sling/trunk/extensions/jcrinstall/src/test/java/org/apache/sling/jcr/jcrinstall/jcr/impl/ContentHelper.java (original)
+++ incubator/sling/trunk/extensions/jcrinstall/src/test/java/org/apache/sling/jcr/jcrinstall/jcr/impl/ContentHelper.java Tue Nov 4 04:17:38 2008
@@ -25,6 +25,8 @@
import javax.jcr.RepositoryException;
import javax.jcr.Session;
+import org.apache.sling.jcr.jcrinstall.osgi.impl.MockInstallableData;
+
class ContentHelper {
public static final String NT_FOLDER = "nt:folder";
public static final String NT_FILE = "nt:file";
@@ -84,6 +86,10 @@
session.save();
}
+ void createOrUpdateFile(String path, MockInstallableData d) throws RepositoryException {
+ createOrUpdateFile(path, d.adaptTo(InputStream.class), d.getLastModified());
+ }
+
void createOrUpdateFile(String path, InputStream data, long lastModified) throws RepositoryException {
final String relPath = path.substring(1);
Node f = null;
Modified: incubator/sling/trunk/extensions/jcrinstall/src/test/java/org/apache/sling/jcr/jcrinstall/jcr/impl/ResourceDetectionTest.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/extensions/jcrinstall/src/test/java/org/apache/sling/jcr/jcrinstall/jcr/impl/ResourceDetectionTest.java?rev=711237&r1=711236&r2=711237&view=diff
==============================================================================
--- incubator/sling/trunk/extensions/jcrinstall/src/test/java/org/apache/sling/jcr/jcrinstall/jcr/impl/ResourceDetectionTest.java (original)
+++ incubator/sling/trunk/extensions/jcrinstall/src/test/java/org/apache/sling/jcr/jcrinstall/jcr/impl/ResourceDetectionTest.java Tue Nov 4 04:17:38 2008
@@ -31,13 +31,13 @@
import org.apache.sling.commons.testing.jcr.RepositoryTestBase;
import org.apache.sling.jcr.api.SlingRepository;
+import org.apache.sling.jcr.jcrinstall.osgi.InstallableData;
import org.apache.sling.jcr.jcrinstall.osgi.JcrInstallException;
import org.apache.sling.jcr.jcrinstall.osgi.OsgiController;
+import org.apache.sling.jcr.jcrinstall.osgi.impl.MockInstallableData;
import org.jmock.Expectations;
import org.jmock.Mockery;
import org.jmock.Sequence;
-import org.osgi.framework.BundleContext;
-import org.osgi.service.component.ComponentContext;
/** Test that added/updated/removed resources are
* correctly translated to OsgiController calls.
@@ -85,8 +85,8 @@
final String dummyJar = "/libs/foo/bar/install/dummy.jar";
final InputStream data = new ByteArrayInputStream(dummyJar.getBytes());
- final long lastModifiedA = System.currentTimeMillis();
- final long lastModifiedB = lastModifiedA + 1;
+ final MockInstallableData da = new MockInstallableData("a");
+ final MockInstallableData db = new MockInstallableData("b");
final Set<String> installedUri = new HashSet<String>();
final OsgiController c = mockery.mock(OsgiController.class);
@@ -95,23 +95,23 @@
mockery.checking(new Expectations() {{
allowing(c).getInstalledUris(); will(returnValue(installedUri));
- one(c).getLastModified("phase1");
+ one(c).getDigest("phase1");
inSequence(sequence);
- one(c).getLastModified(dummyJar); will(returnValue(-1L));
+ one(c).getDigest(dummyJar); will(returnValue(null));
inSequence(sequence);
- one(c).installOrUpdate(with(equal(dummyJar)), with(equal(lastModifiedA)), with(any(InputStream.class)));
+ one(c).installOrUpdate(with(equal(dummyJar)), with(any(InstallableData.class)));
inSequence(sequence);
- one(c).getLastModified("phase2");
+ one(c).getDigest("phase2");
inSequence(sequence);
- one(c).getLastModified(dummyJar); will(returnValue(lastModifiedA));
+ one(c).getDigest(dummyJar); will(returnValue(da.getDigest()));
inSequence(sequence);
- one(c).getLastModified("phase3");
+ one(c).getDigest("phase3");
inSequence(sequence);
- one(c).getLastModified(dummyJar); will(returnValue(lastModifiedA));
+ one(c).getDigest(dummyJar); will(returnValue(da.getDigest()));
inSequence(sequence);
- one(c).installOrUpdate(with(equal(dummyJar)), with(equal(lastModifiedB)), with(any(InputStream.class)));
+ one(c).installOrUpdate(with(equal(dummyJar)), with(any(InstallableData.class)));
inSequence(sequence);
}});
@@ -119,21 +119,21 @@
ro.activate(null);
// Add two files, run one cycle must install the bundles
- c.getLastModified("phase1");
- contentHelper.createOrUpdateFile(dummyJar, data, lastModifiedA);
+ c.getDigest("phase1");
+ contentHelper.createOrUpdateFile(dummyJar, da);
eventHelper.waitForEvents(5000L);
ro.runOneCycle();
installedUri.add(dummyJar);
// Updating with the same timestamp must not call install again
- c.getLastModified("phase2");
- contentHelper.createOrUpdateFile(dummyJar, data, lastModifiedA);
+ c.getDigest("phase2");
+ contentHelper.createOrUpdateFile(dummyJar, da);
eventHelper.waitForEvents(5000L);
ro.runOneCycle();
// Updating with a new timestamp must call install again
- c.getLastModified("phase3");
- contentHelper.createOrUpdateFile(dummyJar, data, lastModifiedB);
+ c.getDigest("phase3");
+ contentHelper.createOrUpdateFile(dummyJar, db);
eventHelper.waitForEvents(5000L);
ro.runOneCycle();
@@ -149,17 +149,17 @@
"/libs/foo/bar/install/dummy.dp"
};
final InputStream data = new ByteArrayInputStream("hello".getBytes());
- final long lastModifiedA = System.currentTimeMillis();
+ final MockInstallableData da = new MockInstallableData("a");
final Set<String> installedUri = new HashSet<String>();
final OsgiController c = mockery.mock(OsgiController.class);
// Define the whole sequence of calls to OsgiController,
mockery.checking(new Expectations() {{
allowing(c).getInstalledUris(); will(returnValue(installedUri));
- allowing(c).getLastModified(with(any(String.class))); will(returnValue(-1L));
- one(c).installOrUpdate(with(equal(resources[0])), with(equal(lastModifiedA)), with(any(InputStream.class)));
- one(c).installOrUpdate(with(equal(resources[1])), with(equal(lastModifiedA)), with(any(InputStream.class)));
- one(c).installOrUpdate(with(equal(resources[2])), with(equal(lastModifiedA)), with(any(InputStream.class)));
+ allowing(c).getDigest(with(any(String.class))); will(returnValue(null));
+ one(c).installOrUpdate(with(equal(resources[0])), with(any(InstallableData.class)));
+ one(c).installOrUpdate(with(equal(resources[1])), with(any(InstallableData.class)));
+ one(c).installOrUpdate(with(equal(resources[2])), with(any(InstallableData.class)));
}});
final RepositoryObserver ro = new MockRepositoryObserver(repo, c);
@@ -167,7 +167,7 @@
// Add files, run one cycle must install the bundles
for(String file : resources) {
- contentHelper.createOrUpdateFile(file, data, lastModifiedA);
+ contentHelper.createOrUpdateFile(file, da);
}
eventHelper.waitForEvents(5000L);
ro.runOneCycle();
@@ -191,26 +191,26 @@
};
final InputStream data = new ByteArrayInputStream("hello".getBytes());
- final long lastModifiedA = System.currentTimeMillis();
+ final MockInstallableData da = new MockInstallableData("a");
final Set<String> installedUri = new HashSet<String>();
final OsgiController c = mockery.mock(OsgiController.class);
mockery.checking(new Expectations() {{
allowing(c).getInstalledUris(); will(returnValue(installedUri));
- allowing(c).getLastModified(with(any(String.class))); will(returnValue(-1L));
- one(c).installOrUpdate(with(equal(resources[0])), with(equal(lastModifiedA)), with(any(InputStream.class)));
- one(c).installOrUpdate(with(equal(resources[1])), with(equal(lastModifiedA)), with(any(InputStream.class)));
- one(c).installOrUpdate(with(equal(resources[2])), with(equal(lastModifiedA)), with(any(InputStream.class)));
+ allowing(c).getDigest(with(any(String.class))); will(returnValue(null));
+ one(c).installOrUpdate(with(equal(resources[0])), with(any(InstallableData.class)));
+ one(c).installOrUpdate(with(equal(resources[1])), with(any(InstallableData.class)));
+ one(c).installOrUpdate(with(equal(resources[2])), with(any(InstallableData.class)));
}});
final RepositoryObserver ro = new MockRepositoryObserver(repo, c);
ro.activate(null);
for(String file : resources) {
- contentHelper.createOrUpdateFile(file, data, lastModifiedA);
+ contentHelper.createOrUpdateFile(file, da);
}
for(String file : ignored) {
- contentHelper.createOrUpdateFile(file, data, lastModifiedA);
+ contentHelper.createOrUpdateFile(file, da);
}
eventHelper.waitForEvents(5000L);
@@ -231,7 +231,7 @@
mockery.checking(new Expectations() {{
allowing(c).getInstalledUris(); will(returnValue(installedUri));
- allowing(c).getLastModified(with(any(String.class))); will(returnValue(-1L));
+ allowing(c).getDigest(with(any(String.class))); will(returnValue(null));
one(c).uninstall("/libs/foo/bar/install/dummy.jar");
one(c).uninstall("/libs/foo/bar/install/dummy.cfg");
one(c).uninstall("/libs/watchfolder-is-gone/install/gone.cfg");
@@ -255,7 +255,7 @@
mockery.checking(new Expectations() {{
allowing(c).getInstalledUris(); will(returnValue(installedUri));
- allowing(c).getLastModified(with(any(String.class))); will(returnValue(-1L));
+ allowing(c).getDigest(with(any(String.class))); will(returnValue(null));
one(c).uninstall("/libs/foo/bar/install/dummy.cfg");
inSequence(sequence);
one(c).uninstall("/libs/foo/bar/install/dummy.dp");
@@ -281,18 +281,18 @@
"/libs/foo/bar/install/dummy.dp"
};
final InputStream data = new ByteArrayInputStream("hello".getBytes());
- final long lastModifiedA = System.currentTimeMillis();
+ final MockInstallableData da = new MockInstallableData("a");
final Set<String> installedUri = new HashSet<String>();
final OsgiController c = mockery.mock(OsgiController.class);
// Define the whole sequence of calls to OsgiController,
mockery.checking(new Expectations() {{
allowing(c).getInstalledUris(); will(returnValue(installedUri));
- allowing(c).getLastModified(with(any(String.class))); will(returnValue(-1L));
- one(c).installOrUpdate(with(equal(resources[0])), with(equal(lastModifiedA)), with(any(InputStream.class)));
- one(c).installOrUpdate(with(equal(resources[1])), with(equal(lastModifiedA)), with(any(InputStream.class)));
+ allowing(c).getDigest(with(any(String.class))); will(returnValue(null));
+ one(c).installOrUpdate(with(equal(resources[0])), with(any(InstallableData.class)));
+ one(c).installOrUpdate(with(equal(resources[1])), with(any(InstallableData.class)));
will(throwException(new JcrInstallException("Fake BundleException for testing")));
- one(c).installOrUpdate(with(equal(resources[2])), with(equal(lastModifiedA)), with(any(InputStream.class)));
+ one(c).installOrUpdate(with(equal(resources[2])), with(any(InstallableData.class)));
}});
final RepositoryObserver ro = new MockRepositoryObserver(repo, c);
@@ -300,7 +300,7 @@
// Add files, run one cycle must install the bundles
for(String file : resources) {
- contentHelper.createOrUpdateFile(file, data, lastModifiedA);
+ contentHelper.createOrUpdateFile(file, da);
}
eventHelper.waitForEvents(5000L);
ro.runOneCycle();
@@ -321,11 +321,10 @@
"/libs/foo/wii/install/more.cfg",
};
- final InputStream data = new ByteArrayInputStream("hello".getBytes());
- final long lastModifiedA = System.currentTimeMillis();
+ final MockInstallableData da = new MockInstallableData("a");
for(String file : resources) {
- contentHelper.createOrUpdateFile(file, data, lastModifiedA);
+ contentHelper.createOrUpdateFile(file, da);
}
final Set<String> installedUri = new HashSet<String>();
@@ -335,9 +334,9 @@
// Test with first regexp
mockery.checking(new Expectations() {{
allowing(c).getInstalledUris(); will(returnValue(installedUri));
- allowing(c).getLastModified(with(any(String.class))); will(returnValue(-1L));
- one(c).installOrUpdate(with(equal(resources[0])), with(equal(lastModifiedA)), with(any(InputStream.class)));
- one(c).installOrUpdate(with(equal(resources[2])), with(equal(lastModifiedA)), with(any(InputStream.class)));
+ allowing(c).getDigest(with(any(String.class))); will(returnValue(null));
+ one(c).installOrUpdate(with(equal(resources[0])), with(any(InstallableData.class)));
+ one(c).installOrUpdate(with(equal(resources[2])), with(any(InstallableData.class)));
}});
final MockRepositoryObserver ro = new MockRepositoryObserver(repo, c, serviceDataFile);
@@ -346,7 +345,7 @@
ro.activate(null);
ro.handleInitialUninstalls();
for(String file : resources) {
- contentHelper.createOrUpdateFile(file, data, lastModifiedA);
+ contentHelper.createOrUpdateFile(file, da);
}
eventHelper.waitForEvents(5000L);
ro.runOneCycle();
@@ -357,18 +356,18 @@
// Test with a different regexp, install.A resources must be uninstalled
mockery.checking(new Expectations() {{
allowing(c).getInstalledUris(); will(returnValue(installedUri));
- allowing(c).getLastModified(with(any(String.class))); will(returnValue(-1L));
+ allowing(c).getDigest(with(any(String.class))); will(returnValue(null));
one(c).uninstall(resources[0]);
one(c).uninstall(resources[2]);
- one(c).installOrUpdate(with(equal(resources[1])), with(equal(lastModifiedA)), with(any(InputStream.class)));
- one(c).installOrUpdate(with(equal(resources[3])), with(equal(lastModifiedA)), with(any(InputStream.class)));
+ one(c).installOrUpdate(with(equal(resources[1])), with(any(InstallableData.class)));
+ one(c).installOrUpdate(with(equal(resources[3])), with(any(InstallableData.class)));
}});
props.setProperty(RepositoryObserver.FOLDER_NAME_REGEXP_PROPERTY, ".*foo/wii/install$");
ro.activate(null);
ro.handleInitialUninstalls();
for(String file : resources) {
- contentHelper.createOrUpdateFile(file, data, lastModifiedA);
+ contentHelper.createOrUpdateFile(file, da);
}
eventHelper.waitForEvents(5000L);
ro.runOneCycle();
Modified: incubator/sling/trunk/extensions/jcrinstall/src/test/java/org/apache/sling/jcr/jcrinstall/osgi/impl/BundleResourceProcessorTest.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/extensions/jcrinstall/src/test/java/org/apache/sling/jcr/jcrinstall/osgi/impl/BundleResourceProcessorTest.java?rev=711237&r1=711236&r2=711237&view=diff
==============================================================================
--- incubator/sling/trunk/extensions/jcrinstall/src/test/java/org/apache/sling/jcr/jcrinstall/osgi/impl/BundleResourceProcessorTest.java (original)
+++ incubator/sling/trunk/extensions/jcrinstall/src/test/java/org/apache/sling/jcr/jcrinstall/osgi/impl/BundleResourceProcessorTest.java Tue Nov 4 04:17:38 2008
@@ -25,13 +25,11 @@
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
-import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
-import java.util.LinkedList;
-import java.util.List;
+import org.apache.sling.jcr.jcrinstall.osgi.InstallableData;
import org.jmock.Expectations;
import org.jmock.Mockery;
import org.jmock.Sequence;
@@ -75,8 +73,8 @@
final Bundle b = mockery.mock(Bundle.class);
final long bundleId = 1234;
final String uri = "/test/bundle.jar";
- final InputStream data = new ByteArrayInputStream(uri.getBytes());
- long lastModified = System.currentTimeMillis();
+ final MockInstallableData data = new MockInstallableData(uri);
+ final InputStream is = data.adaptTo(InputStream.class);
// We'll try installing a bundle, re-installing to cause
// it to be updated, and removing
@@ -87,7 +85,7 @@
will(returnValue(bundleId));
allowing(bc).addFrameworkListener(with(any(FrameworkListener.class)));
- one(bc).installBundle(OsgiControllerImpl.getResourceLocation(uri), data);
+ one(bc).installBundle(OsgiControllerImpl.getResourceLocation(uri), is);
inSequence(sequence);
will(returnValue(b));
@@ -98,7 +96,7 @@
one(b).stop();
inSequence(sequence);
- one(b).update(data);
+ one(b).update(is);
inSequence(sequence);
one(b).uninstall();
@@ -110,25 +108,25 @@
Utilities.setProcessors(c, p);
assertFalse("Before install, uri must not be in list", c.getInstalledUris().contains(uri));
- assertEquals("First install returns INSTALLED", INSTALLED, c.installOrUpdate(uri, lastModified, data));
+ assertEquals("First install returns INSTALLED", INSTALLED, c.installOrUpdate(uri, data));
assertTrue("After install, uri must be in list", c.getInstalledUris().contains(uri));
- assertEquals("LastModified must have been stored", lastModified, c.getLastModified(uri));
+ assertEquals("Digest must have been stored", data.getDigest(), c.getDigest(uri));
assertEquals("Storage data has been saved during install", 1, s.saveCounter);
- lastModified = System.currentTimeMillis();
- assertEquals("Second install returns UPDATED", UPDATED, c.installOrUpdate(uri, lastModified, data));
+ data.setDigest("digest is now different");
+ assertEquals("Second install returns UPDATED", UPDATED, c.installOrUpdate(uri, data));
assertTrue("After update, uri must be in list", c.getInstalledUris().contains(uri));
- assertEquals("LastModified must have been updated", lastModified, c.getLastModified(uri));
+ assertEquals("Digest must have been updated", data.getDigest(), c.getDigest(uri));
assertEquals("Storage data has been saved during update", 2, s.saveCounter);
c.uninstall(uri);
assertFalse("After uninstall, uri must not be in list", c.getInstalledUris().contains(uri));
- assertEquals("LastModified must be gone", -1, c.getLastModified(uri));
+ assertEquals("Digest must be gone", null, c.getDigest(uri));
assertFalse("After getLastModified, uri must not be in list", c.getInstalledUris().contains(uri));
assertEquals("Storage data has been saved during uninstall", 3, s.saveCounter);
final String nonJarUri = "no_jar_extension";
- assertEquals(nonJarUri + " must be ignored", c.installOrUpdate("", lastModified, data), IGNORED);
+ assertEquals(nonJarUri + " must be ignored", c.installOrUpdate("", data), IGNORED);
// And verify expectations
mockery.assertIsSatisfied();
Added: incubator/sling/trunk/extensions/jcrinstall/src/test/java/org/apache/sling/jcr/jcrinstall/osgi/impl/MockInstallableData.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/extensions/jcrinstall/src/test/java/org/apache/sling/jcr/jcrinstall/osgi/impl/MockInstallableData.java?rev=711237&view=auto
==============================================================================
--- incubator/sling/trunk/extensions/jcrinstall/src/test/java/org/apache/sling/jcr/jcrinstall/osgi/impl/MockInstallableData.java (added)
+++ incubator/sling/trunk/extensions/jcrinstall/src/test/java/org/apache/sling/jcr/jcrinstall/osgi/impl/MockInstallableData.java Tue Nov 4 04:17:38 2008
@@ -0,0 +1,55 @@
+package org.apache.sling.jcr.jcrinstall.osgi.impl;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+
+import org.apache.sling.jcr.jcrinstall.osgi.InstallableData;
+
+public class MockInstallableData implements InstallableData {
+
+ private final InputStream inputStream;
+ private long lastModified;
+ private String digest;
+ private static int counter;
+
+ public MockInstallableData(String uri) {
+ inputStream = new ByteArrayInputStream(uri.getBytes());
+ lastModified = System.currentTimeMillis() + counter;
+ counter++;
+ digest = String.valueOf(lastModified);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if(obj instanceof MockInstallableData) {
+ final MockInstallableData other = (MockInstallableData)obj;
+ return digest.equals(other.digest);
+ }
+ return false;
+ }
+
+ public long getLastModified() {
+ return lastModified;
+ }
+
+ @Override
+ public int hashCode() {
+ return digest.hashCode();
+ }
+
+ @SuppressWarnings("unchecked")
+ public <AdapterType> AdapterType adaptTo(Class<AdapterType> type) {
+ if(type.equals(InputStream.class)) {
+ return (AdapterType)inputStream;
+ }
+ return null;
+ }
+
+ void setDigest(String d) {
+ digest = d;
+ }
+
+ public String getDigest() {
+ return digest;
+ }
+}
Propchange: incubator/sling/trunk/extensions/jcrinstall/src/test/java/org/apache/sling/jcr/jcrinstall/osgi/impl/MockInstallableData.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/sling/trunk/extensions/jcrinstall/src/test/java/org/apache/sling/jcr/jcrinstall/osgi/impl/MockInstallableData.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision Rev URL