You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by ga...@apache.org on 2011/09/28 17:46:52 UTC
svn commit: r1176927 -
/geronimo/server/trunk/plugins/aries/geronimo-aries/src/main/java/org/apache/geronimo/aries/ApplicationGBean.java
Author: gawor
Date: Wed Sep 28 15:46:52 2011
New Revision: 1176927
URL: http://svn.apache.org/viewvc?rev=1176927&view=rev
Log:
GERONIMO-6179: Improve logging and display dependent bundles that will also be refreshed
Modified:
geronimo/server/trunk/plugins/aries/geronimo-aries/src/main/java/org/apache/geronimo/aries/ApplicationGBean.java
Modified: geronimo/server/trunk/plugins/aries/geronimo-aries/src/main/java/org/apache/geronimo/aries/ApplicationGBean.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/aries/geronimo-aries/src/main/java/org/apache/geronimo/aries/ApplicationGBean.java?rev=1176927&r1=1176926&r2=1176927&view=diff
==============================================================================
--- geronimo/server/trunk/plugins/aries/geronimo-aries/src/main/java/org/apache/geronimo/aries/ApplicationGBean.java (original)
+++ geronimo/server/trunk/plugins/aries/geronimo-aries/src/main/java/org/apache/geronimo/aries/ApplicationGBean.java Wed Sep 28 15:46:52 2011
@@ -24,8 +24,10 @@ import java.io.InputStream;
import java.net.URI;
import java.text.MessageFormat;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.Enumeration;
import java.util.HashSet;
+import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.concurrent.CountDownLatch;
@@ -63,6 +65,7 @@ import org.osgi.framework.FrameworkListe
import org.osgi.framework.ServiceException;
import org.osgi.framework.ServiceReference;
import org.osgi.framework.Version;
+import org.osgi.service.packageadmin.ExportedPackage;
import org.osgi.service.packageadmin.PackageAdmin;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -138,28 +141,32 @@ public class ApplicationGBean implements
return ids;
}
- public String getApplicationContentBundleSymbolicName(long bundleId) {
+ private Bundle getBundle(long bundleId) {
for (Bundle content : applicationBundles) {
if (content.getBundleId() == bundleId) {
- return content.getSymbolicName();
+ return content;
}
}
return null;
}
+
+ public String getApplicationContentBundleSymbolicName(long bundleId) {
+ Bundle bundle = getBundle(bundleId);
+ return (bundle != null) ? bundle.getSymbolicName() : null;
+ }
public synchronized void updateApplicationContent(long bundleId, File bundleFile) throws Exception {
- Bundle targetBundle = null;
- for (Bundle content : applicationBundles) {
- if (content.getBundleId() == bundleId) {
- targetBundle = content;
- break;
- }
- }
+ Bundle targetBundle = getBundle(bundleId);
if (targetBundle == null) {
throw new IllegalArgumentException("Could not find bundle with id " + bundleId + " in the application");
}
+ String applicationName = application.getApplicationMetadata().getApplicationScope();
+ String bundleName = targetBundle.getSymbolicName();
+
+ LOG.info("Updating {} bundle in {} application", bundleName, applicationName);
+
BundleContext context = bundle.getBundleContext();
ServiceReference reference = null;
@@ -183,7 +190,14 @@ public class ApplicationGBean implements
Bundle[] bundles = new Bundle [] { targetBundle };
// resolve the bundle
if (!packageAdmin.resolveBundles(bundles)) {
- throw new BundleException("Updated bundle cannot be resolved");
+ throw new BundleException("Updated " + bundleName + " bundle cannot be resolved");
+ }
+
+ Set<Bundle> dependents = new HashSet<Bundle>();
+ collectDependentBundles(packageAdmin, dependents, targetBundle);
+ if (!dependents.isEmpty()) {
+ String bundleListString = bundleCollectionToString(dependents);
+ LOG.info("Update of {} bundle will cause the following bundles to be refreshed: {}", bundleName, bundleListString);
}
// install listener for package refresh
@@ -208,8 +222,12 @@ public class ApplicationGBean implements
if (BundleUtils.canStart(targetBundle)) {
targetBundle.start(Bundle.START_TRANSIENT);
}
+
+
+ LOG.info("Bundle {} was successfully updated in {} application", bundleName, applicationName);
+
} catch (Exception e) {
- LOG.debug("Error updating application", e);
+ LOG.error("Error updating " + bundleName + " bundle in " + applicationName + " application", e);
throw new Exception("Error updating application: " + e.getMessage());
} finally {
if (refreshListener != null) {
@@ -240,6 +258,36 @@ public class ApplicationGBean implements
}
}
+ private void collectDependentBundles(PackageAdmin packageAdmin, Set<Bundle> dependents, Bundle bundle) {
+ ExportedPackage[] exportedPackages = packageAdmin.getExportedPackages(bundle);
+ if (exportedPackages != null) {
+ for (ExportedPackage exportedPackage : exportedPackages) {
+ Bundle[] importingBundles = exportedPackage.getImportingBundles();
+ if (importingBundles != null) {
+ for (Bundle importingBundle : importingBundles) {
+ if (!dependents.contains(importingBundle)) {
+ dependents.add(importingBundle);
+ collectDependentBundles(packageAdmin, dependents, importingBundle);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ private static String bundleCollectionToString(Collection<Bundle> bundles) {
+ StringBuilder builder = new StringBuilder();
+ Iterator<Bundle> iterator = bundles.iterator();
+ while(iterator.hasNext()) {
+ Bundle bundle = iterator.next();
+ builder.append(bundle.getSymbolicName());
+ if (iterator.hasNext()) {
+ builder.append(", ");
+ }
+ }
+ return builder.toString();
+ }
+
private void updateArchive(Bundle bundle, File bundleFile) throws IOException {
File ebaArchive = installer.getApplicationLocation(configId);
if (ebaArchive == null || !ebaArchive.exists()) {