You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by no...@apache.org on 2010/02/15 17:50:43 UTC
svn commit: r910261 - in /incubator/aries/trunk/application:
application-api/src/main/java/org/apache/aries/application/management/
application-management/src/main/java/org/apache/aries/application/management/impl/
application-management/src/test/java/...
Author: not
Date: Mon Feb 15 16:50:42 2010
New Revision: 910261
URL: http://svn.apache.org/viewvc?rev=910261&view=rev
Log:
ARIES-162 Do bundle install as a result of installing an app, rather than as a result of starting an app.
Modified:
incubator/aries/trunk/application/application-api/src/main/java/org/apache/aries/application/management/ApplicationContextManager.java
incubator/aries/trunk/application/application-api/src/main/java/org/apache/aries/application/management/AriesApplicationManager.java
incubator/aries/trunk/application/application-api/src/main/java/org/apache/aries/application/management/AriesApplicationResolver.java
incubator/aries/trunk/application/application-management/src/main/java/org/apache/aries/application/management/impl/AriesApplicationManagerImpl.java
incubator/aries/trunk/application/application-management/src/test/java/org/apache/aries/application/management/impl/AriesApplicationManagerImplTest.java
incubator/aries/trunk/application/application-runtime/src/main/java/org/apache/aries/application/runtime/defaults/NoOpResolver.java
incubator/aries/trunk/application/application-runtime/src/main/java/org/apache/aries/application/runtime/impl/ApplicationContextImpl.java
incubator/aries/trunk/application/application-runtime/src/main/java/org/apache/aries/application/runtime/impl/ApplicationContextManagerImpl.java
Modified: incubator/aries/trunk/application/application-api/src/main/java/org/apache/aries/application/management/ApplicationContextManager.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/application/application-api/src/main/java/org/apache/aries/application/management/ApplicationContextManager.java?rev=910261&r1=910260&r2=910261&view=diff
==============================================================================
--- incubator/aries/trunk/application/application-api/src/main/java/org/apache/aries/application/management/ApplicationContextManager.java (original)
+++ incubator/aries/trunk/application/application-api/src/main/java/org/apache/aries/application/management/ApplicationContextManager.java Mon Feb 15 16:50:42 2010
@@ -21,6 +21,8 @@
import java.util.Set;
+import org.osgi.framework.BundleException;
+
/**
* An ApplicationContextManager is responsible for managing Aries applications in the
* server's OSGi runtime. We expect that many projects consuming this code will provide
@@ -33,8 +35,10 @@
* started via an ApplicationContext.
* @param app The applicaton for which to obtain an ApplicationContext.
* @return ApplicationContext
+ * @throws BundleException
+ * @throws ManagementException
*/
- public ApplicationContext getApplicationContext(AriesApplication app);
+ public ApplicationContext getApplicationContext(AriesApplication app) throws BundleException, ManagementException;
/**
* @return The set of all ApplicationContexts.
Modified: incubator/aries/trunk/application/application-api/src/main/java/org/apache/aries/application/management/AriesApplicationManager.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/application/application-api/src/main/java/org/apache/aries/application/management/AriesApplicationManager.java?rev=910261&r1=910260&r2=910261&view=diff
==============================================================================
--- incubator/aries/trunk/application/application-api/src/main/java/org/apache/aries/application/management/AriesApplicationManager.java (original)
+++ incubator/aries/trunk/application/application-api/src/main/java/org/apache/aries/application/management/AriesApplicationManager.java Mon Feb 15 16:50:42 2010
@@ -53,8 +53,9 @@
* @param app Application to install
* @return ApplicationContext, a handle to an application in the runtime
* @throws BundleException
+ * @throws ManagementException
*/
- public ApplicationContext install(AriesApplication app) throws BundleException;
+ public ApplicationContext install(AriesApplication app) throws BundleException, ManagementException;
/**
* Uninstall an AriesApplication - i.e. unload its bundles from the runtime.
Modified: incubator/aries/trunk/application/application-api/src/main/java/org/apache/aries/application/management/AriesApplicationResolver.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/application/application-api/src/main/java/org/apache/aries/application/management/AriesApplicationResolver.java?rev=910261&r1=910260&r2=910261&view=diff
==============================================================================
--- incubator/aries/trunk/application/application-api/src/main/java/org/apache/aries/application/management/AriesApplicationResolver.java (original)
+++ incubator/aries/trunk/application/application-api/src/main/java/org/apache/aries/application/management/AriesApplicationResolver.java Mon Feb 15 16:50:42 2010
@@ -21,6 +21,8 @@
import java.util.Set;
+import org.osgi.framework.Version;
+
public interface AriesApplicationResolver {
/** Resolve an AriesApplication
@@ -31,4 +33,14 @@
* @throws ResolverException if the application cannot be resolved.
*/
Set<BundleInfo> resolve (AriesApplication app) throws ResolverException ;
+
+ /**
+ * Return the info for the requested bundle. If no matching bundle exists in the
+ * resolver runtime then null is returned.
+ *
+ * @param bundleSymbolicName the bundle symbolic name.
+ * @param bundleVersion the version of the bundle
+ * @return the BundleInfo for the requested bundle, or null if none could be found.
+ */
+ BundleInfo getBundleInfo(String bundleSymbolicName, Version bundleVersion);
}
Modified: incubator/aries/trunk/application/application-management/src/main/java/org/apache/aries/application/management/impl/AriesApplicationManagerImpl.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/application/application-management/src/main/java/org/apache/aries/application/management/impl/AriesApplicationManagerImpl.java?rev=910261&r1=910260&r2=910261&view=diff
==============================================================================
--- incubator/aries/trunk/application/application-management/src/main/java/org/apache/aries/application/management/impl/AriesApplicationManagerImpl.java (original)
+++ incubator/aries/trunk/application/application-management/src/main/java/org/apache/aries/application/management/impl/AriesApplicationManagerImpl.java Mon Feb 15 16:50:42 2010
@@ -226,7 +226,7 @@
return null;
}
- public ApplicationContext install(AriesApplication app) {
+ public ApplicationContext install(AriesApplication app) throws BundleException, ManagementException {
ApplicationContext result = _applicationContextManager.getApplicationContext(app);
return result;
}
Modified: incubator/aries/trunk/application/application-management/src/test/java/org/apache/aries/application/management/impl/AriesApplicationManagerImplTest.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/application/application-management/src/test/java/org/apache/aries/application/management/impl/AriesApplicationManagerImplTest.java?rev=910261&r1=910260&r2=910261&view=diff
==============================================================================
--- incubator/aries/trunk/application/application-management/src/test/java/org/apache/aries/application/management/impl/AriesApplicationManagerImplTest.java (original)
+++ incubator/aries/trunk/application/application-management/src/test/java/org/apache/aries/application/management/impl/AriesApplicationManagerImplTest.java Mon Feb 15 16:50:42 2010
@@ -74,6 +74,10 @@
void setNextResult (Set<BundleInfo> r) {
nextResult = r;
}
+ public BundleInfo getBundleInfo(String bundleSymbolicName, Version bundleVersion)
+ {
+ return null;
+ }
}
static class DummyLocalPlatform implements LocalPlatform {
Modified: incubator/aries/trunk/application/application-runtime/src/main/java/org/apache/aries/application/runtime/defaults/NoOpResolver.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/application/application-runtime/src/main/java/org/apache/aries/application/runtime/defaults/NoOpResolver.java?rev=910261&r1=910260&r2=910261&view=diff
==============================================================================
--- incubator/aries/trunk/application/application-runtime/src/main/java/org/apache/aries/application/runtime/defaults/NoOpResolver.java (original)
+++ incubator/aries/trunk/application/application-runtime/src/main/java/org/apache/aries/application/runtime/defaults/NoOpResolver.java Mon Feb 15 16:50:42 2010
@@ -23,6 +23,7 @@
import org.apache.aries.application.management.AriesApplication;
import org.apache.aries.application.management.AriesApplicationResolver;
import org.apache.aries.application.management.BundleInfo;
+import org.osgi.framework.Version;
/** AriesApplicationManager requires that there be at least one
* AriesApplicationResolver service present. This class provides a null
@@ -36,4 +37,8 @@
return app.getBundleInfo();
}
-}
+ public BundleInfo getBundleInfo(String bundleSymbolicName, Version bundleVersion)
+ {
+ return null;
+ }
+}
\ No newline at end of file
Modified: incubator/aries/trunk/application/application-runtime/src/main/java/org/apache/aries/application/runtime/impl/ApplicationContextImpl.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/application/application-runtime/src/main/java/org/apache/aries/application/runtime/impl/ApplicationContextImpl.java?rev=910261&r1=910260&r2=910261&view=diff
==============================================================================
--- incubator/aries/trunk/application/application-runtime/src/main/java/org/apache/aries/application/runtime/impl/ApplicationContextImpl.java (original)
+++ incubator/aries/trunk/application/application-runtime/src/main/java/org/apache/aries/application/runtime/impl/ApplicationContextImpl.java Mon Feb 15 16:50:42 2010
@@ -19,17 +19,26 @@
package org.apache.aries.application.runtime.impl;
+import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.List;
import java.util.Map;
import java.util.Set;
+import org.apache.aries.application.DeploymentContent;
+import org.apache.aries.application.DeploymentMetadata;
import org.apache.aries.application.management.ApplicationContext;
import org.apache.aries.application.management.AriesApplication;
+import org.apache.aries.application.management.AriesApplicationResolver;
import org.apache.aries.application.management.BundleInfo;
+import org.apache.aries.application.management.ManagementException;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.BundleException;
+import org.osgi.framework.ServiceException;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.Version;
public class ApplicationContextImpl implements ApplicationContext {
@@ -38,10 +47,63 @@
private ApplicationState _state;
private BundleContext _bundleContext;
- public ApplicationContextImpl (BundleContext b, AriesApplication app) {
+ public ApplicationContextImpl (BundleContext b, AriesApplication app) throws BundleException, ManagementException {
_bundleContext = b;
_application = app;
_bundles = new HashMap<BundleInfo, Bundle>();
+
+ DeploymentMetadata meta = _application.getDeploymentMetadata();
+
+ AriesApplicationResolver resolver = null;
+
+ ServiceReference ref = b.getServiceReference(AriesApplicationResolver.class.getName());
+
+ if (ref != null) resolver = (AriesApplicationResolver) b.getService(ref);
+
+ if (resolver == null) {
+ throw new ManagementException(new ServiceException(AriesApplicationResolver.class.getName(), ServiceException.UNREGISTERED));
+ }
+
+ try {
+ for (DeploymentContent content : meta.getApplicationDeploymentContents()) {
+ String bundleSymbolicName = content.getContentName();
+ Version bundleVersion = content.getExactVersion();
+
+ BundleInfo bundleInfo = null;
+
+ for (BundleInfo info : _application.getBundleInfo()) {
+ if (info.getSymbolicName().equals(bundleSymbolicName) &&
+ info.getVersion().equals(bundleVersion)) {
+ bundleInfo = info;
+ break;
+ }
+ }
+
+ if (bundleInfo == null) {
+ // call out to the bundle repository.
+ bundleInfo = resolver.getBundleInfo(bundleSymbolicName, bundleVersion);
+ }
+
+ if (bundleInfo == null) {
+ throw new ManagementException("Cound not find bundles: " + bundleSymbolicName + "_" + bundleVersion);
+ }
+
+ Bundle bundle = _bundleContext.installBundle(bundleInfo.getLocation());
+
+ _bundles.put(bundleInfo, bundle);
+ }
+ } catch (BundleException be) {
+ for (Bundle bundle : _bundles.values()) {
+ bundle.uninstall();
+ }
+
+ _bundles.clear();
+
+ throw be;
+ } finally {
+ if (resolver != null) b.ungetService(ref);
+ }
+
_state = ApplicationState.INSTALLED;
}
@@ -61,20 +123,32 @@
return _state;
}
- public void start() throws BundleException {
- Set<BundleInfo> bundleInfo = _application.getBundleInfo();
- for (BundleInfo bi : bundleInfo) {
- // TODO: proper synchronisation!
- if (_bundles.containsKey(bi)) {
- Bundle b = _bundles.get(bi);
+ public void start() throws BundleException
+ {
+ _state = ApplicationState.STARTING;
+
+ List<Bundle> bundlesWeStarted = new ArrayList<Bundle>();
+
+ try {
+ for (Bundle b : _bundles.values()) {
if (b.getState() != Bundle.ACTIVE) {
- b.start();
+ b.start(Bundle.START_ACTIVATION_POLICY);
+ bundlesWeStarted.add(b);
+ }
+ }
+ } catch (BundleException be) {
+ for (Bundle b : bundlesWeStarted) {
+ try {
+ b.stop();
+ } catch (BundleException be2) {
+ // we are doing tidyup here, so we don't want to replace the bundle exception
+ // that occurred during start with one from stop. We also want to try to stop
+ // all the bundles we started even if some bundles wouldn't stop.
}
- } else {
- Bundle b = _bundleContext.installBundle(bi.getLocation());
- b.start();
- _bundles.put(bi, b);
}
+
+ _state = ApplicationState.INSTALLED;
+ throw be;
}
_state = ApplicationState.ACTIVE;
}
Modified: incubator/aries/trunk/application/application-runtime/src/main/java/org/apache/aries/application/runtime/impl/ApplicationContextManagerImpl.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/application/application-runtime/src/main/java/org/apache/aries/application/runtime/impl/ApplicationContextManagerImpl.java?rev=910261&r1=910260&r2=910261&view=diff
==============================================================================
--- incubator/aries/trunk/application/application-runtime/src/main/java/org/apache/aries/application/runtime/impl/ApplicationContextManagerImpl.java (original)
+++ incubator/aries/trunk/application/application-runtime/src/main/java/org/apache/aries/application/runtime/impl/ApplicationContextManagerImpl.java Mon Feb 15 16:50:42 2010
@@ -28,7 +28,9 @@
import org.apache.aries.application.management.ApplicationContext;
import org.apache.aries.application.management.ApplicationContextManager;
import org.apache.aries.application.management.AriesApplication;
+import org.apache.aries.application.management.ManagementException;
import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleException;
public class ApplicationContextManagerImpl implements ApplicationContextManager {
@@ -43,7 +45,7 @@
_bundleContext = b;
}
- public ApplicationContext getApplicationContext(AriesApplication app) {
+ public ApplicationContext getApplicationContext(AriesApplication app) throws BundleException, ManagementException {
ApplicationContext result;
if (_appToContextMap.containsKey(app)) {
result = _appToContextMap.get(app);