/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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.connect; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.security.cert.X509Certificate; import java.util.Dictionary; import java.util.Enumeration; import java.util.HashMap; import java.util.List; import java.util.Map; import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; import org.osgi.framework.BundleEvent; import org.osgi.framework.BundleException; import org.osgi.framework.FrameworkEvent; import org.osgi.framework.ServiceReference; import org.osgi.framework.SynchronousBundleListener; import org.osgi.framework.Version; import org.osgi.framework.launch.Framework; import org.osgi.framework.launch.FrameworkFactory; import org.apache.felix.connect.launch.ClasspathScanner; import org.apache.felix.connect.launch.PojoServiceRegistry; import org.apache.felix.connect.launch.PojoServiceRegistryFactory; public class PojoServiceRegistryFactoryImpl implements PojoServiceRegistryFactory, FrameworkFactory { public PojoServiceRegistry newPojoServiceRegistry(Map<String, Object> configuration) throws Exception { return new PojoSR(configuration); } public Framework newFramework(Map<String, String> configuration) { return new FrameworkImpl(configuration.get("pojosr.filter")); } private static final class FrameworkImpl implements Framework { private final String m_filter; private volatile Bundle m_bundle = null; private volatile PojoServiceRegistry m_reg = null; public FrameworkImpl(String filter) { m_filter = filter; } public void init() throws BundleException { try { m_reg = new PojoServiceRegistryFactoryImpl() .newPojoServiceRegistry(new HashMap<String, Object>()); m_bundle = m_reg.getBundleContext().getBundle(); } catch (Exception ex) { throw new BundleException("Unable to scan classpath", ex); } } public int getState() { return (m_bundle == null) ? Bundle.INSTALLED : m_bundle.getState(); } public void start(int options) throws BundleException { start(); } public void start() throws BundleException { try { m_reg.startBundles((m_filter != null) ? new ClasspathScanner() .scanForBundles(m_filter) : new ClasspathScanner().scanForBundles()); } catch (Exception e) { throw new BundleException("Error starting framework", e); } } public void stop(int options) throws BundleException { m_bundle.stop(options); } public void stop() throws BundleException { m_bundle.stop(); } public void update(InputStream input) throws BundleException { m_bundle.update(input); } public void update() throws BundleException { m_bundle.update(); } public void uninstall() throws BundleException { m_bundle.uninstall(); } public Dictionary<String, String> getHeaders() { return m_bundle.getHeaders(); } public long getBundleId() { return m_bundle.getBundleId(); } public String getLocation() { return m_bundle.getLocation(); } public ServiceReference[] getRegisteredServices() { return m_bundle.getRegisteredServices(); } public ServiceReference[] getServicesInUse() { return m_bundle.getServicesInUse(); } public boolean hasPermission(Object permission) { return m_bundle.hasPermission(permission); } public URL getResource(String name) { return m_bundle.getResource(name); } public Dictionary<String, String> getHeaders(String locale) { return m_bundle.getHeaders(locale); } public String getSymbolicName() { return m_bundle.getSymbolicName(); } public Class loadClass(String name) throws ClassNotFoundException { return m_bundle.loadClass(name); } public Enumeration<URL> getResources(String name) throws IOException { return m_bundle.getResources(name); } public Enumeration<String> getEntryPaths(String path) { return m_bundle.getEntryPaths(path); } public URL getEntry(String path) { return m_bundle.getEntry(path); } public long getLastModified() { return m_bundle.getLastModified(); } public Enumeration<URL> findEntries(String path, String filePattern, boolean recurse) { return m_bundle.findEntries(path, filePattern, recurse); } public BundleContext getBundleContext() { return m_bundle.getBundleContext(); } public Map<X509Certificate, List<X509Certificate>> getSignerCertificates(int signersType) { return m_bundle.getSignerCertificates(signersType); } public Version getVersion() { return m_bundle.getVersion(); } public FrameworkEvent waitForStop(long timeout) throws InterruptedException { final Object lock = new Object(); m_bundle.getBundleContext().addBundleListener(new SynchronousBundleListener() { public void bundleChanged(BundleEvent event) { if ((event.getBundle() == m_bundle) && (event.getType() == BundleEvent.STOPPED)) { synchronized (lock) { lock.notifyAll(); } } } }); synchronized (lock) { while (m_bundle.getState() != Bundle.RESOLVED) { if (m_bundle.getState() == Bundle.STOPPING) { lock.wait(100); } else { lock.wait(); } } } return new FrameworkEvent(FrameworkEvent.STOPPED, m_bundle, null); } public File getDataFile(String filename) { return m_bundle.getDataFile(filename); } public int compareTo(Bundle o) { if (o == this) { return 0; } return m_bundle.compareTo(o); } public <A> A adapt(Class<A> type) { return m_bundle.adapt(type); } } }