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 2009/08/13 17:10:06 UTC
svn commit: r803922 - in /sling/trunk/installer/osgi/installer/src:
main/java/org/apache/sling/osgi/installer/
main/java/org/apache/sling/osgi/installer/impl/
main/java/org/apache/sling/osgi/installer/impl/tasks/
test/java/org/apache/sling/osgi/install...
Author: bdelacretaz
Date: Thu Aug 13 15:10:05 2009
New Revision: 803922
URL: http://svn.apache.org/viewvc?rev=803922&view=rev
Log:
SLING-1078 - controller interface reworked, unit tests pass but not usable yet
Added:
sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/InstallableResource.java
- copied, changed from r803805, sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/InstallableData.java
sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/OsgiControllerContext.java
- copied, changed from r803805, sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/OsgiControllerTaskContext.java
sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/RegisteredResource.java (with props)
sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/DictionaryConversionTest.java
- copied, changed from r803805, sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/tasks/DictionaryReaderTest.java
sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/DictionaryDigestTest.java
- copied, changed from r803805, sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/DigestTest.java
sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/MockOsgiControllerContext.java (with props)
Removed:
sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/DictionaryInstallableData.java
sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/InstallableData.java
sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/OsgiControllerServices.java
sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/OsgiControllerStatistics.java
sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/ResourceOverrideRules.java
sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/InstallableDataWrapper.java
sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/OsgiControllerTaskContext.java
sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/tasks/DictionaryReader.java
sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/DigestTest.java
sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/MockInstallableData.java
sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/tasks/DictionaryReaderTest.java
Modified:
sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/OsgiController.java
sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/Activator.java
sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/OsgiControllerImpl.java
sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/OsgiControllerTask.java
sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/Storage.java
sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/tasks/BundleInstallRemoveTask.java
sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/tasks/BundleStartTask.java
sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/tasks/ConfigInstallRemoveTask.java
sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/tasks/InstallRemoveTask.java
sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/tasks/SynchronousRefreshPackagesTask.java
sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/tasks/TaskUtilities.java
sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/StorageTest.java
sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/TaskOrderingTest.java
sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/tasks/BundleInstallRemoveIgnoreTest.java
Copied: sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/InstallableResource.java (from r803805, sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/InstallableData.java)
URL: http://svn.apache.org/viewvc/sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/InstallableResource.java?p2=sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/InstallableResource.java&p1=sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/InstallableData.java&r1=803805&r2=803922&rev=803922&view=diff
==============================================================================
--- sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/InstallableData.java (original)
+++ sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/InstallableResource.java Thu Aug 13 15:10:05 2009
@@ -18,23 +18,75 @@
*/
package org.apache.sling.osgi.installer;
-/** A piece of data that can be installed by
- * the OSGi controller.
+import java.io.InputStream;
+import java.util.Dictionary;
+
+/** A piece of data that can be installed by the OSGi controller.
+ * Wraps either a Dictionary or an InputStream.
+ * Extension is used to decide which type of data (bundle, config, etc.).
*/
-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();
+public class InstallableResource {
+ private final String url;
+ private final String extension;
+ private final InputStream inputStream;
+ private final Dictionary<String, Object> dictionary;
+
+ /** Create an empty data object, used when removing resources */
+ public InstallableResource(String url) {
+ this.url = url;
+ this.extension = getExtension(url);
+ this.inputStream = null;
+ this.dictionary = null;
+ }
+
+ /** Create a data object that wraps an InputStream */
+ public InstallableResource(String url, InputStream is) {
+ this.url = url;
+ this.extension = getExtension(url);
+ this.inputStream = is;
+ this.dictionary = null;
+ }
+
+ /** Create a data object that wraps a Dictionary */
+ public InstallableResource(String url, Dictionary<String, Object> d) {
+ this.url = url;
+ this.extension = getExtension(url);
+ this.inputStream = null;
+ this.dictionary = d;
+ }
+
+ @Override
+ public String toString() {
+ return getClass().getSimpleName() + ", url=" + url;
+ }
- /** Adapt the underlying data to the provided type.
- * @return null if cannot be adapted */
- <AdapterType> AdapterType adaptTo(Class<AdapterType> type);
+ /** Compute the extension */
+ private static String getExtension(String url) {
+ final int pos = url.lastIndexOf('.');
+ return (pos < 0 ? "" : url.substring(pos+1));
+ }
- /** If data to install is a Bundle, this is the start level
- * to use when installing it.
+ /** Return this data's URL. It is opaque for the {@link OsgiController}
+ * but the scheme must be the one used in the
+ * {@link OsgiController#registerResources} call.
*/
- int getBundleStartLevel();
+ public String getURL() {
+ return url;
+ }
+
+ public String getUrl() {
+ return url;
+ }
+
+ public String getExtension() {
+ return extension;
+ }
+
+ public InputStream getInputStream() {
+ return inputStream;
+ }
+
+ public Dictionary<String, Object> getDictionary() {
+ return dictionary;
+ }
}
Modified: sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/OsgiController.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/OsgiController.java?rev=803922&r1=803921&r2=803922&view=diff
==============================================================================
--- sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/OsgiController.java (original)
+++ sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/OsgiController.java Thu Aug 13 15:10:05 2009
@@ -19,43 +19,41 @@
package org.apache.sling.osgi.installer;
import java.io.IOException;
-import java.util.Set;
+import java.util.Collection;
+import java.util.Map;
-/** jcrinstall component that installs/updates/removes
- * OSGi resources (bundles, deployment packages, configs)
- * in the OSGi framework.
+/** Controller that installs/updates/removes InstallableData
+ * in the OSGi framework. The client can register a number of such
+ * resources, and the controller decides based on the resource weights,
+ * bundle version numbers, etc. which ones are actually installed.
+ *
+ * An InstallableResource can be a bundle, a configuration, and later
+ * we might support deployment packages as well.
*/
public interface OsgiController {
-
- /** Schedule installation or update of supplied resource
- * @param uri Unique identifier for the resource
- * @param data The data to install
- */
- void scheduleInstallOrUpdate(String uri, InstallableData data) throws IOException;
-
- /** Schedule uninstallation of resource that was installed via given uri.
- * Might be called several times for the same URI - needless calls should
- * be ignored.
- * @param uri Unique identifier for the resource
- * @param attributes metadata stored by the OsgiController, will be
- * removed after calling this method
- */
- void scheduleUninstall(String uri) throws IOException;
-
- /** Return the list of uri for resources that have been installed
- * by this controller.
- */
- Set<String> getInstalledUris();
-
- /** Get the lastModified value for given uri, assuming the resource pointed
- * to by that uri was installed.
- * @return -1 if we don't have info for given uri
- */
- String getDigest(String uri);
-
- /** Optionally set ResourceOverrideRules */
- void setResourceOverrideRules(ResourceOverrideRules r);
-
- /** Do the actual installs/uninistalls which were scheduled by the other methods */
- void executeScheduledOperations() throws Exception;
+
+ /** Provide the controller with the complete list of installable
+ * resources for a given client.
+ *
+ * Client must call this at startup and/or when the controller
+ * service becomes available. The controller stores the list of
+ * previously registered/added resources, compares with the new
+ * list and removes resources that have disappeared.
+ *
+ * @param data the list of available resources
+ * @param urlScheme identifies the client. All URLs of the supplied data
+ * must use this scheme
+ */
+ void registerResources(Collection<InstallableResource> data, String urlScheme) throws IOException;
+
+ /** Inform the controller that a resource is available for installation.
+ * also called if the resource has been modified since it was registered.
+ */
+ void addResource(InstallableResource d) throws IOException;
+
+ /** Inform the controller that a resource is no longer available */
+ void removeResource(InstallableResource d) throws IOException;
+
+ /** Return counters used for statistics, console display, testing, etc. */
+ Map<String, Long> getCounters();
}
Modified: sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/Activator.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/Activator.java?rev=803922&r1=803921&r2=803922&view=diff
==============================================================================
--- sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/Activator.java (original)
+++ sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/Activator.java Thu Aug 13 15:10:05 2009
@@ -21,7 +21,6 @@
import java.util.Hashtable;
import org.apache.sling.osgi.installer.OsgiController;
-import org.apache.sling.osgi.installer.OsgiControllerServices;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.BundleEvent;
@@ -76,8 +75,7 @@
(PackageAdmin)checkNotNull(this.packageAdminTracker.getService(), "PackageAdmin"),
logServiceTracker);
final String [] serviceInterfaces = {
- OsgiController.class.getName(),
- OsgiControllerServices.class.getName()
+ OsgiController.class.getName()
};
osgiControllerServiceReg = context.registerService(serviceInterfaces, osgiControllerService, props);
}
Copied: sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/OsgiControllerContext.java (from r803805, sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/OsgiControllerTaskContext.java)
URL: http://svn.apache.org/viewvc/sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/OsgiControllerContext.java?p2=sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/OsgiControllerContext.java&p1=sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/OsgiControllerTaskContext.java&r1=803805&r2=803922&rev=803922&view=diff
==============================================================================
--- sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/OsgiControllerTaskContext.java (original)
+++ sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/OsgiControllerContext.java Thu Aug 13 15:10:05 2009
@@ -18,18 +18,18 @@
*/
package org.apache.sling.osgi.installer.impl;
-import org.apache.sling.osgi.installer.OsgiControllerServices;
-import org.apache.sling.osgi.installer.ResourceOverrideRules;
import org.osgi.framework.BundleContext;
+import org.osgi.service.cm.ConfigurationAdmin;
+import org.osgi.service.log.LogService;
import org.osgi.service.packageadmin.PackageAdmin;
/** Context for OsgiControllerTask */
-public interface OsgiControllerTaskContext {
- ResourceOverrideRules getResourceOverrideRules();
+public interface OsgiControllerContext {
Storage getStorage();
BundleContext getBundleContext();
PackageAdmin getPackageAdmin();
- OsgiControllerServices getOsgiControllerServices();
+ ConfigurationAdmin getConfigurationAdmin();
+ LogService getLogService();
/** Schedule a task for execution in the current OsgiController cycle */
void addTaskToCurrentCycle(OsgiControllerTask t);
Modified: sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/OsgiControllerImpl.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/OsgiControllerImpl.java?rev=803922&r1=803921&r2=803922&view=diff
==============================================================================
--- sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/OsgiControllerImpl.java (original)
+++ sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/OsgiControllerImpl.java Thu Aug 13 15:10:05 2009
@@ -19,19 +19,12 @@
package org.apache.sling.osgi.installer.impl;
import java.io.IOException;
-import java.util.LinkedList;
-import java.util.List;
+import java.util.Collection;
+import java.util.HashMap;
import java.util.Map;
-import java.util.Set;
-import java.util.TreeSet;
-import org.apache.sling.osgi.installer.InstallableData;
+import org.apache.sling.osgi.installer.InstallableResource;
import org.apache.sling.osgi.installer.OsgiController;
-import org.apache.sling.osgi.installer.OsgiControllerServices;
-import org.apache.sling.osgi.installer.OsgiControllerStatistics;
-import org.apache.sling.osgi.installer.ResourceOverrideRules;
-import org.apache.sling.osgi.installer.impl.tasks.BundleInstallRemoveTask;
-import org.apache.sling.osgi.installer.impl.tasks.ConfigInstallRemoveTask;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import org.osgi.service.cm.ConfigurationAdmin;
@@ -39,37 +32,13 @@
import org.osgi.service.packageadmin.PackageAdmin;
import org.osgi.util.tracker.ServiceTracker;
-/**
- * OsgiController service
- *
- */
-public class OsgiControllerImpl
- implements OsgiController,
- OsgiControllerServices,
- OsgiControllerTaskContext,
- OsgiControllerStatistics {
+/** OsgiController service */
+public class OsgiControllerImpl implements OsgiController, OsgiControllerContext {
private final BundleContext bundleContext;
- private final Storage storage;
- private ResourceOverrideRules roRules;
-
- // The data type of the "tasks" member must be consistent with the {@link TaskOrderingTest} class
- private final Set<OsgiControllerTask> tasks = new TreeSet<OsgiControllerTask>();
- private final Set<OsgiControllerTask> tasksForNextCycle = new TreeSet<OsgiControllerTask>();
- private final Set<OsgiControllerTask> tasksForThisCycle = new TreeSet<OsgiControllerTask>();
- private final ServiceTracker logServiceTracker;
- private int threadCounter;
private final PackageAdmin packageAdmin;
- private int executedTasksCount;
-
- public static final String BUNDLE_EXTENSION = ".jar";
- public static final String STORAGE_FILENAME = "controller.storage";
-
- /** 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;
+ private final ServiceTracker logServiceTracker;
+ private Map<String, Long> counters = new HashMap<String, Long>();
public OsgiControllerImpl(final BundleContext bc,
final PackageAdmin pa,
@@ -78,170 +47,14 @@
this.bundleContext = bc;
this.packageAdmin = pa;
this.logServiceTracker = logServiceTracker;
- storage = new Storage(bc.getDataFile(STORAGE_FILENAME), this);
}
public void deactivate() {
- try {
- storage.saveToFile();
- } catch(IOException ioe) {
- if (getLogService() != null) {
- getLogService().log(LogService.LOG_WARNING, "IOException in Storage.saveToFile()", ioe);
- }
- }
-
if(getLogService() != null) {
getLogService().log(LogService.LOG_WARNING,
OsgiController.class.getName()
+ " service deactivated - this warning can be ignored if system is shutting down");
}
-
- }
-
- public void scheduleInstallOrUpdate(String uri, InstallableData data) throws IOException {
- synchronized (tasks) {
- tasks.add(getTaskForUri(uri, data));
- }
- }
-
- public void scheduleUninstall(String uri) throws IOException {
- synchronized (tasks) {
- tasks.add(getTaskForUri(uri, null));
- }
- }
-
- protected OsgiControllerTask getTaskForUri(String uri, InstallableData data) {
- if(uri.endsWith(BUNDLE_EXTENSION)) {
- return new BundleInstallRemoveTask(uri, data, bundleContext, this);
- } else {
- return new ConfigInstallRemoveTask(uri, data, this);
- }
- }
-
- public Set<String> getInstalledUris() {
- return storage.getKeys();
- }
-
- /** {@inheritDoc}
- * @return null if uri not found
- */
- public String getDigest(String uri) {
- String result = null;
-
- if(storage.contains(uri)) {
- final Map<String, Object> uriData = storage.getMap(uri);
- result = (String)uriData.get(KEY_DIGEST);
- }
- return result;
- }
-
- public static String getResourceLocation(String uri) {
- return "jcrinstall://" + uri;
- }
-
- /** {@inheritDoc} */
- public void executeScheduledOperations() throws Exception {
-
- // Anything to do?
- if(tasks.isEmpty()) {
- return;
- }
-
- // No executable tasks?
- boolean exec = false;
- synchronized (tasks) {
- for(OsgiControllerTask t : tasks) {
- if(t.isExecutable(this)) {
- exec = true;
- break;
- }
- }
- }
-
- if(getLogService() != null) {
- if(exec) {
- getLogService().log(LogService.LOG_INFO, "executeScheduledOperations() starts");
- } else {
- getLogService().log(LogService.LOG_DEBUG, "No executable tasks, nothing to do");
- }
- }
-
- if(!exec) {
- return;
- }
-
- synchronized (tasks) {
- if(getLogService() != null) {
- getLogService().log(LogService.LOG_INFO, "Executing " + tasks.size()
- + " queued tasks (more might be created during execution cycle)");
- }
- final long start = System.currentTimeMillis();
-
- // Now execute all our tasks in a separate thread
- // and re-add tasks scheduled for next cycle
- executeTasksInSeparateThread();
- tasks.clear();
- tasks.addAll(tasksForNextCycle);
- tasksForNextCycle.clear();
-
- if(getLogService() != null) {
- getLogService().log(LogService.LOG_INFO,
- "executeScheduledOperations() ends (" + (System.currentTimeMillis() - start) + " msec)");
- }
- }
- }
-
- /** Execute a single task - meant to be called from worker thread */
- private void executeTask(OsgiControllerTask t) {
- final long start = System.currentTimeMillis();
- final LogService log = getLogService();
- if(log != null) {
- log.log(LogService.LOG_DEBUG, "Executing task " + t);
- }
-
- try {
- t.execute(this);
- if(log != null) {
- final long delta = System.currentTimeMillis() - start;
- log.log(LogService.LOG_INFO, "Successfully executed " + t + " in " + delta + " msec");
- }
- } catch(Throwable th) {
- if(log != null) {
- log.log(LogService.LOG_INFO, "Task execution failed (" + th + ") will retry " + t);
- }
- tasksForNextCycle.add(t);
- }
- }
-
- void executeTasksInSeparateThread() throws InterruptedException {
- final Runnable r = new Runnable() {
- public void run() {
- while(!tasks.isEmpty()) {
- final List<OsgiControllerTask> toRemove = new LinkedList<OsgiControllerTask>();
- for(OsgiControllerTask t : tasks) {
- toRemove.add(t);
- executedTasksCount++;
- executeTask(t);
- if(!tasksForThisCycle.isEmpty()) {
- break;
- }
- }
- tasks.removeAll(toRemove);
- tasks.addAll(tasksForThisCycle);
- tasksForThisCycle.clear();
- }
- }
- };
-
- final String threadName = getClass().getSimpleName() + " #" + (++threadCounter);
- final Thread t = new Thread(r, threadName);
- t.setDaemon(true);
- t.start();
- t.join();
- }
-
- public void setResourceOverrideRules(ResourceOverrideRules r) {
- roRules = r;
}
public ConfigurationAdmin getConfigurationAdmin() {
@@ -256,14 +69,6 @@
return null;
}
- public ResourceOverrideRules getResourceOverrideRules() {
- return roRules;
- }
-
- public Storage getStorage() {
- return storage;
- }
-
public LogService getLogService() {
return (LogService)logServiceTracker.getService();
}
@@ -272,14 +77,16 @@
if(getLogService() != null) {
getLogService().log(LogService.LOG_DEBUG, "adding task to current cycle:" + t);
}
- tasksForThisCycle.add(t);
+ // TODO
+ //tasksForThisCycle.add(t);
}
public void addTaskToNextCycle(OsgiControllerTask t) {
if(getLogService() != null) {
getLogService().log(LogService.LOG_DEBUG, "adding task to next cycle:" + t);
}
- tasksForNextCycle.add(t);
+ // TODO
+ //tasksForNextCycle.add(t);
}
public BundleContext getBundleContext() {
@@ -290,11 +97,25 @@
return packageAdmin;
}
- public OsgiControllerServices getOsgiControllerServices() {
- return this;
+ public Map<String, Long> getCounters() {
+ return counters;
}
- public long getExecutedTasksCount() {
- return executedTasksCount;
+ public void addResource(InstallableResource d) throws IOException {
+ // TODO
+ }
+
+ public void registerResources(Collection<InstallableResource> data,
+ String urlScheme) throws IOException {
+ // TODO
+ }
+
+ public void removeResource(InstallableResource d) throws IOException {
+ // TODO
+ }
+
+ public Storage getStorage() {
+ // TODO
+ return null;
}
}
\ No newline at end of file
Modified: sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/OsgiControllerTask.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/OsgiControllerTask.java?rev=803922&r1=803921&r2=803922&view=diff
==============================================================================
--- sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/OsgiControllerTask.java (original)
+++ sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/OsgiControllerTask.java Thu Aug 13 15:10:05 2009
@@ -21,7 +21,7 @@
/** Base class for tasks that can be executed by the OsgiController */
public abstract class OsgiControllerTask implements Comparable<OsgiControllerTask> {
/** Execute this task */
- public abstract void execute(OsgiControllerTaskContext ctx) throws Exception;
+ public abstract void execute(OsgiControllerContext ctx) throws Exception;
/** Tasks are sorted according to this key */
public abstract String getSortKey();
@@ -32,7 +32,7 @@
}
/** Is it worth executing this task now? */
- public boolean isExecutable(OsgiControllerTaskContext ctx) throws Exception {
+ public boolean isExecutable(OsgiControllerContext ctx) throws Exception {
return true;
}
Added: sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/RegisteredResource.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/RegisteredResource.java?rev=803922&view=auto
==============================================================================
--- sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/RegisteredResource.java (added)
+++ sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/RegisteredResource.java Thu Aug 13 15:10:05 2009
@@ -0,0 +1,173 @@
+/*
+ * 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.osgi.installer.impl;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.ObjectOutputStream;
+import java.io.OutputStream;
+import java.math.BigInteger;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.Dictionary;
+import java.util.Hashtable;
+import java.util.Map;
+import java.util.Properties;
+
+import org.apache.sling.osgi.installer.InstallableResource;
+import org.apache.sling.osgi.installer.impl.propertyconverter.PropertyConverter;
+import org.apache.sling.osgi.installer.impl.propertyconverter.PropertyValue;
+import org.osgi.framework.BundleContext;
+
+/** A resource that's been registered in the OSGi controller.
+ * Data can be either an InputStream or a Dictionary, and we store
+ * it locally to avoid holding up to classes or data from our
+ * clients, in case those disappear while we're installing stuff.
+ */
+public class RegisteredResource {
+ private final String url;
+ private final String digest;
+ private final File dataFile;
+ private final Dictionary<String, Object> dictionary;
+ private static long fileNumber;
+
+ public static final String DIGEST_TYPE = "MD5";
+
+ public RegisteredResource(BundleContext ctx, InstallableResource input) throws IOException {
+ url = input.getUrl();
+
+ try {
+ if(input.getDictionary() == null) {
+ dictionary = null;
+ if(input.getInputStream() == null) {
+ throw new IllegalArgumentException("input provides no Dictionary and no InputStream:" + input);
+ } else {
+ dataFile = getDataFile(ctx);
+ digest = copyToLocalStorage(input.getInputStream(), dataFile);
+ }
+ } else {
+ // TODO Copy dictionary
+ dataFile = null;
+ dictionary = input.getDictionary();
+ digest = computeDigest(dictionary);
+ }
+
+ } catch(NoSuchAlgorithmException nse) {
+ throw new IOException("NoSuchAlgorithmException:" + DIGEST_TYPE);
+
+ } finally {
+ if(input.getInputStream() != null) {
+ input.getInputStream().close();
+ }
+ }
+ }
+
+ protected File getDataFile(BundleContext ctx) {
+ String filename = null;
+ synchronized (getClass()) {
+ filename = getClass().getSimpleName() + "." + fileNumber++;
+ }
+ return ctx.getDataFile(filename);
+ }
+
+ public void cleanup() {
+ if(dataFile != null && dataFile.exists()) {
+ dataFile.delete();
+ }
+ }
+
+ public String getURL() {
+ return url;
+ }
+
+ public InputStream getInputStream() throws IOException {
+ if(dataFile == null) {
+ return null;
+ }
+ return new BufferedInputStream(new FileInputStream(dataFile));
+ }
+
+ public Dictionary<String, Object> getDictionary() {
+ return dictionary;
+ }
+
+ public String getDigest() {
+ return digest;
+ }
+
+ /** Digest is needed to detect changes in data
+ * @throws */
+ static String computeDigest(Dictionary<String, Object> data) throws IOException, NoSuchAlgorithmException {
+ final MessageDigest d = MessageDigest.getInstance(DIGEST_TYPE);
+ final ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ final ObjectOutputStream oos = new ObjectOutputStream(bos);
+ oos.writeObject(data);
+ bos.flush();
+ d.update(bos.toByteArray());
+ return digestToString(d);
+ }
+
+ /** convert digest to readable string (http://www.javalobby.org/java/forums/t84420.html) */
+ private static String digestToString(MessageDigest d) {
+ final BigInteger bigInt = new BigInteger(1, d.digest());
+ return new String(bigInt.toString(16));
+ }
+
+ /** Copy data to local storage and return digest */
+ private String copyToLocalStorage(InputStream data, File f) throws IOException, NoSuchAlgorithmException {
+ final MessageDigest d = MessageDigest.getInstance(DIGEST_TYPE);
+ final OutputStream os = new BufferedOutputStream(new FileOutputStream(f));
+ try {
+ final byte[] buffer = new byte[16384];
+ int count = 0;
+ while( (count = data.read(buffer, 0, buffer.length)) > 0) {
+ os.write(buffer, 0, count);
+ d.update(buffer, 0, count);
+ }
+ os.flush();
+ } finally {
+ if(os != null) {
+ os.close();
+ }
+ data.close();
+ }
+ return digestToString(d);
+ }
+
+ /** Convert InputStream to Dictionary using our extended properties format,
+ * which supports multi-value properties
+ */
+ static Dictionary<String, Object> readDictionary(InputStream is) throws IOException {
+ final Dictionary<String, Object> result = new Hashtable<String, Object>();
+ final PropertyConverter converter = new PropertyConverter();
+ final Properties p = new Properties();
+ p.load(is);
+ for(Map.Entry<Object, Object> e : p.entrySet()) {
+ final PropertyValue v = converter.convert((String)e.getKey(), (String)e.getValue());
+ result.put(v.getKey(), v.getValue());
+ }
+ return result;
+ }
+}
Propchange: sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/RegisteredResource.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/RegisteredResource.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision Rev URL
Modified: sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/Storage.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/Storage.java?rev=803922&r1=803921&r2=803922&view=diff
==============================================================================
--- sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/Storage.java (original)
+++ sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/Storage.java Thu Aug 13 15:10:05 2009
@@ -30,7 +30,6 @@
import java.util.Map;
import java.util.Set;
-import org.apache.sling.osgi.installer.OsgiControllerServices;
import org.osgi.service.log.LogService;
/** Storage for the OSGi controller, stores Maps for the resources
@@ -46,7 +45,7 @@
/** Create Storage that uses dataFile for persistence, and
* read the current status from that file */
@SuppressWarnings("unchecked")
- Storage(File dataFile, OsgiControllerServices ocs) throws IOException {
+ Storage(File dataFile, OsgiControllerContext ocs) throws IOException {
this.dataFile = dataFile;
ObjectInputStream ois = null;
Map<String, Map<String, Object>> loadedData = null;
Modified: sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/tasks/BundleInstallRemoveTask.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/tasks/BundleInstallRemoveTask.java?rev=803922&r1=803921&r2=803922&view=diff
==============================================================================
--- sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/tasks/BundleInstallRemoveTask.java (original)
+++ sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/tasks/BundleInstallRemoveTask.java Thu Aug 13 15:10:05 2009
@@ -23,10 +23,9 @@
import java.util.Map;
import java.util.jar.Manifest;
-import org.apache.sling.osgi.installer.InstallableData;
-import org.apache.sling.osgi.installer.OsgiControllerServices;
+import org.apache.sling.osgi.installer.impl.OsgiControllerContext;
import org.apache.sling.osgi.installer.impl.OsgiControllerImpl;
-import org.apache.sling.osgi.installer.impl.OsgiControllerTaskContext;
+import org.apache.sling.osgi.installer.impl.RegisteredResource;
import org.apache.sling.osgi.installer.impl.Storage;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
@@ -42,7 +41,7 @@
public static final String MAVEN_SNAPSHOT_MARKER = "SNAPSHOT";
- public BundleInstallRemoveTask(String uri, InstallableData data, BundleContext ctx, OsgiControllerServices ocs) {
+ public BundleInstallRemoveTask(String uri, RegisteredResource data, BundleContext ctx, OsgiControllerContext ocs) {
super(uri, data, ocs);
this.bundleContext = ctx;
}
@@ -57,7 +56,7 @@
}
@Override
- protected void doUninstall(OsgiControllerTaskContext tctx, Map<String, Object> attributes) throws Exception {
+ protected void doUninstall(OsgiControllerContext tctx, Map<String, Object> attributes) throws Exception {
final Long longId = (Long) attributes.get(Storage.KEY_BUNDLE_ID);
if (longId == null) {
if(ocs.getLogService() != null) {
@@ -81,17 +80,17 @@
}
@Override
- protected boolean doInstallOrUpdate(OsgiControllerTaskContext tctx, Map<String, Object> attributes) throws Exception {
+ protected boolean doInstallOrUpdate(OsgiControllerContext tctx, Map<String, Object> attributes) throws Exception {
// Check that we have bundle data and manifest
- InputStream is = data.adaptTo(InputStream.class);
+ InputStream is = data.getInputStream();
if(is == null) {
- throw new IOException("InstallableData does not adapt to an InputStream: " + uri);
+ throw new IOException("RegisteredResource does not adapt to an InputStream: " + uri);
}
final Manifest m = TaskUtilities.getManifest(data);
if(m == null) {
- throw new IOException("Manifest not found for InstallableData " + uri);
+ throw new IOException("Manifest not found for RegisteredResource " + uri);
}
// Update if we already have a bundle id, else install
@@ -137,11 +136,7 @@
tctx.addTaskToCurrentCycle(new BundleStartTask(b.getBundleId()));
} else {
// New bundle -> install
- final String fullUri = OsgiControllerImpl.getResourceLocation(uri);
- int level = data.getBundleStartLevel();
- if(level > 0) {
- throw new BundleException("Non-zero start level is not supported anymore (" + level + ")");
- }
+ final String fullUri = data.getURL();
b = bundleContext.installBundle(fullUri, is);
if(ocs.getLogService() != null) {
ocs.getLogService().log(LogService.LOG_INFO,
Modified: sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/tasks/BundleStartTask.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/tasks/BundleStartTask.java?rev=803922&r1=803921&r2=803922&view=diff
==============================================================================
--- sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/tasks/BundleStartTask.java (original)
+++ sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/tasks/BundleStartTask.java Thu Aug 13 15:10:05 2009
@@ -22,7 +22,7 @@
import org.apache.sling.osgi.installer.impl.Activator;
import org.apache.sling.osgi.installer.impl.OsgiControllerTask;
-import org.apache.sling.osgi.installer.impl.OsgiControllerTaskContext;
+import org.apache.sling.osgi.installer.impl.OsgiControllerContext;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleException;
import org.osgi.service.log.LogService;
@@ -50,9 +50,9 @@
return getClass().getSimpleName() + " (bundle " + bundleId + ")";
}
- public void execute(OsgiControllerTaskContext tctx) throws Exception {
+ public void execute(OsgiControllerContext tctx) throws Exception {
final Bundle b = tctx.getBundleContext().getBundle(bundleId);
- final LogService log = tctx.getOsgiControllerServices().getLogService();
+ final LogService log = tctx.getLogService();
boolean needToRetry = false;
if(b == null) {
@@ -104,12 +104,12 @@
}
/** Do not execute this task if waiting for events */
- public boolean isExecutable(OsgiControllerTaskContext tctx) {
+ public boolean isExecutable(OsgiControllerContext tctx) {
final long eventsCount = Activator.getTotalEventsCount();
final boolean result = eventsCount >= eventsCountForRetrying;
if(!result) {
- if(tctx.getOsgiControllerServices().getLogService() != null) {
- tctx.getOsgiControllerServices().getLogService().log(LogService.LOG_DEBUG,
+ if(tctx.getLogService() != null) {
+ tctx.getLogService().log(LogService.LOG_DEBUG,
this + " is not executable at this time, counters=" + eventsCountForRetrying + "/" + eventsCount);
}
}
Modified: sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/tasks/ConfigInstallRemoveTask.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/tasks/ConfigInstallRemoveTask.java?rev=803922&r1=803921&r2=803922&view=diff
==============================================================================
--- sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/tasks/ConfigInstallRemoveTask.java (original)
+++ sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/tasks/ConfigInstallRemoveTask.java Thu Aug 13 15:10:05 2009
@@ -18,14 +18,11 @@
*/
package org.apache.sling.osgi.installer.impl.tasks;
-import java.io.IOException;
-import java.io.InputStream;
import java.util.Dictionary;
import java.util.Map;
-import org.apache.sling.osgi.installer.InstallableData;
-import org.apache.sling.osgi.installer.OsgiControllerServices;
-import org.apache.sling.osgi.installer.impl.OsgiControllerTaskContext;
+import org.apache.sling.osgi.installer.impl.OsgiControllerContext;
+import org.apache.sling.osgi.installer.impl.RegisteredResource;
import org.osgi.service.cm.Configuration;
import org.osgi.service.log.LogService;
@@ -36,9 +33,7 @@
static final String CONFIG_PATH_KEY = "_jcr_config_path";
static final String [] CONFIG_EXTENSIONS = { ".cfg", ".properties" };
- private final DictionaryReader reader = new DictionaryReader();
-
- public ConfigInstallRemoveTask(String uri, InstallableData data, OsgiControllerServices ocs) {
+ public ConfigInstallRemoveTask(String uri, RegisteredResource data, OsgiControllerContext ocs) {
super(uri, data, ocs);
}
@@ -52,20 +47,9 @@
}
@Override
- protected boolean doInstallOrUpdate(OsgiControllerTaskContext tctx, Map<String, Object> attributes) throws Exception {
+ protected boolean doInstallOrUpdate(OsgiControllerContext tctx, Map<String, Object> attributes) throws Exception {
// Convert data to a configuration Dictionary
- Dictionary dict = data.adaptTo(Dictionary.class);
- if(dict == null) {
- InputStream is = data.adaptTo(InputStream.class);
- if (data == null) {
- throw new IOException("InstallableData does not adapt to an InputStream: " + uri);
- }
- try {
- dict = reader.load(is);
- } finally {
- is.close();
- }
- }
+ Dictionary dict = data.getDictionary();
if (dict == null) {
throw new IllegalArgumentException("Null Dictionary for uri=" + uri);
@@ -104,7 +88,7 @@
}
@Override
- protected void doUninstall(OsgiControllerTaskContext tctx, Map<String, Object> attributes) throws Exception {
+ protected void doUninstall(OsgiControllerContext tctx, Map<String, Object> attributes) throws Exception {
final ConfigurationPid pid = new ConfigurationPid(uri);
final Configuration cfg = TaskUtilities.getConfiguration(pid, false, ocs);
// TODO defer delete if ConfigAdmin not available?
Modified: sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/tasks/InstallRemoveTask.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/tasks/InstallRemoveTask.java?rev=803922&r1=803921&r2=803922&view=diff
==============================================================================
--- sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/tasks/InstallRemoveTask.java (original)
+++ sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/tasks/InstallRemoveTask.java Thu Aug 13 15:10:05 2009
@@ -20,13 +20,9 @@
import java.util.Map;
-import org.apache.sling.osgi.installer.InstallableData;
-import org.apache.sling.osgi.installer.OsgiControllerServices;
-import org.apache.sling.osgi.installer.impl.InstallableDataWrapper;
-import org.apache.sling.osgi.installer.impl.OsgiControllerImpl;
+import org.apache.sling.osgi.installer.impl.OsgiControllerContext;
import org.apache.sling.osgi.installer.impl.OsgiControllerTask;
-import org.apache.sling.osgi.installer.impl.OsgiControllerTaskContext;
-import org.osgi.service.log.LogService;
+import org.apache.sling.osgi.installer.impl.RegisteredResource;
/** Base class for OsgiControllerTasks that install or
* remove OSGi bundles or configs (or deployment packages, etc.)
@@ -34,10 +30,10 @@
abstract class InstallRemoveTask extends OsgiControllerTask {
protected final String uri;
- protected final InstallableData data;
- protected final OsgiControllerServices ocs;
+ protected final RegisteredResource data;
+ protected final OsgiControllerContext ocs;
- protected InstallRemoveTask(String uri, InstallableData data, OsgiControllerServices ocs) {
+ protected InstallRemoveTask(String uri, RegisteredResource data, OsgiControllerContext ocs) {
this.uri = uri;
this.data = data;
this.ocs = ocs;
@@ -55,17 +51,8 @@
}
/** {@inheritDoc} */
- public void execute(OsgiControllerTaskContext context) throws Exception {
- if(isInstallOrUpdate()) {
- executeInstallOrUpdate(context);
- } else {
- executeUninstall(context);
- }
-
- // Cleanup InstallableDataWrapper
- if(data instanceof InstallableDataWrapper) {
- ((InstallableDataWrapper)data).cleanup();
- }
+ public void execute(OsgiControllerContext context) throws Exception {
+ // TODO cleanup stored data? (previously RegisteredResourceWrapper)
}
/** @return true if this is an install/update task, false if it is an uninstall */
@@ -73,66 +60,9 @@
return data != null;
}
- protected final void executeInstallOrUpdate(OsgiControllerTaskContext context) throws Exception {
-
- // If a corresponding higher priority resource is already installed, ignore this one
- if(context.getResourceOverrideRules() != null) {
- for(String r : context.getResourceOverrideRules().getHigherPriorityResources(uri)) {
- if(context.getStorage().contains(r)) {
- if(ocs.getLogService() != null) {
- ocs.getLogService().log(LogService.LOG_INFO,
- "Resource " + uri + " ignored, overridden by " + r + " which has higher priority");
- }
- return;
- }
- }
- }
-
- // If a corresponding lower priority resource is installed, uninstall it first
- if(context.getResourceOverrideRules() != null) {
- for(String r : context.getResourceOverrideRules().getLowerPriorityResources(uri)) {
- if(context.getStorage().contains(r)) {
- if(ocs.getLogService() != null) {
- ocs.getLogService().log(LogService.LOG_INFO,
- "Resource " + uri + " overrides " + r + ", uninstalling the latter");
- }
- executeUninstall(context);
- }
- }
- }
-
- // process install
- final Map<String, Object> map = context.getStorage().getMap(uri);
- if(doInstallOrUpdate(context, map)) {
- map.put(OsgiControllerImpl.KEY_DIGEST, data.getDigest());
- }
- context.getStorage().saveToFile();
- }
-
- protected final void executeUninstall(OsgiControllerTaskContext context) throws Exception {
- // If a corresponding higher priority resource is installed, ignore this request
- if(context.getResourceOverrideRules() != null) {
- for(String r : context.getResourceOverrideRules().getHigherPriorityResources(uri)) {
- if(context.getStorage().contains(r)) {
- if(ocs.getLogService() != null) {
- ocs.getLogService().log(LogService.LOG_INFO,
- "Resource " + uri + " won't be uninstalled, overridden by " + r + " which has higher priority");
- }
- return;
- }
- }
- }
-
- doUninstall(context, context.getStorage().getMap(uri));
-
- context.getStorage().remove(uri);
- context.getStorage().saveToFile();
-
- }
-
/** Do the actual uninstall */
- protected abstract void doUninstall(OsgiControllerTaskContext ctx, Map<String, Object> attributes) throws Exception;
+ protected abstract void doUninstall(OsgiControllerContext ctx, Map<String, Object> attributes) throws Exception;
/** Do the actual install or update */
- protected abstract boolean doInstallOrUpdate(OsgiControllerTaskContext ctx, Map<String, Object> attributes) throws Exception;
+ protected abstract boolean doInstallOrUpdate(OsgiControllerContext ctx, Map<String, Object> attributes) throws Exception;
}
Modified: sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/tasks/SynchronousRefreshPackagesTask.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/tasks/SynchronousRefreshPackagesTask.java?rev=803922&r1=803921&r2=803922&view=diff
==============================================================================
--- sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/tasks/SynchronousRefreshPackagesTask.java (original)
+++ sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/tasks/SynchronousRefreshPackagesTask.java Thu Aug 13 15:10:05 2009
@@ -18,9 +18,8 @@
*/
package org.apache.sling.osgi.installer.impl.tasks;
-import org.apache.sling.osgi.installer.OsgiControllerServices;
+import org.apache.sling.osgi.installer.impl.OsgiControllerContext;
import org.apache.sling.osgi.installer.impl.OsgiControllerTask;
-import org.apache.sling.osgi.installer.impl.OsgiControllerTaskContext;
import org.osgi.framework.Bundle;
import org.osgi.framework.FrameworkEvent;
import org.osgi.framework.FrameworkListener;
@@ -33,7 +32,7 @@
public static final int MAX_REFRESH_PACKAGES_WAIT_SECONDS = 30;
private int packageRefreshEventsCount;
- private OsgiControllerServices ocs;
+ private OsgiControllerContext ctx;
/**
* Handles the PACKAGES_REFRESHED framework event which is sent after
@@ -44,8 +43,8 @@
*/
public void frameworkEvent(FrameworkEvent event) {
if (event.getType() == FrameworkEvent.PACKAGES_REFRESHED) {
- if(ocs.getLogService() != null) {
- ocs.getLogService().log(LogService.LOG_DEBUG,
+ if(ctx!= null && ctx.getLogService() != null) {
+ ctx.getLogService().log(LogService.LOG_DEBUG,
"FrameworkEvent.PACKAGES_REFRESHED");
}
packageRefreshEventsCount++;
@@ -62,11 +61,11 @@
return getClass().getSimpleName();
}
- public void execute(OsgiControllerTaskContext ctx) throws Exception {
+ public void execute(OsgiControllerContext ctx) throws Exception {
+ this.ctx = ctx;
final int targetEventCount = packageRefreshEventsCount + 1;
final long start = System.currentTimeMillis();
final long timeout = System.currentTimeMillis() + MAX_REFRESH_PACKAGES_WAIT_SECONDS * 1000L;
- ocs = ctx.getOsgiControllerServices();
// Refreshing packages might cause some bundles to be stopped,
// make sure all currently active ones are restarted after
@@ -75,8 +74,8 @@
if(b.getState() == Bundle.ACTIVE) {
final OsgiControllerTask t = new BundleStartTask(b.getBundleId());
ctx.addTaskToCurrentCycle(t);
- if(ctx.getOsgiControllerServices().getLogService() != null) {
- ctx.getOsgiControllerServices().getLogService().log(LogService.LOG_DEBUG,
+ if(ctx.getLogService() != null) {
+ ctx.getLogService().log(LogService.LOG_DEBUG,
"Added " + t + " to restart bundle if needed after refreshing packages");
}
}
@@ -89,8 +88,8 @@
try {
while(true) {
if(System.currentTimeMillis() > timeout) {
- if(ocs.getLogService() != null) {
- ocs.getLogService().log(LogService.LOG_WARNING,
+ if(ctx.getLogService() != null) {
+ ctx.getLogService().log(LogService.LOG_WARNING,
"No FrameworkEvent.PACKAGES_REFRESHED event received within "
+ MAX_REFRESH_PACKAGES_WAIT_SECONDS
+ " seconds after refresh");
@@ -99,8 +98,8 @@
}
if(packageRefreshEventsCount >= targetEventCount) {
final long delta = System.currentTimeMillis() - start;
- if(ocs.getLogService() != null) {
- ocs.getLogService().log(LogService.LOG_DEBUG,
+ if(ctx.getLogService() != null) {
+ ctx.getLogService().log(LogService.LOG_DEBUG,
"FrameworkEvent.PACKAGES_REFRESHED received "
+ delta
+ " msec after refreshPackages call");
Modified: sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/tasks/TaskUtilities.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/tasks/TaskUtilities.java?rev=803922&r1=803921&r2=803922&view=diff
==============================================================================
--- sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/tasks/TaskUtilities.java (original)
+++ sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/tasks/TaskUtilities.java Thu Aug 13 15:10:05 2009
@@ -5,8 +5,8 @@
import java.util.jar.JarInputStream;
import java.util.jar.Manifest;
-import org.apache.sling.osgi.installer.InstallableData;
-import org.apache.sling.osgi.installer.OsgiControllerServices;
+import org.apache.sling.osgi.installer.impl.OsgiControllerContext;
+import org.apache.sling.osgi.installer.impl.RegisteredResource;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.Constants;
@@ -27,7 +27,7 @@
* This method gets its own input stream from the installable data object
* and closes it after haing read the manifest file.
*
- * @param installableData The installable data providing the bundle jar file
+ * @param RegisteredResource The installable data providing the bundle jar file
* from the input stream.
* @return The installed bundle with the same symbolic name as the bundle
* provided by the input stream or <code>null</code> if no such
@@ -51,10 +51,10 @@
return null;
}
- /** Read the manifest from the InstallableData */
- static Manifest getManifest(InstallableData data) throws IOException {
+ /** Read the manifest from the RegisteredResource */
+ static Manifest getManifest(RegisteredResource data) throws IOException {
Manifest result = null;
- InputStream ins = data.adaptTo(InputStream.class);
+ InputStream ins = data.getInputStream();
if (ins == null) {
return null;
}
@@ -87,7 +87,7 @@
}
/** Get or create configuration */
- static Configuration getConfiguration(ConfigurationPid cp, boolean createIfNeeded, OsgiControllerServices ocs)
+ static Configuration getConfiguration(ConfigurationPid cp, boolean createIfNeeded, OsgiControllerContext ocs)
throws IOException, InvalidSyntaxException
{
final ConfigurationAdmin configurationAdmin = ocs.getConfigurationAdmin();
Copied: sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/DictionaryConversionTest.java (from r803805, sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/tasks/DictionaryReaderTest.java)
URL: http://svn.apache.org/viewvc/sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/DictionaryConversionTest.java?p2=sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/DictionaryConversionTest.java&p1=sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/tasks/DictionaryReaderTest.java&r1=803805&r2=803922&rev=803922&view=diff
==============================================================================
--- sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/tasks/DictionaryReaderTest.java (original)
+++ sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/DictionaryConversionTest.java Thu Aug 13 15:10:05 2009
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.sling.osgi.installer.impl.tasks;
+package org.apache.sling.osgi.installer.impl;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
@@ -24,13 +24,11 @@
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.Dictionary;
-import java.util.Properties;
import org.apache.sling.osgi.installer.impl.propertyconverter.PropertyConverter;
import org.apache.sling.osgi.installer.impl.propertyconverter.ValueConverterException;
-/** Test the DictionaryReader */
-public class DictionaryReaderTest {
+public class DictionaryConversionTest {
private void assertArray(String info, String [] expected, Object obj) {
assertTrue(info + ":obj (" + obj.getClass().getName() + ") must be a String[]", obj instanceof String[]);
@@ -65,22 +63,6 @@
assertArray("a,b,c,d", new String[] { "a", "b, c ,", "d" }, c.convert("x[]", "a, b\\, c \\,,d ").getValue());
}
- @org.junit.Test public void testConvertProperties() throws ValueConverterException {
- final Properties p = new Properties();
- p.setProperty("a", "1");
- p.setProperty("b", "2");
- p.setProperty("c[]", "1, 2, 3");
- p.setProperty("d []", "4, 5, 6");
-
- final DictionaryReader r = new DictionaryReader();
- final Dictionary<?, ?> d = r.convert(p);
- assertEquals("a", d.get("a"), "1");
- assertEquals("b", d.get("b"), "2");
-
- assertArray("c", new String[] { "1", "2", "3" }, d.get("c"));
- assertArray("d", new String[] { "4", "5", "6" }, d.get("d"));
- }
-
@org.junit.Test public void testFromStream() throws IOException {
final String data =
"a = 1\n"
@@ -92,13 +74,8 @@
;
final ByteArrayInputStream is = new ByteArrayInputStream(data.getBytes());
- final DictionaryReader r = new DictionaryReader();
- Dictionary<?, ?> d = null;
- try {
- d = r.load(is);
- } finally {
- is.close();
- }
+ final Dictionary<?, ?> d = RegisteredResource.readDictionary(is);
+ is.close();
assertEquals("Number of entries must match", 4, d.size());
assertEquals("a", d.get("a"), "1");
@@ -119,13 +96,8 @@
;
final ByteArrayInputStream is = new ByteArrayInputStream(data.getBytes());
- final DictionaryReader r = new DictionaryReader();
- Dictionary<?, ?> d = null;
- try {
- d = r.load(is);
- } finally {
- is.close();
- }
+ final Dictionary<?, ?> d = RegisteredResource.readDictionary(is);
+ is.close();
assertEquals("Number of entries must match", 5, d.size());
assertEquals("String value matches", "1", d.get("a"));
Copied: sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/DictionaryDigestTest.java (from r803805, sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/DigestTest.java)
URL: http://svn.apache.org/viewvc/sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/DictionaryDigestTest.java?p2=sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/DictionaryDigestTest.java&p1=sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/DigestTest.java&r1=803805&r2=803922&rev=803922&view=diff
==============================================================================
--- sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/DigestTest.java (original)
+++ sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/DictionaryDigestTest.java Thu Aug 13 15:10:05 2009
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.sling.osgi.installer;
+package org.apache.sling.osgi.installer.impl;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
@@ -24,7 +24,7 @@
import java.util.Dictionary;
import java.util.Hashtable;
-public class DigestTest {
+public class DictionaryDigestTest {
private void setTestData(Hashtable<String, Object> d) {
d.put("str", "value");
d.put("long", new Long(12));
@@ -33,7 +33,7 @@
private String testDigestChanged(Dictionary<String, Object> d,
String oldDigest, int step, boolean shouldChange) throws Exception {
- final String newDigest = DictionaryInstallableData.computeDigest(d);
+ final String newDigest = RegisteredResource.computeDigest(d);
if(shouldChange) {
assertTrue("Digest (" + newDigest + ") should have changed at step " + step, !newDigest.equals(oldDigest));
} else {
@@ -51,8 +51,8 @@
assertEquals(
"Two dictionary with same values have the same key",
- DictionaryInstallableData.computeDigest(d1),
- DictionaryInstallableData.computeDigest(d2)
+ RegisteredResource.computeDigest(d1),
+ RegisteredResource.computeDigest(d2)
);
}
Added: sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/MockOsgiControllerContext.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/MockOsgiControllerContext.java?rev=803922&view=auto
==============================================================================
--- sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/MockOsgiControllerContext.java (added)
+++ sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/MockOsgiControllerContext.java Thu Aug 13 15:10:05 2009
@@ -0,0 +1,53 @@
+/*
+ * 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.osgi.installer.impl;
+
+import org.osgi.framework.BundleContext;
+import org.osgi.service.cm.ConfigurationAdmin;
+import org.osgi.service.log.LogService;
+import org.osgi.service.packageadmin.PackageAdmin;
+
+public class MockOsgiControllerContext implements OsgiControllerContext {
+
+ public void addTaskToCurrentCycle(OsgiControllerTask t) {
+ }
+
+ public void addTaskToNextCycle(OsgiControllerTask t) {
+ }
+
+ public BundleContext getBundleContext() {
+ return null;
+ }
+
+ public ConfigurationAdmin getConfigurationAdmin() {
+ return null;
+ }
+
+ public LogService getLogService() {
+ return null;
+ }
+
+ public PackageAdmin getPackageAdmin() {
+ return null;
+ }
+
+ public Storage getStorage() {
+ return null;
+ }
+}
Propchange: sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/MockOsgiControllerContext.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/MockOsgiControllerContext.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision Rev URL
Modified: sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/StorageTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/StorageTest.java?rev=803922&r1=803921&r2=803922&view=diff
==============================================================================
--- sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/StorageTest.java (original)
+++ sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/StorageTest.java Thu Aug 13 15:10:05 2009
@@ -26,23 +26,10 @@
import java.io.File;
import java.util.Map;
-import org.apache.sling.osgi.installer.OsgiControllerServices;
-import org.osgi.service.cm.ConfigurationAdmin;
-import org.osgi.service.log.LogService;
-
/** Test the Storage class */
public class StorageTest {
- private final OsgiControllerServices ocs = new OsgiControllerServices() {
-
- public LogService getLogService() {
- return null;
- }
-
- public ConfigurationAdmin getConfigurationAdmin() {
- return null;
- }
- };
+ private final OsgiControllerContext ocs = new MockOsgiControllerContext();
@org.junit.Test public void testEmptyDataFile() throws Exception {
final Storage s = new Storage(Utilities.getTestFile(), ocs);
Modified: sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/TaskOrderingTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/TaskOrderingTest.java?rev=803922&r1=803921&r2=803922&view=diff
==============================================================================
--- sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/TaskOrderingTest.java (original)
+++ sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/TaskOrderingTest.java Thu Aug 13 15:10:05 2009
@@ -20,10 +20,13 @@
import static org.junit.Assert.fail;
+import java.io.IOException;
import java.util.Collection;
+import java.util.Hashtable;
import java.util.Set;
import java.util.TreeSet;
+import org.apache.sling.osgi.installer.InstallableResource;
import org.apache.sling.osgi.installer.impl.tasks.BundleInstallRemoveTask;
import org.apache.sling.osgi.installer.impl.tasks.BundleStartTask;
import org.apache.sling.osgi.installer.impl.tasks.ConfigInstallRemoveTask;
@@ -42,6 +45,10 @@
taskSet = new TreeSet<OsgiControllerTask>();
}
+ private static RegisteredResource getRegisteredResource(String url) throws IOException {
+ return new RegisteredResource(null, new InstallableResource(url, new Hashtable<String, Object>()));
+ }
+
private void assertOrder(int testId, Collection<OsgiControllerTask> actual, OsgiControllerTask [] expected) {
int index = 0;
for(OsgiControllerTask t : actual) {
@@ -53,13 +60,13 @@
}
@org.junit.Test
- public void testBasicOrdering() {
+ public void testBasicOrdering() throws Exception {
int testIndex = 1;
final OsgiControllerTask [] tasksInOrder = {
new ConfigInstallRemoveTask("someURI.cfg", null, null),
- new ConfigInstallRemoveTask("someURI.cfg", new MockInstallableData("someURI.cfg"), null),
+ new ConfigInstallRemoveTask("someURI.cfg", getRegisteredResource("someURI.cfg"), null),
new BundleInstallRemoveTask("someURI", null, null, null),
- new BundleInstallRemoveTask("someURI", new MockInstallableData("someURI.jar"), null, null),
+ new BundleInstallRemoveTask("someURI", getRegisteredResource("someURI.jar"), null, null),
new SynchronousRefreshPackagesTask(),
new BundleStartTask(0),
};
@@ -106,17 +113,17 @@
}
@org.junit.Test
- public void testMultipleConfigAndBundles() {
+ public void testMultipleConfigAndBundles() throws Exception {
int testIndex = 1;
final OsgiControllerTask [] tasksInOrder = {
new ConfigInstallRemoveTask("someURIa.cfg", null, null),
new ConfigInstallRemoveTask("someURIb.cfg", null, null),
- new ConfigInstallRemoveTask("someURIa.cfg", new MockInstallableData("someURIa.cfg"), null),
- new ConfigInstallRemoveTask("someURIb.cfg", new MockInstallableData("someURIb.cfg"), null),
+ new ConfigInstallRemoveTask("someURIa.cfg", getRegisteredResource("someURIa.cfg"), null),
+ new ConfigInstallRemoveTask("someURIb.cfg", getRegisteredResource("someURIb.cfg"), null),
new BundleInstallRemoveTask("someURIa.jar", null, null, null),
new BundleInstallRemoveTask("someURIb.jar", null, null, null),
- new BundleInstallRemoveTask("someURIa.jar", new MockInstallableData("someURIa.jar"), null, null),
- new BundleInstallRemoveTask("someURIb.jar", new MockInstallableData("someURIb.jar"), null, null),
+ new BundleInstallRemoveTask("someURIa.jar", getRegisteredResource("someURIa.jar"), null, null),
+ new BundleInstallRemoveTask("someURIb.jar", getRegisteredResource("someURIb.jar"), null, null),
new SynchronousRefreshPackagesTask(),
new BundleStartTask(0),
};
@@ -130,13 +137,13 @@
}
@org.junit.Test
- public void testMultipleRefreshAndStart() {
+ public void testMultipleRefreshAndStart() throws Exception {
int testIndex = 1;
final OsgiControllerTask [] tasksInOrder = {
new ConfigInstallRemoveTask("someURI.cfg", null, null),
- new ConfigInstallRemoveTask("someURI.cfg", new MockInstallableData("someURI.cfg"), null),
+ new ConfigInstallRemoveTask("someURI.cfg", getRegisteredResource("someURI.cfg"), null),
new BundleInstallRemoveTask("someURI", null, null, null),
- new BundleInstallRemoveTask("someURI", new MockInstallableData("someURI.jar"), null, null),
+ new BundleInstallRemoveTask("someURI", getRegisteredResource("someURI.jar"), null, null),
new SynchronousRefreshPackagesTask(),
new BundleStartTask(0),
new BundleStartTask(1),
Modified: sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/tasks/BundleInstallRemoveIgnoreTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/tasks/BundleInstallRemoveIgnoreTest.java?rev=803922&r1=803921&r2=803922&view=diff
==============================================================================
--- sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/tasks/BundleInstallRemoveIgnoreTest.java (original)
+++ sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/tasks/BundleInstallRemoveIgnoreTest.java Thu Aug 13 15:10:05 2009
@@ -21,10 +21,8 @@
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
-import org.apache.sling.osgi.installer.OsgiControllerServices;
+import org.apache.sling.osgi.installer.impl.MockOsgiControllerContext;
import org.osgi.framework.Version;
-import org.osgi.service.cm.ConfigurationAdmin;
-import org.osgi.service.log.LogService;
/** Test ignoring bundle updates based on Versions (SLING-1001) */
public class BundleInstallRemoveIgnoreTest {
@@ -34,17 +32,7 @@
private BundleInstallRemoveTask task;
@org.junit.Before public void setup() {
- OsgiControllerServices s = new OsgiControllerServices() {
- public LogService getLogService() {
- return null;
- }
-
- public ConfigurationAdmin getConfigurationAdmin() {
- return null;
- }
- };
-
- task = new BundleInstallRemoveTask(null, null, null, s);
+ task = new BundleInstallRemoveTask(null, null, null, new MockOsgiControllerContext());
}
@org.junit.Test public void testLowerVersion() {