de.mhus.osgi.api.util.MServiceTracker Maven / Gradle / Ivy
Show all versions of osgi-api Show documentation
/**
* Copyright 2018 Mike Hummel
*
* 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 de.mhus.osgi.api.util;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import org.osgi.service.component.ComponentContext;
import org.osgi.util.tracker.ServiceTracker;
import org.osgi.util.tracker.ServiceTrackerCustomizer;
import de.mhus.osgi.api.MOsgi;
public abstract class MServiceTracker {
private BundleContext context;
protected Class clazz;
private ServiceTrackerCustomizer customizer =
new ServiceTrackerCustomizer() {
@Override
public T addingService(ServiceReference reference) {
T service = context.getService(reference);
if (service != null && service instanceof ReferenceInject)
((ReferenceInject) service).setReference(reference);
MServiceTracker.this.addService(reference, service);
return service;
}
@Override
public void modifiedService(ServiceReference reference, T service) {
if (service != null && service instanceof ReferenceInject)
((ReferenceInject) service).setReference(reference);
MServiceTracker.this.modifyService(reference, service);
}
@Override
public void removedService(ServiceReference reference, T service) {
MServiceTracker.this.removeService(reference, service);
}
};
private ServiceTracker tracker;
public MServiceTracker(Class clazz) {
this(null, clazz);
}
protected void modifyService(ServiceReference reference, T service) {
removeService(reference, service);
addService(reference, service);
}
protected abstract void removeService(ServiceReference reference, T service);
protected abstract void addService(ServiceReference reference, T service);
public MServiceTracker(BundleContext context, Class clazz) {
if (context == null) {
try {
context = MOsgi.getBundleContext();
} catch (Throwable t) {
}
}
this.context = context;
this.clazz = clazz;
}
public MServiceTracker start(ComponentContext ctx) {
if (ctx != null) return start(ctx.getBundleContext());
else return start();
}
public MServiceTracker start(BundleContext ctx) {
if (ctx != null) context = ctx;
return start();
}
public MServiceTracker start() {
if (tracker != null) return this;
tracker = new ServiceTracker<>(context, clazz, customizer);
tracker.open(true);
return this;
}
public void stop() {
if (tracker == null) return;
tracker.close();
tracker = null;
}
public boolean isRunning() {
return tracker != null;
}
public BundleContext getBundleContext() {
return context;
}
public void setBundleContext(BundleContext context) {
this.context = context;
}
}