/* | |
* Copyright 2005 The Apache Software Foundation | |
* | |
* 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.apache.felix.jmood.core; | |
import java.io.IOException; | |
import java.net.MalformedURLException; | |
import java.net.URL; | |
import java.util.Iterator; | |
import java.util.Vector; | |
import org.apache.felix.jmood.AgentContext; | |
import org.apache.felix.jmood.utils.InstrumentationSupport; | |
import org.osgi.framework.Bundle; | |
import org.osgi.framework.BundleException; | |
import org.osgi.framework.Constants; | |
import org.osgi.service.packageadmin.PackageAdmin; | |
import org.osgi.service.startlevel.StartLevel; | |
public class CoreController implements CoreControllerMBean { | |
private AgentContext ac; | |
public CoreController(AgentContext ac) { | |
super(); | |
this.ac = ac; | |
} | |
/* | |
* (non-Javadoc) | |
* | |
* @see org.apache.felix.jmood.core.CoreControllerMBean#startBundle(java.lang.String) | |
*/ | |
public void startBundle(String bundleSymbolicName) throws BundleException, | |
BundleNotAvailableException { | |
String[] s = bundleSymbolicName.split(";"); | |
long id = InstrumentationSupport.getBundleId(bundleSymbolicName, ac); | |
ac.getBundleContext().getBundle(id).start(); | |
} | |
/* | |
* (non-Javadoc) | |
* | |
* @see org.apache.felix.jmood.core.CoreControllerMBean#batchStartBundles(java.lang.String[]) | |
*/ | |
public void batchStartBundles(String[] bundleSymbolicNames) | |
throws BundleException, BundleNotAvailableException { | |
if (bundleSymbolicNames == null) | |
throw new IllegalArgumentException( | |
"Array of bundles cannot be null"); | |
for (int i = 0; i < bundleSymbolicNames.length; i++) { | |
this.startBundle(bundleSymbolicNames[i]); | |
} | |
} | |
/* | |
* (non-Javadoc) | |
* | |
* @see org.apache.felix.jmood.core.CoreControllerMBean#stopBundle(java.lang.String) | |
*/ | |
public void stopBundle(String bundleSymbolicName) throws BundleException, | |
BundleNotAvailableException { | |
long id = InstrumentationSupport.getBundleId(bundleSymbolicName, ac); | |
ac.getBundleContext().getBundle(id).stop(); | |
} | |
/* | |
* (non-Javadoc) | |
* | |
* @see org.apache.felix.jmood.core.CoreControllerMBean#batchStopBundles(java.lang.String[]) | |
*/ | |
public void batchStopBundles(String[] bundleSymbolicNames) | |
throws BundleException, BundleNotAvailableException { | |
if (bundleSymbolicNames == null) | |
throw new IllegalArgumentException( | |
"Array of bundles cannot be null"); | |
for (int i = 0; i < bundleSymbolicNames.length; i++) { | |
this.stopBundle(bundleSymbolicNames[i]); | |
} | |
} | |
/* | |
* (non-Javadoc) | |
* | |
* @see org.apache.felix.jmood.core.CoreControllerMBean#updateBundle(java.lang.String) | |
*/ | |
public void updateBundle(String bundleSymbolicName) throws BundleException, | |
BundleNotAvailableException { | |
long id = InstrumentationSupport.getBundleId(bundleSymbolicName, ac); | |
ac.getBundleContext().getBundle(id).update(); | |
} | |
/* | |
* (non-Javadoc) | |
* | |
* @see org.apache.felix.jmood.core.CoreControllerMBean#batchUpdateBundles(java.lang.String[]) | |
*/ | |
public void batchUpdateBundles(String[] bundleSymbolicNames) | |
throws BundleException, BundleNotAvailableException { | |
if (bundleSymbolicNames == null) | |
throw new IllegalArgumentException( | |
"Array of bundles cannot be null"); | |
for (int i = 0; i < bundleSymbolicNames.length; i++) { | |
this.updateBundle(bundleSymbolicNames[i]); | |
} | |
} | |
/* | |
* (non-Javadoc) | |
* | |
* @see org.apache.felix.jmood.core.CoreControllerMBean#updateBundleFromUrl(java.lang.String, | |
* java.lang.String) | |
*/ | |
public void updateBundleFromUrl(String bundleSymbolicName, String url) | |
throws BundleException, BundleNotAvailableException, | |
MalformedURLException, IOException { | |
long id = InstrumentationSupport.getBundleId(bundleSymbolicName, ac); | |
ac.getBundleContext().getBundle(id).update((new URL(url)).openStream()); | |
} | |
/* | |
* (non-Javadoc) | |
* | |
* @see org.apache.felix.jmood.core.CoreControllerMBean#batchUpdateBundleFromUrl(java.lang.String[], | |
* java.lang.String[]) | |
*/ | |
public void batchUpdateBundleFromUrl(String[] bundleSymbolicNames, | |
String[] urls) throws BundleException, BundleNotAvailableException, | |
MalformedURLException, IOException { | |
if (bundleSymbolicNames == null || urls == null) | |
throw new IllegalArgumentException("arguments cannot be null"); | |
if (urls.length != bundleSymbolicNames.length) | |
throw new IllegalArgumentException( | |
"Each bundle needs a corresponding url"); | |
for (int i = 0; i < bundleSymbolicNames.length; i++) { | |
this.updateBundleFromUrl(bundleSymbolicNames[i], urls[i]); | |
} | |
} | |
/* | |
* (non-Javadoc) | |
* | |
* @see org.apache.felix.jmood.core.CoreControllerMBean#installBundle(java.lang.String) | |
*/ | |
public void installBundle(String bundleLocation) throws BundleException { | |
ac.getBundleContext().installBundle(bundleLocation); | |
} | |
/* | |
* (non-Javadoc) | |
* | |
* @see org.apache.felix.jmood.core.CoreControllerMBean#batchInstallBundle(java.lang.String[]) | |
*/ | |
public void batchInstallBundle(String[] bundleLocations) | |
throws BundleException { | |
for (int i = 0; i < bundleLocations.length; i++) { | |
this.installBundle(bundleLocations[i]); | |
} | |
} | |
/* | |
* (non-Javadoc) | |
* | |
* @see org.apache.felix.jmood.core.CoreControllerMBean#setBundleStartLevel(java.lang.String, | |
* int) | |
*/ | |
public void setBundleStartLevel(String bundleSymbolicName, int newlevel) | |
throws BundleNotAvailableException, ServiceNotAvailableException { | |
StartLevel sl = ac.getStartLevel(); | |
if (sl == null) { | |
ac.debug("tried to modify startlevel, but no service found"); | |
throw new ServiceNotAvailableException( | |
"Start Level service not available"); | |
} | |
long id = InstrumentationSupport.getBundleId(bundleSymbolicName, ac); | |
ac.getStartLevel().setBundleStartLevel( | |
ac.getBundleContext().getBundle(id), newlevel); | |
} | |
/* | |
* (non-Javadoc) | |
* | |
* @see org.apache.felix.jmood.core.CoreControllerMBean#batchSetBundleStartLevel(java.lang.String[], | |
* int[]) | |
*/ | |
public void batchSetBundleStartLevel(String[] bundleSymbolicNames, | |
int[] newlevels) { | |
if (bundleSymbolicNames == null || newlevels == null) | |
throw new IllegalArgumentException("arguments cannot be null"); | |
if (newlevels.length != bundleSymbolicNames.length) | |
throw new IllegalArgumentException( | |
"Each bundle needs a corresponding new level"); | |
for (int i = 0; i < newlevels.length; i++) { | |
} | |
} | |
/* | |
* (non-Javadoc) | |
* | |
* @see org.apache.felix.jmood.core.CoreControllerMBean#refreshPackages(java.lang.String[]) | |
*/ | |
public void refreshPackages(String[] bundleSymbolicNames) | |
throws BundleNotAvailableException, ServiceNotAvailableException { | |
if (bundleSymbolicNames == null) | |
throw new IllegalArgumentException("argument cannot be null"); | |
Bundle[] bundles = new Bundle[bundleSymbolicNames.length]; | |
for (int i = 0; i < bundles.length; i++) { | |
long id = InstrumentationSupport.getBundleId( | |
bundleSymbolicNames[i], ac); | |
bundles[i] = ac.getBundleContext().getBundle(id); | |
if (bundles[i] == null) | |
throw new BundleNotAvailableException( | |
"could not get bundle whose id" + id); | |
} | |
ac.getPackageadmin().refreshPackages(bundles); | |
} | |
/* | |
* (non-Javadoc) | |
* | |
* @see org.apache.felix.jmood.core.CoreControllerMBean#resolveBundles(java.lang.String[]) | |
*/ | |
public void resolveBundles(String[] bundleSymbolicNames) | |
throws BundleNotAvailableException, ServiceNotAvailableException { | |
if (bundleSymbolicNames == null) | |
throw new IllegalArgumentException("argument cannot be null"); | |
Bundle[] bundles = new Bundle[bundleSymbolicNames.length]; | |
for (int i = 0; i < bundles.length; i++) { | |
long id = InstrumentationSupport.getBundleId( | |
bundleSymbolicNames[i], ac); | |
bundles[i] = ac.getBundleContext().getBundle(id); | |
if (bundles[i] == null) | |
throw new BundleNotAvailableException( | |
"could not get bundle whose id" + id); | |
} | |
ac.getPackageadmin().resolveBundles(bundles); | |
} | |
/* | |
* (non-Javadoc) | |
* | |
* @see org.apache.felix.jmood.core.CoreControllerMBean#setPlatformStartLevel(int) | |
*/ | |
public void setPlatformStartLevel(int newlevel) | |
throws ServiceNotAvailableException { | |
ac.getStartLevel().setStartLevel(newlevel); | |
} | |
/* | |
* (non-Javadoc) | |
* | |
* @see org.apache.felix.jmood.core.CoreControllerMBean#getPlatformStartLevel() | |
*/ | |
public int getPlatformStartLevel() throws ServiceNotAvailableException { | |
return ac.getStartLevel().getStartLevel(); | |
} | |
/* | |
* (non-Javadoc) | |
* | |
* @see org.apache.felix.jmood.core.CoreControllerMBean#setInitialBundleStartLevel(int) | |
*/ | |
public void setInitialBundleStartLevel(int newlevel) | |
throws ServiceNotAvailableException { | |
ac.getStartLevel().setInitialBundleStartLevel(newlevel); | |
} | |
/* | |
* (non-Javadoc) | |
* | |
* @see org.apache.felix.jmood.core.CoreControllerMBean#getInitialBundleStartLevel() | |
*/ | |
public int getInitialBundleStartLevel() throws ServiceNotAvailableException { | |
return ac.getStartLevel().getInitialBundleStartLevel(); | |
} | |
/* | |
* (non-Javadoc) | |
* | |
* @see org.apache.felix.jmood.core.CoreControllerMBean#restartFramework() | |
*/ | |
public void restartFramework() throws NotImplementedException { | |
try { | |
ac.getBundleContext().getBundle(0).update(); | |
} catch (BundleException be) { | |
throw new NotImplementedException( | |
"Restarting not implemented in this framework", be); | |
} | |
} | |
/* | |
* (non-Javadoc) | |
* | |
* @see org.apache.felix.jmood.core.CoreControllerMBean#shutdownFramework() | |
*/ | |
public void shutdownFramework() throws NotImplementedException { | |
try { | |
ac.getBundleContext().getBundle(0).stop(); | |
} catch (BundleException be) { | |
throw new NotImplementedException( | |
"Shutting down not implemented in this framework", be); | |
} | |
} | |
/* | |
* (non-Javadoc) | |
* | |
* @see org.apache.felix.jmood.core.CoreControllerMBean#updateFramework() | |
*/ | |
public void updateFramework() throws NotImplementedException { | |
// TODO | |
throw new NotImplementedException( | |
"Feature not implemented for this framework"); | |
} | |
public void uninstallBundle(String bundleSymbolicName) | |
throws BundleNotAvailableException, BundleException { | |
if (bundleSymbolicName == null) | |
throw new IllegalArgumentException("argument cannot be null"); | |
String[] s = bundleSymbolicName.split(";"); | |
long id = InstrumentationSupport.getBundleId(bundleSymbolicName, ac); | |
ac.getBundleContext().getBundle(id).uninstall(); | |
} | |
} |