package org.atomnuke.service; import java.lang.annotation.Annotation; import org.apache.commons.lang3.StringUtils; import org.atomnuke.container.service.annotation.Requires; import org.atomnuke.lifecycle.resolution.ResolutionAction; import org.atomnuke.lifecycle.resolution.ResolutionActionImpl; import org.atomnuke.lifecycle.resolution.ResolutionActionType; import org.atomnuke.plugin.InstanceContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * * @author zinic */ public class ResolutionHandlerImpl implements ResolutionHandler { private static final Logger LOG = LoggerFactory.getLogger(ResolutionHandlerImpl.class); private final ServiceManager serviceManager; public ResolutionHandlerImpl(ServiceManager serviceManager) { this.serviceManager = serviceManager; } @Override public ResolutionAction resolve(InstanceContext<? extends Service> serviceInstance) { final Class serviceInstanceClass = serviceInstance.instanceClass(); final Annotation foundAnnotation = serviceInstanceClass.getAnnotation(Requires.class); ResolutionActionType resolutionAction = ResolutionActionType.INIT; if (foundAnnotation != null) { final Requires requires = (Requires) foundAnnotation; if (requires.value().length > 0) { for (Class requiredInterface : requires.value()) { if (!serviceManager.serviceRegistered(requiredInterface)) { LOG.info("Unable to locate service for: " + requiredInterface.getName() + " - deferring."); resolutionAction = ResolutionActionType.DEFER; break; } } } else if (StringUtils.isNotBlank(requires.lookup())) { // TODO: Handle reading a services requirement descriptor LOG.info("Service resolution through a descriptor is not implemented yet. Bug John."); resolutionAction = ResolutionActionType.FAIL; } } return new ResolutionActionImpl(resolutionAction); } }