package org.osgi.service.indexer.osgi;
import org.osgi.framework.BundleContext;
import org.osgi.framework.Filter;
import org.osgi.framework.FrameworkUtil;
import org.osgi.framework.InvalidSyntaxException;
import org.osgi.framework.ServiceReference;
import org.osgi.service.indexer.ResourceAnalyzer;
import org.osgi.service.indexer.impl.RepoIndex;
import org.osgi.service.indexer.osgi.AnalyzerTracker.TrackingStruct;
import org.osgi.service.log.LogService;
import org.osgi.util.tracker.ServiceTracker;
class AnalyzerTracker extends ServiceTracker<ResourceAnalyzer,TrackingStruct> {
private final RepoIndex indexer;
private final LogService log;
public AnalyzerTracker(BundleContext context, RepoIndex indexer, LogService log) {
super(context, ResourceAnalyzer.class, null);
this.indexer = indexer;
this.log = log;
}
static class TrackingStruct {
ResourceAnalyzer analyzer;
Filter filter;
boolean valid;
}
@Override
public TrackingStruct addingService(ServiceReference<ResourceAnalyzer> reference) {
TrackingStruct struct = new TrackingStruct();
try {
String filterStr = (String) reference.getProperty(ResourceAnalyzer.FILTER);
Filter filter = (filterStr != null) ? FrameworkUtil.createFilter(filterStr) : null;
ResourceAnalyzer analyzer = context.getService(reference);
if (analyzer == null)
return null;
struct = new TrackingStruct();
struct.analyzer = analyzer;
struct.filter = filter;
struct.valid = true;
indexer.addAnalyzer(analyzer, filter);
} catch (InvalidSyntaxException e) {
struct.valid = false;
log.log(reference, LogService.LOG_ERROR, "Ignoring ResourceAnalyzer due to invalid filter expression", e);
}
return struct;
}
@Override
public void modifiedService(ServiceReference<ResourceAnalyzer> reference, TrackingStruct struct) {
if (struct.valid) {
indexer.removeAnalyzer(struct.analyzer, struct.filter);
}
try {
String filterStr = (String) reference.getProperty(ResourceAnalyzer.FILTER);
Filter filter = (filterStr != null) ? FrameworkUtil.createFilter(filterStr) : null;
struct = new TrackingStruct();
struct.filter = filter;
struct.valid = true;
indexer.addAnalyzer(struct.analyzer, filter);
} catch (InvalidSyntaxException e) {
struct.valid = false;
log.log(reference, LogService.LOG_ERROR, "Ignoring ResourceAnalyzer due to invalid filter expression", e);
}
}
@Override
public void removedService(ServiceReference<ResourceAnalyzer> reference, TrackingStruct struct) {
if (struct.valid)
indexer.removeAnalyzer(struct.analyzer, struct.filter);
}
}