Author: mahrwald
Date: Fri Sep 23 12:44:33 2011
New Revision: 1174710
URL: http://svn.apache.org/viewvc?rev=1174710&view=rev
Log:
ARIES-750: Make sure composites inside applications are cleaned up
Modified:
aries/trunk/application/application-runtime-framework-management/src/main/java/org/apache/aries/application/runtime/framework/management/BundleFrameworkManagerImpl.java
Modified:
aries/trunk/application/application-runtime-framework-management/src/main/java/org/apache/aries/application/runtime/framework/management/BundleFrameworkManagerImpl.java
URL:
http://svn.apache.org/viewvc/aries/trunk/application/application-runtime-framework-management/src/main/java/org/apache/aries/application/runtime/framework/management/BundleFrameworkManagerImpl.java?rev=1174710&r1=1174709&r2=1174710&view=diff
==============================================================================
---
aries/trunk/application/application-runtime-framework-management/src/main/java/org/apache/aries/application/runtime/framework/management/BundleFrameworkManagerImpl.java
(original)
+++
aries/trunk/application/application-runtime-framework-management/src/main/java/org/apache/aries/application/runtime/framework/management/BundleFrameworkManagerImpl.java
Fri Sep 23 12:44:33 2011
@@ -32,6 +32,9 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
+import java.util.concurrent.Semaphore;
+import java.util.concurrent.TimeUnit;
+
import org.apache.aries.application.DeploymentContent;
import org.apache.aries.application.DeploymentMetadata;
import org.apache.aries.application.management.AriesApplication;
@@ -50,6 +53,11 @@ import org.osgi.framework.BundleExceptio
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import org.osgi.service.packageadmin.PackageAdmin;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.FrameworkListener;
+import org.osgi.framework.FrameworkEvent;
+
public class BundleFrameworkManagerImpl implements BundleFrameworkManager
{
private static final Logger LOGGER =
LoggerFactory.getLogger(BundleFrameworkManagerImpl.class);
@@ -212,7 +220,41 @@ public class BundleFrameworkManagerImpl
{
synchronized (BundleFrameworkManager.SHARED_FRAMEWORK_LOCK) {
BundleFramework framework = getBundleFramework(b);
- if (framework != null) {
+ if (framework != null) {
+ for (Bundle bundle : new ArrayList<Bundle>(framework.getBundles())) {
+ framework.uninstall(bundle);
+ }
+
+ BundleContext ctx = framework.getIsolatedBundleContext();
+ ServiceReference ref =
ctx.getServiceReference(PackageAdmin.class.getName());
+ if (ref != null) {
+ try {
+ PackageAdmin pa = (PackageAdmin) ctx.getService(ref);
+ if (pa != null) {
+ final Semaphore sem = new Semaphore(0);
+ FrameworkListener listener = new FrameworkListener() {
+ public void frameworkEvent(FrameworkEvent event)
+ {
+ if (event.getType() == FrameworkEvent.PACKAGES_REFRESHED) {
+ sem.release();
+ }
+ }
+ };
+
+ ctx.addFrameworkListener(listener);
+ pa.refreshPackages(null);
+
+ try {
+ sem.tryAcquire(60, TimeUnit.SECONDS);
+ } catch (InterruptedException ie) {}
+
+ ctx.removeFrameworkListener(listener);
+ }
+ } finally {
+ ctx.ungetService(ref);
+ }
+ }
+
framework.close();
// clean up our maps so we don't leak memory
@@ -251,8 +293,9 @@ public class BundleFrameworkManagerImpl
// Stop all bundles inside the framework
if (framework != null) // App Content
{
- for (Bundle bundle : framework.getBundles())
+ for (Bundle bundle : new ArrayList<Bundle>(framework.getBundles())) {
framework.stop(bundle);
+ }
}
// Do not stop shared bundles