package aQute.launcher.minifw;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.security.cert.X509Certificate;
import java.util.Collection;
import java.util.Dictionary;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.BundleException;
import org.osgi.framework.BundleListener;
import org.osgi.framework.Filter;
import org.osgi.framework.FrameworkEvent;
import org.osgi.framework.FrameworkListener;
import org.osgi.framework.FrameworkUtil;
import org.osgi.framework.InvalidSyntaxException;
import org.osgi.framework.ServiceListener;
import org.osgi.framework.ServiceReference;
import org.osgi.framework.ServiceRegistration;
import org.osgi.framework.Version;
import org.osgi.framework.launch.Framework;
public class MiniFramework implements Framework, Bundle, BundleContext {
ClassLoader loader;
Properties properties;
Map<Long,Bundle> bundles = new HashMap<Long,Bundle>();
int ID = 1;
int state = Bundle.INSTALLED;
ClassLoader last;
public MiniFramework(Map<Object,Object> properties) {
this.properties = new Properties(System.getProperties());
this.properties.putAll(properties);
bundles.put(new Long(0), this);
last = loader = getClass().getClassLoader();
}
@Override
public void init() throws BundleException {
state = Bundle.ACTIVE;
}
@Override
public FrameworkEvent waitForStop(long timeout) throws InterruptedException {
long deadline = System.currentTimeMillis() + timeout;
while (state != Bundle.UNINSTALLED) {
if (timeout != 0) {
long wait = deadline - System.currentTimeMillis();
if (wait <= 0)
return new FrameworkEvent(FrameworkEvent.WAIT_TIMEDOUT, this, null);
}
Thread.sleep(100);
}
return new FrameworkEvent(FrameworkEvent.STOPPED, this, null);
}
@Override
public BundleContext getBundleContext() {
return this;
}
@Override
public long getBundleId() {
return 0;
}
@Override
public URL getEntry(String path) {
if (path.startsWith("/"))
path = path.substring(1);
return loader.getResource(path);
}
@Override
public Enumeration<String> getEntryPaths(String path) {
throw new UnsupportedOperationException();
}
@Override
public Dictionary<String,String> getHeaders() {
return new Hashtable<String,String>();
}
@Override
public Dictionary<String,String> getHeaders(String locale) {
throw new UnsupportedOperationException();
}
@Override
public long getLastModified() {
return 0;
}
@Override
public String getLocation() {
return "System Bundle";
}
@Override
public URL getResource(String name) {
return loader.getResource(name);
}
@Override
public Enumeration<URL> getResources(String name) throws IOException {
return loader.getResources(name);
}
@Override
public int getState() {
return Bundle.ACTIVE;
}
@Override
public String getSymbolicName() {
return "system.bundle";
}
@Override
public Version getVersion() {
return new Version("1.0");
}
@Override
public boolean hasPermission(Object permission) {
return true;
}
@Override
public Class< ? > loadClass(String name) throws ClassNotFoundException {
return loader.loadClass(name);
}
@Override
public void start() {}
@Override
public void start(int options) {}
@Override
public synchronized void stop() {
state = Bundle.UNINSTALLED;
notifyAll();
}
@Override
public void stop(int options) throws BundleException {}
@Override
public Bundle getBundle() {
return this;
}
@Override
public Bundle getBundle(long id) {
Long l = new Long(id);
Bundle b = bundles.get(l);
return b;
}
@Override
public Bundle[] getBundles() {
return bundles.values().toArray(new Bundle[0]);
}
@Override
public File getDataFile(String filename) {
return null;
}
@Override
public String getProperty(String key) {
return properties.getProperty(key);
}
@Override
public Bundle installBundle(String location) throws BundleException {
try {
if (location.startsWith("reference:"))
location = new File(new URL(location.substring("reference:".length())).toURI()).getPath();
else if (location.startsWith("file:"))
location = new File(location.substring("file:".length())).getPath();
while (location.startsWith("//"))
location = location.substring(1);
Context c = new Context(this, last, ++ID, location);
bundles.put(new Long(c.id), c);
last = c;
return c;
} catch (Exception e) {
throw new BundleException("Failed to install", e);
}
}
@Override
public Bundle installBundle(String location, InputStream in) throws BundleException {
Context c;
try {
in.close();
try {
@SuppressWarnings("unused")
URL url = new URL(location);
} catch (MalformedURLException e) {
throw new BundleException(
"For the mini framework, the location must be a proper URL even though this is not required by the specification "
+ location,
e);
}
c = new Context(this, last, ++ID, location);
bundles.put(new Long(c.id), c);
last = c;
return c;
} catch (Exception e) {
throw new BundleException("Can't install " + location, e);
}
}
@Override
public Enumeration<URL> findEntries(String path, String filePattern, boolean recurse) {
throw new UnsupportedOperationException();
}
@Override
public ServiceReference[] getRegisteredServices() {
throw new UnsupportedOperationException();
}
@Override
public ServiceReference[] getServicesInUse() {
throw new UnsupportedOperationException();
}
@Override
public Map<X509Certificate,List<X509Certificate>> getSignerCertificates(int signersType) {
throw new UnsupportedOperationException();
}
@Override
public void uninstall() throws BundleException {
throw new UnsupportedOperationException();
}
@Override
public void update() throws BundleException {
throw new UnsupportedOperationException();
}
@Override
public void update(InputStream in) throws BundleException {
throw new UnsupportedOperationException();
}
@Override
public void addBundleListener(BundleListener listener) {
// no services so cannot do any harm
}
@Override
public void addFrameworkListener(FrameworkListener listener) {
// no services so cannot do any harm
}
@Override
public void addServiceListener(ServiceListener listener) {
// no services so cannot do any harm
}
@Override
public void addServiceListener(ServiceListener listener, String filter) {
// no services so cannot do any harm
}
@Override
public Filter createFilter(String filter) throws InvalidSyntaxException {
return FrameworkUtil.createFilter(filter);
}
@Override
public ServiceReference[] getAllServiceReferences(String clazz, String filter) throws InvalidSyntaxException {
throw new UnsupportedOperationException();
}
@Override
public ServiceReference getServiceReference(String clazz) {
return null;
}
@Override
public ServiceReference[] getServiceReferences(String clazz, String filter) throws InvalidSyntaxException {
return null;
}
@Override
public void removeBundleListener(BundleListener listener) {
// ok
}
@Override
public void removeFrameworkListener(FrameworkListener listener) {
// ok
}
@Override
public void removeServiceListener(ServiceListener listener) {
// ok
}
@Override
public String toString() {
return "Mini framework";
}
class Loader extends ClassLoader {
@Override
public Class< ? > findClass(String name) throws ClassNotFoundException {
for (Bundle b : bundles.values()) {
try {
return b.loadClass(name);
} catch (ClassNotFoundException e) {
// Ignore, try next
}
}
throw new ClassNotFoundException(name);
}
}
public int compareTo(Bundle var0) {
// TODO Auto-generated method stub
return 0;
}
@Override
public ServiceRegistration registerService(String[] clazzes, Object service, Dictionary properties) {
return null;
}
@Override
public ServiceRegistration registerService(String clazz, Object service, Dictionary properties) {
return null;
}
public <S> ServiceRegistration registerService(Class<S> clazz, S service, Dictionary<String, ? > properties) {
return null;
}
public <S> ServiceReference getServiceReference(Class<S> clazz) {
return null;
}
public <S> Collection<ServiceReference> getServiceReferences(Class<S> clazz, String filter)
throws InvalidSyntaxException {
return null;
}
@Override
public Object getService(ServiceReference reference) {
return null;
}
@Override
public boolean ungetService(ServiceReference reference) {
return false;
}
public Bundle getBundle(String location) {
return null;
}
public <A> A adapt(Class<A> type) {
return null;
}
}