]> git.argeo.org Git - gpl/argeo-slc.git/blobdiff - runtime/org.argeo.slc.support.osgi/src/main/java/org/argeo/slc/osgi/OsgiRuntime.java
Revert explicit security context propagation
[gpl/argeo-slc.git] / runtime / org.argeo.slc.support.osgi / src / main / java / org / argeo / slc / osgi / OsgiRuntime.java
index f82ceffbaf9092b6b80efdfda6ad266338e48389..5fe9bd99c449858ee80454c4fe769305c18c1703 100644 (file)
@@ -1,24 +1,44 @@
+/*
+ * Copyright (C) 2010 Mathieu Baudier <mbaudier@argeo.org>
+ *
+ * Licensed 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.argeo.slc.osgi;
 
 import java.util.ArrayList;
 import java.util.List;
 import java.util.UUID;
 
+import org.argeo.slc.NameVersion;
+import org.argeo.slc.SlcException;
+import org.argeo.slc.StreamReadable;
 import org.argeo.slc.UnsupportedException;
 import org.argeo.slc.build.Distribution;
-import org.argeo.slc.core.build.ResourceDistribution;
+import org.argeo.slc.core.build.VersionedResourceDistribution;
 import org.argeo.slc.deploy.DeploymentData;
-import org.argeo.slc.deploy.ModularDeployedSystem;
+import org.argeo.slc.deploy.DynamicRuntime;
 import org.argeo.slc.deploy.TargetData;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleException;
 import org.springframework.context.ResourceLoaderAware;
 import org.springframework.core.io.Resource;
 import org.springframework.core.io.ResourceLoader;
 import org.springframework.osgi.context.BundleContextAware;
 
-public class OsgiRuntime implements ModularDeployedSystem<OsgiBundle>,
-               BundleContextAware, ResourceLoaderAware {
+public class OsgiRuntime implements BundleContextAware, ResourceLoaderAware,
+               DynamicRuntime<OsgiBundle> {
        private String uuid = UUID.randomUUID().toString();
        private BundleContext bundleContext;
        private ResourceLoader resourceLoader;
@@ -32,12 +52,74 @@ public class OsgiRuntime implements ModularDeployedSystem<OsgiBundle>,
                        String location = bundle.getLocation();
                        if (location != null) {
                                Resource resource = resourceLoader.getResource(location);
-                               osgiBundle.setDistribution(new ResourceDistribution(resource));
+                               osgiBundle
+                                               .setResourceDistribution(new VersionedResourceDistribution(
+                                                               osgiBundle.getName(), osgiBundle.getVersion(),
+                                                               resource));
                        }
                }
                return modules;
        }
 
+       public OsgiBundle installModule(Distribution distribution) {
+               if (!(distribution instanceof StreamReadable))
+                       throw new UnsupportedException("distribution", distribution);
+
+               StreamReadable sr = (StreamReadable) distribution;
+               Bundle bundle;
+               try {
+                       bundle = bundleContext.installBundle(sr.toString(), sr
+                                       .getInputStream());
+               } catch (BundleException e) {
+                       throw new SlcException(
+                                       "Cannot install OSGi bundle " + distribution, e);
+               }
+               return new OsgiBundle(bundle);
+       }
+
+       public void updateModule(NameVersion nameVersion) {
+               Bundle bundle = findBundle(nameVersion);
+               try {
+                       bundle.update();
+               } catch (BundleException e) {
+                       throw new SlcException("Cannot update " + bundle, e);
+               }
+       }
+
+       public void uninstallModule(NameVersion nameVersion) {
+               Bundle bundle = findBundle(nameVersion);
+               try {
+                       bundle.uninstall();
+               } catch (BundleException e) {
+                       throw new SlcException("Cannot uninstall " + bundle, e);
+               }
+       }
+
+       public void startModule(NameVersion nameVersion) {
+               Bundle bundle = findBundle(nameVersion);
+               try {
+                       bundle.start();
+                       // TODO: use bundle manager
+               } catch (BundleException e) {
+                       throw new SlcException("Cannot uninstall " + bundle, e);
+               }
+       }
+
+       protected Bundle findBundle(NameVersion nameVersion) {
+               Bundle[] bundles = bundleContext.getBundles();
+               for (Bundle bundle : bundles) {
+                       OsgiBundle osgiBundle = new OsgiBundle(bundle);
+                       if (osgiBundle.equals(nameVersion)) {
+                               return bundle;
+                       }
+               }
+               throw new SlcException("Could not find bundle " + nameVersion);
+       }
+
+       public void shutdown() {
+               throw new UnsupportedException();
+       }
+
        public String getDeployedSystemId() {
                return uuid;
        }