package org.foo.dosgi.hooks;
import java.util.Collection;
import org.apache.felix.sigil.common.osgi.ExprVisitor;
import org.apache.felix.sigil.common.osgi.LDAPExpr;
import org.apache.felix.sigil.common.osgi.LDAPParser;
import org.apache.felix.sigil.common.osgi.SimpleTerm;
import org.foo.dosgi.helper.LogUtil;
import org.foo.dosgi.helper.RegistryWatcher;
import org.osgi.framework.Constants;
import org.osgi.framework.hooks.service.ListenerHook;
public class ImportedServiceListenerHook implements ListenerHook {
private static final LogUtil log = LogUtil.getLog(ImportedServiceListenerHook.class.getName());
private final RegistryWatcher watcher;
public ImportedServiceListenerHook(RegistryWatcher watcher) {
this.watcher = watcher;
}
public void added(Collection listeners) {
for (final ListenerInfo info : (Collection<ListenerInfo>) listeners) {
if (!info.isRemoved()) {
log.info("Adding listener " + info);
LDAPExpr expr = LDAPParser.parseExpression(info.getFilter());
expr.visit(new ExprVisitor() {
public void visitExpr(LDAPExpr expr) {
if (expr instanceof SimpleTerm) {
SimpleTerm term = (SimpleTerm) expr;
if (term.getName().equals(Constants.OBJECTCLASS)) {
watcher.addWatch(term.getRval(), info.getFilter());
}
}
}
});
}
}
}
public void removed(Collection listeners) {
for (final ListenerInfo info : (Collection<ListenerInfo>) listeners) {
LDAPExpr expr = LDAPParser.parseExpression(info.getFilter());
expr.visit(new ExprVisitor() {
public void visitExpr(LDAPExpr expr) {
if (expr instanceof SimpleTerm) {
SimpleTerm term = (SimpleTerm) expr;
if (term.getName().equals(Constants.OBJECTCLASS)) {
watcher.removeWatch(term.getRval(), info.getFilter());
}
}
}
});
}
}
}