package org.restlet.ext.jackson.internal;
import org.codehaus.stax2.osgi.Stax2InputFactoryProvider;
import org.codehaus.stax2.osgi.Stax2OutputFactoryProvider;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceEvent;
import org.osgi.framework.ServiceListener;
import org.osgi.framework.ServiceReference;
import org.restlet.Context;
import java.util.logging.Level;
// [includes osgi]
/**
* Register Stax2IntputFactoryProvider and Stax2OutputFactoryProvider in OSGI context.
* In a no-OSGI context, these factories are retrieved with java service loader.
*
* <p>Note: Stax2 implementation is provided by woodstox library which
* is a dependency of Jackson.</p>
*
* @author Manuel Boillod
*/
public class Activator implements BundleActivator {
@Override
public void start(final BundleContext bundleContext) throws Exception {
ServiceReference inputFactoryServiceReference = bundleContext.getServiceReference("org.codehaus.stax2.osgi.Stax2InputFactoryProvider");
if (inputFactoryServiceReference != null) {
Stax2InputFactoryProvider inputFactoryProvider = (Stax2InputFactoryProvider)bundleContext.getService(inputFactoryServiceReference);
registerInputFactory(inputFactoryProvider);
}
ServiceReference outputFactoryServiceReference = bundleContext.getServiceReference("org.codehaus.stax2.osgi.Stax2OutputFactoryProvider");
if (outputFactoryServiceReference != null) {
Stax2OutputFactoryProvider outputFactoryProvider = (Stax2OutputFactoryProvider)bundleContext.getService(outputFactoryServiceReference);
registerOutputFactory(outputFactoryProvider);
}
// Listen to installed service of type Stax2InputFactoryProvider
bundleContext.addServiceListener(new ServiceListener() {
@Override
public void serviceChanged(ServiceEvent serviceEvent) {
switch (serviceEvent.getType()) {
case ServiceEvent.REGISTERED:
case ServiceEvent.MODIFIED:
ServiceReference serviceReference = serviceEvent.getServiceReference();
Stax2InputFactoryProvider factoryProvider = (Stax2InputFactoryProvider)bundleContext.getService(serviceReference);
registerInputFactory(factoryProvider);
break;
case ServiceEvent.UNREGISTERING:
unregisterInputFactory();
break;
}
}
}, "(objectclass=org.codehaus.stax2.osgi.Stax2InputFactoryProvider)");
// Listen to installed service of type Stax2OutputFactoryProvider
bundleContext.addServiceListener(new ServiceListener() {
@Override
public void serviceChanged(ServiceEvent serviceEvent) {
switch (serviceEvent.getType()) {
case ServiceEvent.REGISTERED:
case ServiceEvent.MODIFIED:
ServiceReference serviceReference = serviceEvent.getServiceReference();
Stax2OutputFactoryProvider factoryProvider = (Stax2OutputFactoryProvider)bundleContext.getService(serviceReference);
registerOutputFactory(factoryProvider);
break;
case ServiceEvent.UNREGISTERING:
unregisterOutputFactory();
break;
}
}
}, "(objectclass=org.codehaus.stax2.osgi.Stax2OutputFactoryProvider)");
}
private void registerInputFactory(Stax2InputFactoryProvider inputFactoryProvider) {
Context.getCurrentLogger().log(Level.INFO, "Register Stax2InputFactoryProvider");
XmlFactoryProvider.inputFactoryProvider = inputFactoryProvider;
}
private void unregisterInputFactory() {
Context.getCurrentLogger().log(Level.INFO, "Unregister Stax2InputFactoryProvider");
XmlFactoryProvider.inputFactoryProvider = null;
}
private void registerOutputFactory(Stax2OutputFactoryProvider outputFactoryProvider) {
Context.getCurrentLogger().log(Level.INFO, "Register Stax2OutputFactoryProvider");
XmlFactoryProvider.outputFactoryProvider = outputFactoryProvider;
}
private void unregisterOutputFactory() {
Context.getCurrentLogger().log(Level.INFO, "Unregister Stax2OutputFactoryProvider");
XmlFactoryProvider.outputFactoryProvider = null;
}
@Override
public void stop(BundleContext bundleContext) throws Exception {
}
}