/* * Copyright 2010 NCHOVY * * 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 org.krakenapps.sentry.impl; import java.lang.reflect.Method; import org.krakenapps.sentry.SentryCommandHandler; import org.krakenapps.sentry.SentryMethod; import org.krakenapps.sentry.SentryRpcService; import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceReference; import org.osgi.util.tracker.ServiceTracker; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class CommandHandlerTracker extends ServiceTracker { private final Logger logger = LoggerFactory.getLogger(CommandHandlerTracker.class.getName()); private SentryRpcService rpc; public CommandHandlerTracker(SentryRpcService rpc, BundleContext bc) { super(bc, SentryCommandHandler.class.getName(), null); this.rpc = rpc; } @Override public Object addingService(ServiceReference reference) { Object service = super.addingService(reference); addFeatures(service); addMethods(service); return service; } @Override public void removedService(ServiceReference reference, Object service) { removeFeatures(service); removeMethods(service); super.removedService(reference, service); } private void addFeatures(Object service) { SentryCommandHandler handler = (SentryCommandHandler) service; for (String feature : handler.getFeatures()) rpc.registerFeature(feature); } private void removeFeatures(Object service) { SentryCommandHandler handler = (SentryCommandHandler) service; for (String feature : handler.getFeatures()) rpc.unregisterFeature(feature); } private void addMethods(Object service) { for (Method m : service.getClass().getMethods()) { SentryMethod sentryMethod = m.getAnnotation(SentryMethod.class); if (sentryMethod != null) { String rpcName = getRpcMethodName(m, sentryMethod); logger.trace("kraken sentry: adding rpc method [{}]", rpcName); try { rpc.register(rpcName, service, m.getName()); } catch (IllegalStateException e) { logger.trace("kraken sentry: failed to add rpc method " + rpcName, e); } } } } private void removeMethods(Object service) { for (Method m : service.getClass().getMethods()) { SentryMethod sentryMethod = m.getAnnotation(SentryMethod.class); if (sentryMethod != null) { String rpcName = getRpcMethodName(m, sentryMethod); logger.trace("kraken sentry: removing rpc method [{}]", rpcName); rpc.unregister(rpcName, service, m.getName()); } } } private String getRpcMethodName(Method m, SentryMethod sentryMethod) { if (sentryMethod.method() == null || sentryMethod.method().isEmpty()) return m.getName(); else return sentryMethod.method(); } }