package ameba.feature.internal; import ameba.core.Addon; import ameba.core.Application; import ameba.scanner.ClassFoundEvent; import ameba.scanner.ClassInfo; import com.google.common.collect.Sets; import org.glassfish.hk2.api.ServiceLocator; import org.glassfish.hk2.utilities.ServiceLocatorUtilities; import org.jvnet.hk2.annotations.Service; import javax.inject.Inject; import javax.ws.rs.core.Feature; import javax.ws.rs.core.FeatureContext; import java.util.Set; /** * <p>LocalResourceAddon class.</p> * * @author icode * @since 0.1.6e * */ public class LocalResourceAddon extends Addon { /** * {@inheritDoc} */ @Override public void setup(final Application application) { final Set<ClassInfo> classInfoSet = Sets.newLinkedHashSet(); subscribeSystemEvent(ClassFoundEvent.class, event -> event.accept(info -> { if (info.containsAnnotations(Service.class)) { classInfoSet.add(info); return true; } return false; })); final Feature localResource = new Feature() { @Inject private ServiceLocator locator; @Override public boolean configure(FeatureContext context) { for (ClassInfo classInfo : classInfoSet) { ServiceLocatorUtilities.addClasses(locator, classInfo.toClass()); } classInfoSet.clear(); return true; } }; application.register(localResource); } }