blob: 509d775146f4b0a41dc6421b25fd0778334237f6 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2016 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.equinox.internal.ds;
import java.util.List;
import org.apache.felix.scr.ScrService;
import org.eclipse.osgi.service.environment.EnvironmentInfo;
import org.osgi.framework.*;
import org.osgi.framework.namespace.BundleNamespace;
import org.osgi.framework.startlevel.BundleStartLevel;
import org.osgi.framework.wiring.BundleWire;
import org.osgi.framework.wiring.BundleWiring;
import org.osgi.service.component.runtime.ServiceComponentRuntime;
import org.osgi.util.tracker.ServiceTracker;
import org.osgi.util.tracker.ServiceTrackerCustomizer;
@SuppressWarnings("deprecation")
public class Activator implements BundleActivator, ServiceTrackerCustomizer<ServiceComponentRuntime, ServiceRegistration<ScrService>> {
private BundleContext bc;
private Bundle scr;
private ServiceTracker<ServiceComponentRuntime, ServiceRegistration<ScrService>> tracker;
public void start(BundleContext context) throws Exception {
this.bc = context;
ServiceReference<EnvironmentInfo> envInfoRef = context.getServiceReference(EnvironmentInfo.class);
EnvironmentInfo envInfo = null;
if (envInfoRef != null) {
envInfo = context.getService(envInfoRef);
}
if (envInfo != null) {
envInfo.setProperty("ds.delayed.keepInstances", "true"); //$NON-NLS-1$//$NON-NLS-2$
envInfo.setProperty("equinox.use.ds", "true"); //$NON-NLS-1$//$NON-NLS-2$
context.ungetService(envInfoRef);
} else {
System.setProperty("ds.delayed.keepInstances", "true"); //$NON-NLS-1$//$NON-NLS-2$
System.setProperty("equinox.use.ds", "true"); //$NON-NLS-1$ //$NON-NLS-2$
}
BundleWiring wiring = context.getBundle().adapt(BundleWiring.class);
List<BundleWire> required = wiring.getRequiredWires(BundleNamespace.BUNDLE_NAMESPACE);
if (required.isEmpty()) {
throw new IllegalStateException("No org.apache.felix.scr bundle found!"); //$NON-NLS-1$
}
scr = required.get(0).getProvider().getBundle();
if (!"org.apache.felix.scr".equals(scr.getSymbolicName())) { //$NON-NLS-1$
throw new IllegalStateException("Required wrong bundle: " + scr); //$NON-NLS-1$
}
BundleStartLevel equinoxSDstartLevel = context.getBundle().adapt(BundleStartLevel.class);
BundleStartLevel scrStartLevel = scr.adapt(BundleStartLevel.class);
scrStartLevel.setStartLevel(equinoxSDstartLevel.getStartLevel());
scr.start(Bundle.START_TRANSIENT);
tracker = new ServiceTracker<ServiceComponentRuntime, ServiceRegistration<ScrService>>(context, ServiceComponentRuntime.class, this);
tracker.open();
}
public void stop(BundleContext context) throws Exception {
tracker.close();
scr.stop(Bundle.STOP_TRANSIENT);
}
@Override
public ServiceRegistration<ScrService> addingService(ServiceReference<ServiceComponentRuntime> reference) {
ServiceComponentRuntime scrService = bc.getService(reference);
if (scr != null) {
return bc.registerService(ScrService.class, new ScrServiceImpl(scrService, bc), null);
}
return null;
}
@Override
public void modifiedService(ServiceReference<ServiceComponentRuntime> reference, ServiceRegistration<ScrService> reg) {
// do nothing
}
@Override
public void removedService(ServiceReference<ServiceComponentRuntime> reference, ServiceRegistration<ScrService> reg) {
reg.unregister();
bc.ungetService(reference);
}
}