You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by cz...@apache.org on 2011/05/26 09:17:38 UTC
svn commit: r1127807 - in /sling/trunk/installer/core: ./
src/main/java/org/apache/sling/installer/core/impl/tasks/
Author: cziegeler
Date: Thu May 26 07:17:38 2011
New Revision: 1127807
URL: http://svn.apache.org/viewvc?rev=1127807&view=rev
Log:
SLING-2060 : Refresh bundles with optional dependencies if such dependency is installed
Added:
sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/tasks/RefreshOptionalPackagesTask.java (with props)
Modified:
sling/trunk/installer/core/pom.xml
sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/tasks/BundleInstallTask.java
sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/tasks/BundleUpdateTask.java
sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/tasks/SynchronousRefreshPackagesTask.java
Modified: sling/trunk/installer/core/pom.xml
URL: http://svn.apache.org/viewvc/sling/trunk/installer/core/pom.xml?rev=1127807&r1=1127806&r2=1127807&view=diff
==============================================================================
--- sling/trunk/installer/core/pom.xml (original)
+++ sling/trunk/installer/core/pom.xml Thu May 26 07:17:38 2011
@@ -66,7 +66,8 @@
</Private-Package>
<Embed-Dependency>
org.apache.felix.configadmin;inline="org/apache/felix/cm/file/ConfigurationHandler.*",
- org.osgi.compendium;inline="org/osgi/util/tracker/*"
+ org.osgi.compendium;inline="org/osgi/util/tracker/*",
+ org.apache.sling.commons.osgi;inline="org/apache/sling/commons/osgi/ManifestHeader*.*"
</Embed-Dependency>
</instructions>
</configuration>
@@ -135,6 +136,12 @@
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
</dependency>
+ <dependency>
+ <groupId>org.apache.sling</groupId>
+ <artifactId>org.apache.sling.commons.osgi</artifactId>
+ <version>2.0.6</version>
+ <scope>provided</scope>
+ </dependency>
<!-- We use a class from the config admin implementation to read config files -->
<dependency>
<groupId>org.apache.felix</groupId>
Modified: sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/tasks/BundleInstallTask.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/tasks/BundleInstallTask.java?rev=1127807&r1=1127806&r2=1127807&view=diff
==============================================================================
--- sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/tasks/BundleInstallTask.java (original)
+++ sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/tasks/BundleInstallTask.java Thu May 26 07:17:38 2011
@@ -84,6 +84,7 @@ public class BundleInstallTask extends A
// mark this resource as installed and to be started
this.getResource().setAttribute(BundleTaskCreator.ATTR_START, "true");
ctx.addTaskToCurrentCycle(new BundleStartTask(getResourceGroup(), b.getBundleId(), this.creator));
+ ctx.addTaskToNextCycle(new RefreshOptionalPackagesTask(this.creator));
} catch (Exception ex) {
// if something goes wrong we simply try it again
this.getLogger().debug("Exception during install of bundle " + this.getResource() + " : " + ex.getMessage() + ". Retrying later.", ex);
Modified: sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/tasks/BundleUpdateTask.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/tasks/BundleUpdateTask.java?rev=1127807&r1=1127806&r2=1127807&view=diff
==============================================================================
--- sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/tasks/BundleUpdateTask.java (original)
+++ sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/tasks/BundleUpdateTask.java Thu May 26 07:17:38 2011
@@ -89,7 +89,8 @@ public class BundleUpdateTask extends Ab
} else {
this.setFinishedState(ResourceState.INSTALLED);
}
- ctx.addTaskToCurrentCycle(new SynchronousRefreshPackagesTask(this.creator));
+ ctx.addTaskToNextCycle(new SynchronousRefreshPackagesTask(this.creator));
+ ctx.addTaskToCurrentCycle(new RefreshOptionalPackagesTask(this.creator));
this.getLogger().debug("Bundle updated: {}/{}", b.getBundleId(), b.getSymbolicName());
} catch (Exception e) {
if ( !canRetry ) {
Added: sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/tasks/RefreshOptionalPackagesTask.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/tasks/RefreshOptionalPackagesTask.java?rev=1127807&view=auto
==============================================================================
--- sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/tasks/RefreshOptionalPackagesTask.java (added)
+++ sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/tasks/RefreshOptionalPackagesTask.java Thu May 26 07:17:38 2011
@@ -0,0 +1,132 @@
+/*
+ * 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.installer.core.impl.tasks;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.sling.commons.osgi.ManifestHeader;
+import org.apache.sling.installer.api.tasks.InstallationContext;
+import org.apache.sling.installer.core.impl.AbstractInstallTask;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.Constants;
+import org.osgi.service.packageadmin.ExportedPackage;
+import org.osgi.service.packageadmin.PackageAdmin;
+
+/**
+ * Checks for bundles with optional imports that are not wired.
+ */
+public class RefreshOptionalPackagesTask extends AbstractInstallTask {
+
+ private static final String REFRESH_PACKAGES_ORDER = "80-";
+
+ private static final String DIRECTIVE = "resolution";
+ private static final String DIRECTIVE_OPTIONAL = "optional";
+ private static final String MARKER = DIRECTIVE + ":=" + DIRECTIVE_OPTIONAL;
+
+ /** Tracker for the package admin. */
+ private final BundleTaskCreator bundleTaskCreator;
+
+ public RefreshOptionalPackagesTask(final BundleTaskCreator bundleTaskCreator) {
+ super(null);
+ this.bundleTaskCreator = bundleTaskCreator;
+ }
+
+ @Override
+ public String getSortKey() {
+ return REFRESH_PACKAGES_ORDER;
+ }
+
+ @Override
+ public String toString() {
+ return getClass().getSimpleName();
+ }
+
+ private PackageAdmin getPackageAdmin() {
+ return this.bundleTaskCreator.getPackageAdmin();
+ }
+
+ /**
+ * @see org.apache.sling.installer.api.tasks.InstallTask#execute(org.apache.sling.installer.api.tasks.InstallationContext)
+ */
+ public void execute(final InstallationContext ctx) {
+ if ( true ) {
+ return;
+ }
+ getLogger().info("** Invoking refresh optional packages!");
+ final PackageAdmin packageAdmin = this.getPackageAdmin();
+
+ ExportedPackage[] exports = null;
+ final List<Bundle> refreshBundles = new ArrayList<Bundle>();
+ final Bundle[] bundles = this.bundleTaskCreator.getBundleContext().getBundles();
+ for(final Bundle bundle : bundles) {
+ if ( bundle.getState() == Bundle.RESOLVED || bundle.getState() == Bundle.ACTIVE ) {
+ final String importHeader = (String)bundle.getHeaders().get(Constants.IMPORT_PACKAGE);
+ if ( importHeader != null && importHeader.contains(MARKER) ) {
+ boolean needsRefresh = false;
+ final ManifestHeader mf = ManifestHeader.parse(importHeader);
+ for(final ManifestHeader.Entry entry : mf.getEntries()) {
+ if ( DIRECTIVE_OPTIONAL.equals(entry.getDirectiveValue(DIRECTIVE)) ) {
+ final String pkgName = entry.getValue();
+ getLogger().info("Found optional dependency {} in bundle {}", pkgName, bundle.getSymbolicName());
+ if ( exports == null ) {
+ exports = packageAdmin.getExportedPackages( ( Bundle ) null );
+ // just a sanity check
+ if ( exports == null ) {
+ exports = new ExportedPackage[0];
+ }
+ }
+ boolean wiringFound = false;
+ boolean packageFound = false;
+ for(final ExportedPackage ep : exports) {
+ if ( ep.getName().equals(pkgName) ) {
+ packageFound = true;
+ final Bundle[] importingBundles = ep.getImportingBundles();
+ for(final Bundle ib : importingBundles) {
+ if ( ib.getBundleId() == bundle.getBundleId() ) {
+ wiringFound = true;
+ break;
+ }
+ }
+ }
+ if ( wiringFound ) {
+ break;
+ }
+ }
+ if ( !wiringFound && packageFound ) {
+ getLogger().info("Found unresolved optional dependency {} in bundle {} which might now be resolvable", pkgName, bundle.getSymbolicName());
+ needsRefresh = true;
+ break;
+ }
+ }
+ }
+
+ if ( needsRefresh ) {
+ refreshBundles.add(bundle);
+ }
+ }
+ }
+ }
+ if ( refreshBundles.size() > 0 ) {
+ getLogger().info("** Refreshing bundles {}", refreshBundles);
+ packageAdmin.refreshPackages(refreshBundles.toArray(new Bundle[refreshBundles.size()]));
+ }
+ getLogger().info("** Finished refresh optional packages!");
+ }
+}
Propchange: sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/tasks/RefreshOptionalPackagesTask.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/tasks/RefreshOptionalPackagesTask.java
------------------------------------------------------------------------------
svn:keywords = author date id revision rev url
Propchange: sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/tasks/RefreshOptionalPackagesTask.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/tasks/SynchronousRefreshPackagesTask.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/tasks/SynchronousRefreshPackagesTask.java?rev=1127807&r1=1127806&r2=1127807&view=diff
==============================================================================
--- sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/tasks/SynchronousRefreshPackagesTask.java (original)
+++ sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/tasks/SynchronousRefreshPackagesTask.java Thu May 26 07:17:38 2011
@@ -116,6 +116,5 @@ public class SynchronousRefreshPackagesT
} finally {
this.bundleTaskCreator.getBundleContext().removeFrameworkListener(this);
}
- return;
}
}