in src/main/java/org/apache/sling/feature/apiregions/impl/Activator.java [201:251]
private boolean registerManagedService(final BundleCapability cap) {
try {
ClassLoader loader = cap.getRevision().getWiring().getClassLoader();
Class<?> msClass = loader.loadClass(MANAGED_SERVICE_CLASS_NAME);
Object ms = Proxy.newProxyInstance(loader, new Class[] {msClass}, new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Class<?> mdDecl = method.getDeclaringClass();
if (mdDecl.equals(Object.class)) {
switch (method.getName()) {
case "equals" :
return proxy == args[0];
case "hashCode" :
return System.identityHashCode(proxy);
case "toString" :
return "Proxy for " + msClass;
default :
throw new UnsupportedOperationException("Method " + method
+ " not supported on proxy for " + msClass);
}
}
if ("updated".equals(method.getName()) && args.length == 1) {
Object arg = args[0];
if (arg == null) {
registerHook();
registerWebconsoleStatus();
} else if (arg instanceof Dictionary) {
Dictionary<?,?> props = (Dictionary<?,?>) args[0];
Object disabled = props.get("disable");
if ("true".equals(disabled)) {
unregisterHook();
unregisterWebconsoleStatus();
} else {
registerHook();
registerWebconsoleStatus();
}
}
}
return null;
}
});
Dictionary<String, Object> props = new Hashtable<>();
props.put(Constants.SERVICE_PID, getClass().getPackage().getName());
bundleContext.registerService(MANAGED_SERVICE_CLASS_NAME, ms, props);
return true;
} catch (Exception e) {
LOG.log(Level.WARNING, "Problem attempting to register ManagedService from " + cap, e);
}
return false;
}