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 15:20:59 UTC
svn commit: r711260 - in /incubator/sling/trunk/extensions/jcrinstall: ./
src/main/java/org/apache/sling/jcr/jcrinstall/jcr/
src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/
src/main/java/org/apache/sling/jcr/jcrinstall/osgi/ src/main/java/org/a...
Author: bdelacretaz
Date: Tue Nov 4 06:20:58 2008
New Revision: 711260
URL: http://svn.apache.org/viewvc?rev=711260&view=rev
Log:
SLING-719 - support node-based configs
Added:
incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/NodeConverter.java (with props)
incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/ConfigInstallableData.java (with props)
incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/ConfigNodeConverter.java (with props)
incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/FileInstallableData.java (with props)
incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/FileNodeConverter.java (with props)
incubator/sling/trunk/extensions/jcrinstall/src/test/java/org/apache/sling/jcr/jcrinstall/jcr/impl/DigestTest.java (with props)
Modified:
incubator/sling/trunk/extensions/jcrinstall/pom.xml
incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/RegexpFilter.java
incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/RepositoryObserver.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/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/osgi/impl/OsgiControllerGetProcessorTest.java
Modified: incubator/sling/trunk/extensions/jcrinstall/pom.xml
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/extensions/jcrinstall/pom.xml?rev=711260&r1=711259&r2=711260&view=diff
==============================================================================
--- incubator/sling/trunk/extensions/jcrinstall/pom.xml (original)
+++ incubator/sling/trunk/extensions/jcrinstall/pom.xml Tue Nov 4 06:20:58 2008
@@ -55,6 +55,10 @@
<extensions>true</extensions>
<configuration>
<instructions>
+ <Export-Package>
+ org.apache.sling.jcr.jcrinstall.osgi,
+ org.apache.sling.jcr.jcrinstall.jcr
+ </Export-Package>
<Private-Package>org.apache.sling.jcr.jcrinstall.*</Private-Package>
</instructions>
</configuration>
@@ -103,6 +107,11 @@
<scope>test</scope>
</dependency>
<dependency>
+ <groupId>org.apache.sling</groupId>
+ <artifactId>org.apache.sling.runmode</artifactId>
+ <version>2.0.3-incubator-SNAPSHOT</version>
+ </dependency>
+ <dependency>
<groupId>org.jmock</groupId>
<artifactId>jmock-junit4</artifactId>
<scope>test</scope>
Added: incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/NodeConverter.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/NodeConverter.java?rev=711260&view=auto
==============================================================================
--- incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/NodeConverter.java (added)
+++ incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/NodeConverter.java Tue Nov 4 06:20:58 2008
@@ -0,0 +1,28 @@
+/*
+ * 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.jcr;
+
+import javax.jcr.Node;
+
+import org.apache.sling.jcr.jcrinstall.osgi.InstallableData;
+
+/** Convert a Node to InstallableData */
+public interface NodeConverter {
+ InstallableData convertNode(Node n) throws Exception;
+}
Propchange: incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/NodeConverter.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/NodeConverter.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision Rev URL
Added: incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/ConfigInstallableData.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/ConfigInstallableData.java?rev=711260&view=auto
==============================================================================
--- incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/ConfigInstallableData.java (added)
+++ incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/ConfigInstallableData.java Tue Nov 4 06:20:58 2008
@@ -0,0 +1,70 @@
+/*
+ * 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.jcr.impl;
+
+import java.io.ByteArrayOutputStream;
+import java.io.ObjectOutputStream;
+import java.math.BigInteger;
+import java.security.MessageDigest;
+import java.util.Dictionary;
+
+import org.apache.sling.jcr.jcrinstall.osgi.InstallableData;
+
+/** InstallableData that wraps a Dictionary */
+class ConfigInstallableData implements InstallableData {
+
+ private final Dictionary<String, Object> data;
+ private final String digest;
+
+ ConfigInstallableData(Dictionary<String, Object> data) throws Exception {
+ this.data = data;
+ digest = computeDigest(data);
+ }
+
+ @Override
+ public String toString() {
+ return getClass().getSimpleName() + ", digest=" + digest;
+ }
+
+ @SuppressWarnings("unchecked")
+ public <AdapterType> AdapterType adaptTo(Class<AdapterType> type) {
+ if(type.equals(Dictionary.class)) {
+ return (AdapterType)data;
+ }
+ return null;
+ }
+
+ public String getDigest() {
+ return digest;
+ }
+
+ /** Digest is needed to detect changes in data */
+ static String computeDigest(Dictionary<String, Object> data) throws Exception {
+ final String digestType = "MD5";
+ final MessageDigest d = MessageDigest.getInstance(digestType);
+ final ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ final ObjectOutputStream oos = new ObjectOutputStream(bos);
+ oos.writeObject(data);
+ bos.flush();
+ d.update(bos.toByteArray());
+ // convert to readable string (http://www.javalobby.org/java/forums/t84420.html)
+ final BigInteger bigInt = new BigInteger(1, d.digest());
+ return new String(bigInt.toString(16));
+ }
+}
\ No newline at end of file
Propchange: incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/ConfigInstallableData.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/ConfigInstallableData.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision Rev URL
Added: incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/ConfigNodeConverter.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/ConfigNodeConverter.java?rev=711260&view=auto
==============================================================================
--- incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/ConfigNodeConverter.java (added)
+++ incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/ConfigNodeConverter.java Tue Nov 4 06:20:58 2008
@@ -0,0 +1,147 @@
+/*
+ * 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.jcr.impl;
+
+import java.lang.reflect.Array;
+import java.util.Dictionary;
+import java.util.Hashtable;
+import java.util.SortedSet;
+import java.util.TreeSet;
+
+import javax.jcr.Node;
+import javax.jcr.Property;
+import javax.jcr.PropertyIterator;
+import javax.jcr.PropertyType;
+import javax.jcr.RepositoryException;
+import javax.jcr.Value;
+
+import org.apache.sling.jcr.jcrinstall.jcr.NodeConverter;
+import org.apache.sling.jcr.jcrinstall.osgi.InstallableData;
+import org.apache.sling.runmode.RunMode;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/** Converts configuration nodes to InstallableData, taking
+ * RunMode into account.
+ */
+class ConfigNodeConverter implements NodeConverter {
+
+ private final Logger log = LoggerFactory.getLogger(getClass());
+
+ /** TODO making this dynamic and optional would be better, but
+ * that would probably create issues at startup
+ * @scr.reference
+ */
+ private RunMode runMode;
+
+ /** Convert n to an InstallableData, or return null
+ * if we don't know how to convert it.
+ */
+ public InstallableData convertNode(Node n) throws Exception {
+ InstallableData result = null;
+
+ // TODO use a mixin to identify these nodes?
+ if(n.isNodeType("nt:unstructured")) {
+ final Dictionary<String, Object> config = load(n);
+ result = new ConfigInstallableData(config);
+ log.debug("Converted node {} to {}", n.getPath(), result);
+ }
+ return result;
+ }
+
+ /** Load config from node n */
+ protected Dictionary<String, Object> load(Node n) throws RepositoryException {
+ Dictionary<String, Object> result = new Hashtable<String, Object>();
+
+ log.debug("Loading config from Node {}", n.getPath());
+
+ // load default values from node itself
+ log.debug("Loading {} properties", n.getPath());
+ loadProperties(result, n);
+
+ if(runMode != null) {
+ final String [] modeStr = runMode.getCurrentRunModes();
+ final SortedSet<String> modes = new TreeSet<String>();
+ for(String s : modeStr) {
+ modes.add(s);
+ }
+ for(String mode : modes) {
+ if(n.hasNode(mode)) {
+ log.debug(
+ "Loading {}/{} properties for current run mode, overriding previous values",
+ n.getPath(), mode);
+ loadProperties(result, n.getNode(mode));
+ }
+ }
+ }
+
+ return result;
+ }
+
+ /** Load properties of n into d */
+ protected void loadProperties(Dictionary<String, Object> d, Node n) throws RepositoryException {
+ final PropertyIterator pi = n.getProperties();
+ while(pi.hasNext()) {
+ final Property p = pi.nextProperty();
+ final String name = p.getName();
+
+ // ignore jcr: and similar properties
+ if(name.contains(":")) {
+ continue;
+ }
+ if(p.getDefinition().isMultiple()) {
+ Object [] data = null;
+ final Value [] values = p.getValues();
+ int i = 0;
+ for(Value v : values) {
+ Object o = convertValue(v);
+ if(i == 0) {
+ data = (Object[])Array.newInstance(o.getClass(), values.length);
+ }
+ data[i++] = o;
+ }
+ d.put(name, data);
+
+ } else {
+ final Object o = convertValue(p.getValue());
+ if(o != null) {
+ d.put(name, o);
+ }
+ }
+ }
+ }
+
+ /** Convert v according to its type */
+ protected Object convertValue(Value v) throws RepositoryException {
+ switch(v.getType()) {
+ case PropertyType.STRING:
+ return v.getString();
+ case PropertyType.DATE:
+ return v.getDate();
+ case PropertyType.DOUBLE:
+ return v.getDouble();
+ case PropertyType.LONG:
+ return v.getLong();
+ case PropertyType.BOOLEAN:
+ return v.getBoolean();
+ }
+ log.debug("Value of type {} ignored", v.getType());
+ return null;
+ }
+}
\ No newline at end of file
Propchange: incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/ConfigNodeConverter.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/ConfigNodeConverter.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision Rev URL
Added: incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/FileInstallableData.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/FileInstallableData.java?rev=711260&view=auto
==============================================================================
--- incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/FileInstallableData.java (added)
+++ incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/FileInstallableData.java Tue Nov 4 06:20:58 2008
@@ -0,0 +1,79 @@
+/*
+ * 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.jcr.impl;
+
+import java.io.InputStream;
+
+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.
+ */
+class FileInstallableData implements InstallableData {
+ /**
+ * The relative path of the data and last modified date of an nt:file node
+ */
+ public static final String JCR_CONTENT = "jcr:content";
+ public static final String JCR_CONTENT_DATA = JCR_CONTENT + "/jcr:data";
+ public static final String JCR_LAST_MODIFIED = "jcr:lastModified";
+ public static final String JCR_CONTENT_LAST_MODIFIED = JCR_CONTENT + "/" + JCR_LAST_MODIFIED;
+
+ private final InputStream inputStream;
+ private final String digest;
+ private final String path;
+
+ @Override
+ public String toString() {
+ return getClass().getSimpleName() + ": " + path;
+ }
+
+ FileInstallableData(Node n) throws RepositoryException {
+ this.path = n.getPath();
+ if (n.hasProperty(JCR_CONTENT_LAST_MODIFIED)) {
+ digest = String.valueOf(n.getProperty(JCR_CONTENT_LAST_MODIFIED).getDate().getTimeInMillis());
+ } else {
+ digest = null;
+ }
+
+ if(n.hasProperty(JCR_CONTENT_DATA)) {
+ inputStream = n.getProperty(JCR_CONTENT_DATA).getStream();
+ } else {
+ inputStream = null;
+ }
+ }
+
+ InputStream getInputStream() {
+ return inputStream;
+ }
+
+ @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
Propchange: incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/FileInstallableData.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/FileInstallableData.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision Rev URL
Added: incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/FileNodeConverter.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/FileNodeConverter.java?rev=711260&view=auto
==============================================================================
--- incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/FileNodeConverter.java (added)
+++ incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/FileNodeConverter.java Tue Nov 4 06:20:58 2008
@@ -0,0 +1,33 @@
+package org.apache.sling.jcr.jcrinstall.jcr.impl;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+
+import org.apache.sling.jcr.jcrinstall.jcr.NodeConverter;
+import org.apache.sling.jcr.jcrinstall.osgi.InstallableData;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/** Convert a Node that is a file to a FileInstallableData */
+ public class FileNodeConverter implements NodeConverter {
+ // regexp for filenames that we accept
+ public static final String FILENAME_REGEXP = "[a-zA-Z0-9].*\\.[a-zA-Z][a-zA-Z][a-zA-Z]?";
+
+ private final RegexpFilter filenameFilter = new RegexpFilter(FILENAME_REGEXP);
+ private final Logger log = LoggerFactory.getLogger(getClass());
+
+ public InstallableData convertNode(Node n) throws RepositoryException {
+ InstallableData result = null;
+ if(n.hasProperty(FileInstallableData.JCR_CONTENT_DATA) && n.hasProperty(FileInstallableData.JCR_CONTENT_LAST_MODIFIED)) {
+ if(filenameFilter.accept(n.getName())) {
+ result = new FileInstallableData(n);
+ } else {
+ log.debug("Node {} ignored due to {}", n.getPath(), filenameFilter);
+ }
+ return result;
+ }
+ log.debug("Node {} has no {} properties, ignored", n.getPath(),
+ FileInstallableData.JCR_CONTENT_DATA + " or " + FileInstallableData.JCR_CONTENT_LAST_MODIFIED);
+ return null;
+ }
+}
\ No newline at end of file
Propchange: incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/FileNodeConverter.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/FileNodeConverter.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision Rev URL
Modified: incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/RegexpFilter.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/RegexpFilter.java?rev=711260&r1=711259&r2=711260&view=diff
==============================================================================
--- incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/RegexpFilter.java (original)
+++ incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/RegexpFilter.java Tue Nov 4 06:20:58 2008
@@ -35,6 +35,11 @@
return pattern.matcher(path).matches();
}
+ @Override
+ public String toString() {
+ return getClass().getSimpleName() + " (" + regexp + ")";
+ }
+
String getRegexp() {
return regexp;
}
Modified: incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/RepositoryObserver.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/RepositoryObserver.java?rev=711260&r1=711259&r2=711260&view=diff
==============================================================================
--- incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/RepositoryObserver.java (original)
+++ incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/RepositoryObserver.java Tue Nov 4 06:20:58 2008
@@ -24,6 +24,7 @@
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
+import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
@@ -38,11 +39,10 @@
import javax.jcr.observation.Event;
import org.apache.sling.jcr.api.SlingRepository;
+import org.apache.sling.jcr.jcrinstall.jcr.NodeConverter;
import org.apache.sling.jcr.jcrinstall.osgi.OsgiController;
import org.osgi.framework.BundleEvent;
import org.osgi.framework.BundleListener;
-import org.osgi.framework.FrameworkEvent;
-import org.osgi.framework.FrameworkListener;
import org.osgi.service.component.ComponentContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -80,14 +80,15 @@
private File serviceDataFile;
private long lastBundleEvent;
+ private final List<NodeConverter> converters = new ArrayList<NodeConverter>();
+
private List<WatchedFolderCreationListener> listeners = new LinkedList<WatchedFolderCreationListener>();
/** Default set of root folders to watch */
public static String[] DEFAULT_ROOTS = {"/libs", "/apps"};
- /** Default regexp for watched folders and filenames */
+ /** Default regexp for watched folders */
public static final String DEFAULT_FOLDER_NAME_REGEXP = ".*/install$";
- public static final String DEFAULT_FILENAME_REGEXP = "[a-zA-Z0-9].*\\.[a-zA-Z][a-zA-Z][a-zA-Z]?";
/** ComponentContext property that overrides the folder name regepx */
public static final String FOLDER_NAME_REGEXP_PROPERTY = "sling.jcrinstall.folder.name.regexp";
@@ -111,8 +112,14 @@
lastBundleEvent = System.currentTimeMillis();
// TODO make this more configurable?
- final String [] roots = DEFAULT_ROOTS;
- filenameFilter = new RegexpFilter(DEFAULT_FILENAME_REGEXP);
+ final String [] roots = DEFAULT_ROOTS;
+
+ /** NodeConverters setup
+ * Using services and a whiteboard pattern for these would be nice,
+ * but that could be problematic at startup due to async loading
+ */
+ converters.add(new FileNodeConverter());
+ converters.add(new ConfigNodeConverter());
String folderNameRegexp = getPropertyValue(context, FOLDER_NAME_REGEXP_PROPERTY);
if(folderNameRegexp == null) {
@@ -345,10 +352,11 @@
/** Let our WatchedFolders run their scanning cycles */
void runOneCycle() throws Exception {
+ boolean forceScan = false;
addNewWatchedFolders();
for(WatchedFolder wf : folders) {
- wf.scanIfNeeded();
- }
+ wf.scanIfNeeded(converters);
+ }
}
Properties loadProperties(File f) {
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=711260&r1=711259&r2=711260&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 06:20:58 2008
@@ -19,7 +19,7 @@
package org.apache.sling.jcr.jcrinstall.jcr.impl;
import java.io.IOException;
-import java.io.InputStream;
+import java.util.Collection;
import java.util.Set;
import javax.jcr.Item;
@@ -32,6 +32,8 @@
import javax.jcr.observation.EventListener;
import org.apache.sling.jcr.api.SlingRepository;
+import org.apache.sling.jcr.jcrinstall.jcr.NodeConverter;
+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.slf4j.Logger;
@@ -46,8 +48,7 @@
private final OsgiController controller;
private long nextScan;
private final Session session;
- private final RegexpFilter filenameFilter;
- protected static final Logger log = LoggerFactory.getLogger(WatchedFolder.class);
+ protected final Logger log = LoggerFactory.getLogger(getClass());
/**
* After receiving JCR events, we wait for this many msec before
@@ -59,8 +60,8 @@
RegexpFilter filenameFilter, long scanDelayMsec) throws RepositoryException {
this.path = path;
this.controller = ctrl;
- this.filenameFilter = filenameFilter;
this.scanDelayMsec = scanDelayMsec;
+
session = repository.loginAdministrative(repository.getDefaultWorkspace());
// observe any changes in our folder (and under it, as changes to properties
@@ -119,15 +120,15 @@
* If our timer allows it, scan our folder Node for updates
* and deletes.
*/
- void scanIfNeeded() throws Exception {
+ void scanIfNeeded(Collection<NodeConverter> converters) throws Exception {
if (nextScan != -1 && System.currentTimeMillis() > nextScan) {
nextScan = -1;
- scan();
+ scan(converters);
}
}
/** Scan our folder and inform OsgiController of any changes */
- protected void scan() throws Exception {
+ protected void scan(Collection<NodeConverter> converters) throws Exception {
log.debug("Scanning {}", path);
checkDeletions(controller.getInstalledUris());
@@ -145,23 +146,21 @@
return;
}
- // Check adds and updates, for all child nodes that are files
+ // Check adds and updates, for all child nodes for which we have a NodeConverter
final NodeIterator it = folder.getNodes();
while(it.hasNext()) {
final Node n = it.nextNode();
- final FileDataProvider dp = new FileDataProvider(n);
- if(!dp.isFile()) {
- log.debug("Node {} does not seem to be a file, ignored", n.getPath());
- } else if(!filenameFilter.accept(n.getName())) {
- if(log.isDebugEnabled()) {
- log.debug("Node " + n.getPath() + " with name " + n.getName() + " ignored due to " + filenameFilter);
- }
- } else {
- // a single failure must not block the whole thing (SLING-655)
- try {
- installOrUpdate(n.getPath(), dp);
- } catch(JcrInstallException jie) {
- log.warn("Failed to install resource " + n.getPath(), jie);
+ for(NodeConverter nc : converters) {
+ final InstallableData d = nc.convertNode(n);
+ if(d != null) {
+ log.debug("Installing or updating {}", d);
+ // a single failure must not block the whole thing (SLING-655)
+ try {
+ installOrUpdate(n.getPath(), d);
+ } catch(JcrInstallException jie) {
+ log.warn("Failed to install resource " + n.getPath(), jie);
+ }
+ break;
}
}
}
@@ -186,7 +185,7 @@
}
/** Install or update the given resource, as needed */
- protected void installOrUpdate(String path, FileDataProvider fdp) throws IOException, JcrInstallException {
+ protected void installOrUpdate(String path, InstallableData fdp) throws IOException, JcrInstallException {
final String digest = controller.getDigest(path);
if(digest == null) {
log.info("Resource {} was not installed yet, installing in OsgiController", path);
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=711260&r1=711259&r2=711260&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 06:20:58 2008
@@ -26,8 +26,8 @@
*/
public interface OsgiResourceProcessor {
- /** True if this processor can process the given uri */
- boolean canProcess(String uri);
+ /** True if this processor can process the given data */
+ boolean canProcess(String uri, InstallableData data);
/** Install or update supplied resource
* @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=711260&r1=711259&r2=711260&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 06:20:58 2008
@@ -135,49 +135,57 @@
}
// Update if we already have a bundle id, else install
- Bundle b = null;
- boolean updated = false;
-
- // check whether we know the bundle and it exists
- final Long longId = (Long) attributes.get(KEY_BUNDLE_ID);
- if (longId != null) {
- b = ctx.getBundle(longId);
- }
-
- // either we don't know the bundle yet or it does not exist,
- // so check whether the bundle can be found by its symbolic name
- if (b == null) {
- // ensure we can mark and reset to read the manifest
- if (!data.markSupported()) {
- data = new BufferedInputStream(data);
- }
- final BundleInfo info = getMatchingBundle(data);
- if (info != null) {
- final Version availableVersion = new Version(
- (String) info.bundle.getHeaders().get(
- Constants.BUNDLE_VERSION));
- final Version newVersion = new Version(info.newVersion);
- if (newVersion.compareTo(availableVersion) > 0) {
- b = info.bundle;
- } else {
- log.debug(
- "Ignore update of bundle {} from {} as the installed version is equal or higher.",
- info.bundle.getSymbolicName(), uri);
- return IGNORED;
- }
- }
- }
-
- if (b != null) {
- b.stop();
- b.update(data);
- updated = true;
- needsRefresh = true;
- } else {
- uri = OsgiControllerImpl.getResourceLocation(uri);
- log.debug("No matching Bundle for uri {}, installing", uri);
- b = ctx.installBundle(uri, data);
- }
+ Bundle b;
+ boolean updated;
+ try {
+ b = null;
+ updated = false;
+
+ // check whether we know the bundle and it exists
+ final Long longId = (Long) attributes.get(KEY_BUNDLE_ID);
+ if (longId != null) {
+ b = ctx.getBundle(longId);
+ }
+
+ // either we don't know the bundle yet or it does not exist,
+ // so check whether the bundle can be found by its symbolic name
+ if (b == null) {
+ // ensure we can mark and reset to read the manifest
+ if (!data.markSupported()) {
+ data = new BufferedInputStream(data);
+ }
+ final BundleInfo info = getMatchingBundle(data);
+ if (info != null) {
+ final Version availableVersion = new Version(
+ (String) info.bundle.getHeaders().get(
+ Constants.BUNDLE_VERSION));
+ final Version newVersion = new Version(info.newVersion);
+ if (newVersion.compareTo(availableVersion) > 0) {
+ b = info.bundle;
+ } else {
+ log.debug(
+ "Ignore update of bundle {} from {} as the installed version is equal or higher.",
+ info.bundle.getSymbolicName(), uri);
+ return IGNORED;
+ }
+ }
+ }
+
+ if (b != null) {
+ b.stop();
+ b.update(data);
+ updated = true;
+ needsRefresh = true;
+ } else {
+ uri = OsgiControllerImpl.getResourceLocation(uri);
+ log.debug("No matching Bundle for uri {}, installing", uri);
+ b = ctx.installBundle(uri, data);
+ }
+ } finally {
+ if(data != null) {
+ data.close();
+ }
+ }
// ensure the bundle id in the attributes, this may be overkill
// in simple update situations, but is required for installations
@@ -220,7 +228,7 @@
/**
* @see org.apache.sling.jcr.jcrinstall.osgi.OsgiResourceProcessor#canProcess(java.lang.String)
*/
- public boolean canProcess(String uri) {
+ public boolean canProcess(String uri, InstallableData data) {
return uri.endsWith(BUNDLE_EXTENSION);
}
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=711260&r1=711259&r2=711260&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 06:20:58 2008
@@ -52,8 +52,9 @@
// nothing to do
}
- public boolean canProcess(String uri) {
- return uri.endsWith(CONFIG_EXTENSION);
+ public boolean canProcess(String uri, InstallableData data) {
+ final boolean isDict = data == null ? false : data.adaptTo(Dictionary.class) != null;
+ return uri.endsWith(CONFIG_EXTENSION) || isDict;
}
@SuppressWarnings("unchecked")
@@ -67,7 +68,13 @@
if(data == null) {
throw new IOException("InstallableData does not adapt to an InputStream: " + uri);
}
- dict = reader.load(data);
+ try {
+ dict = reader.load(data);
+ } finally {
+ if(data != null) {
+ data.close();
+ }
+ }
}
if(dict == null) {
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=711260&r1=711259&r2=711260&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 06:20:58 2008
@@ -21,7 +21,6 @@
import static org.apache.sling.jcr.jcrinstall.osgi.InstallResultCode.IGNORED;
import java.io.IOException;
-import java.io.InputStream;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
@@ -31,12 +30,7 @@
import org.apache.sling.jcr.jcrinstall.osgi.JcrInstallException;
import org.apache.sling.jcr.jcrinstall.osgi.OsgiController;
import org.apache.sling.jcr.jcrinstall.osgi.OsgiResourceProcessor;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
import org.osgi.framework.BundleEvent;
-import org.osgi.framework.BundleException;
-import org.osgi.framework.FrameworkEvent;
-import org.osgi.framework.FrameworkListener;
import org.osgi.framework.SynchronousBundleListener;
import org.osgi.service.cm.ConfigurationAdmin;
import org.osgi.service.component.ComponentContext;
@@ -116,7 +110,7 @@
public int installOrUpdate(String uri, InstallableData data) throws IOException, JcrInstallException {
int result = IGNORED;
- final OsgiResourceProcessor p = getProcessor(uri);
+ final OsgiResourceProcessor p = getProcessor(uri, data);
if (p != null) {
try {
final Map<String, Object> map = storage.getMap(uri);
@@ -128,21 +122,21 @@
} catch(IOException ioe) {
throw ioe;
} catch(Exception e) {
- throw new JcrInstallException("Exception in installOrUpdate", e);
+ throw new JcrInstallException("Exception in installOrUpdate (" + uri + ")", e);
}
}
return result;
}
public void uninstall(String uri) throws JcrInstallException {
- final OsgiResourceProcessor p = getProcessor(uri);
+ final OsgiResourceProcessor p = getProcessor(uri, null);
if(p != null) {
try {
p.uninstall(uri, storage.getMap(uri));
storage.remove(uri);
storage.saveToFile();
} catch(Exception e) {
- throw new JcrInstallException("Exception in uninstall", e);
+ throw new JcrInstallException("Exception in uninstall (" + uri + ")", e);
}
}
}
@@ -169,7 +163,7 @@
}
/** Return the first processor that accepts given uri, null if not found */
- OsgiResourceProcessor getProcessor(String uri) {
+ OsgiResourceProcessor getProcessor(String uri, InstallableData data) {
OsgiResourceProcessor result = null;
if(processors == null) {
@@ -177,7 +171,7 @@
}
for(OsgiResourceProcessor p : processors) {
- if(p.canProcess(uri)) {
+ if(p.canProcess(uri, data)) {
result = p;
break;
}
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=711260&r1=711259&r2=711260&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 06:20:58 2008
@@ -98,14 +98,15 @@
f = session.getRootNode().getNode(relPath);
res = f.getNode(JCR_CONTENT);
} else {
- f = session.getRootNode().addNode(relPath);
- res = f.addNode(JCR_CONTENT);
+ f = session.getRootNode().addNode(relPath,NT_FILE);
+ res = f.addNode(JCR_CONTENT,NT_RESOURCE);
}
final Calendar c = Calendar.getInstance();
c.setTimeInMillis(lastModified);
res.setProperty(JCR_LASTMODIFIED, c);
res.setProperty(JCR_DATA, data);
+ res.setProperty(JCR_MIMETYPE, "");
f.getParent().save();
}
Added: incubator/sling/trunk/extensions/jcrinstall/src/test/java/org/apache/sling/jcr/jcrinstall/jcr/impl/DigestTest.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/extensions/jcrinstall/src/test/java/org/apache/sling/jcr/jcrinstall/jcr/impl/DigestTest.java?rev=711260&view=auto
==============================================================================
--- incubator/sling/trunk/extensions/jcrinstall/src/test/java/org/apache/sling/jcr/jcrinstall/jcr/impl/DigestTest.java (added)
+++ incubator/sling/trunk/extensions/jcrinstall/src/test/java/org/apache/sling/jcr/jcrinstall/jcr/impl/DigestTest.java Tue Nov 4 06:20:58 2008
@@ -0,0 +1,70 @@
+package org.apache.sling.jcr.jcrinstall.jcr.impl;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Dictionary;
+import java.util.Hashtable;
+
+public class DigestTest {
+ private void setTestData(Hashtable<String, Object> d) {
+ d.put("str", "value");
+ d.put("long", new Long(12));
+ d.put("array", new String[] { "a", "b"});
+ }
+
+ private String testDigestChanged(Dictionary<String, Object> d,
+ String oldDigest, int step, boolean shouldChange) throws Exception {
+ final String newDigest = ConfigInstallableData.computeDigest(d);
+ if(shouldChange) {
+ assertTrue("Digest (" + newDigest + ") should have changed at step " + step, !newDigest.equals(oldDigest));
+ } else {
+ assertTrue("Digest (" + newDigest + ") should NOT have changed at step " + step, newDigest.equals(oldDigest));
+ }
+ return newDigest;
+ }
+
+ @org.junit.Test public void testDictionaryDigestSameData() throws Exception {
+ final Hashtable<String, Object> d1 = new Hashtable<String, Object>();
+ final Hashtable<String, Object> d2 = new Hashtable<String, Object>();
+
+ setTestData(d1);
+ setTestData(d2);
+
+ assertEquals(
+ "Two dictionary with same values have the same key",
+ ConfigInstallableData.computeDigest(d1),
+ ConfigInstallableData.computeDigest(d2)
+ );
+ }
+
+ @org.junit.Test public void testDictionaryDigestChanges() throws Exception {
+ String digest = "";
+ int step = 1;
+
+ final Dictionary<String, Object> d = new Hashtable<String, Object>();
+ digest = testDigestChanged(d, digest, step, true);
+ digest = testDigestChanged(d, digest, step, false);
+
+ d.put("key", "value");
+ digest = testDigestChanged(d, digest, step, true);
+ d.put("key", "value");
+ digest = testDigestChanged(d, digest, step, false);
+
+ d.put("int", new Integer(12));
+ digest = testDigestChanged(d, digest, step, true);
+ d.put("int", new Integer(12));
+ digest = testDigestChanged(d, digest, step, false);
+ d.put("int", new Integer(13));
+ digest = testDigestChanged(d, digest, step, true);
+
+ d.put("array", new String [] { "a", "b", "c"});
+ digest = testDigestChanged(d, digest, step, true);
+ d.put("array", new String [] { "a", "b", "c"});
+ digest = testDigestChanged(d, digest, step, false);
+ d.put("array", new String [] { "a", "b", "D"});
+ digest = testDigestChanged(d, digest, step, true);
+ d.put("another", new String [] { "a", "b", "D"});
+ digest = testDigestChanged(d, digest, step, true);
+ }
+}
Propchange: incubator/sling/trunk/extensions/jcrinstall/src/test/java/org/apache/sling/jcr/jcrinstall/jcr/impl/DigestTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/sling/trunk/extensions/jcrinstall/src/test/java/org/apache/sling/jcr/jcrinstall/jcr/impl/DigestTest.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision Rev URL
Modified: incubator/sling/trunk/extensions/jcrinstall/src/test/java/org/apache/sling/jcr/jcrinstall/osgi/impl/OsgiControllerGetProcessorTest.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/extensions/jcrinstall/src/test/java/org/apache/sling/jcr/jcrinstall/osgi/impl/OsgiControllerGetProcessorTest.java?rev=711260&r1=711259&r2=711260&view=diff
==============================================================================
--- incubator/sling/trunk/extensions/jcrinstall/src/test/java/org/apache/sling/jcr/jcrinstall/osgi/impl/OsgiControllerGetProcessorTest.java (original)
+++ incubator/sling/trunk/extensions/jcrinstall/src/test/java/org/apache/sling/jcr/jcrinstall/osgi/impl/OsgiControllerGetProcessorTest.java Tue Nov 4 06:20:58 2008
@@ -35,8 +35,8 @@
@org.junit.Test public void testNoProcessors() throws Exception {
final OsgiControllerImpl c = new OsgiControllerImpl();
Utilities.setProcessors(c);
- assertNull("Controller must return null processor for null uri", c.getProcessor(null));
- assertNull("Controller must return null processor for TEST uri", c.getProcessor("TEST"));
+ assertNull("Controller must return null processor for null uri", c.getProcessor(null, null));
+ assertNull("Controller must return null processor for TEST uri", c.getProcessor("TEST", null));
}
@org.junit.Test public void testTwoProcessors() throws Exception {
@@ -46,13 +46,13 @@
Utilities.setProcessors(c, p1, p2);
mockery.checking(new Expectations() {{
- allowing(p1).canProcess("foo") ; will(returnValue(true));
- allowing(p1).canProcess("bar") ; will(returnValue(false));
- allowing(p2).canProcess("foo") ; will(returnValue(false));
- allowing(p2).canProcess("bar") ; will(returnValue(true));
+ allowing(p1).canProcess("foo", null) ; will(returnValue(true));
+ allowing(p1).canProcess("bar", null) ; will(returnValue(false));
+ allowing(p2).canProcess("foo", null) ; will(returnValue(false));
+ allowing(p2).canProcess("bar", null) ; will(returnValue(true));
}});
- assertEquals("foo extension must return processor p1", p1, c.getProcessor("foo"));
- assertEquals("bar extension must return processor p2", p2, c.getProcessor("bar"));
+ assertEquals("foo extension must return processor p1", p1, c.getProcessor("foo", null));
+ assertEquals("bar extension must return processor p2", p2, c.getProcessor("bar", null));
}
}