X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=runtime%2Forg.argeo.slc.support.osgi%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fslc%2Fosgi%2FOsgiRuntime.java;h=5fe9bd99c449858ee80454c4fe769305c18c1703;hb=098e868d40b2130c6735b1547247c61a5d88da95;hp=f82ceffbaf9092b6b80efdfda6ad266338e48389;hpb=51f357dd0caf8896edb5058b2411d85fb9a0c733;p=gpl%2Fargeo-slc.git diff --git a/runtime/org.argeo.slc.support.osgi/src/main/java/org/argeo/slc/osgi/OsgiRuntime.java b/runtime/org.argeo.slc.support.osgi/src/main/java/org/argeo/slc/osgi/OsgiRuntime.java index f82ceffba..5fe9bd99c 100644 --- a/runtime/org.argeo.slc.support.osgi/src/main/java/org/argeo/slc/osgi/OsgiRuntime.java +++ b/runtime/org.argeo.slc.support.osgi/src/main/java/org/argeo/slc/osgi/OsgiRuntime.java @@ -1,24 +1,44 @@ +/* + * Copyright (C) 2010 Mathieu Baudier + * + * 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, - BundleContextAware, ResourceLoaderAware { +public class OsgiRuntime implements BundleContextAware, ResourceLoaderAware, + DynamicRuntime { private String uuid = UUID.randomUUID().toString(); private BundleContext bundleContext; private ResourceLoader resourceLoader; @@ -32,12 +52,74 @@ public class OsgiRuntime implements ModularDeployedSystem, 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; }