package uk.bl.odin.orcid.guice; import java.util.concurrent.atomic.AtomicBoolean; import javax.inject.Inject; import org.restlet.resource.ServerResource; /** * Base class for ServerResources that do their own member injection. Not * available in maven. * * @see http * ://tembrel.blogspot.co.uk/2012/03/restlet-guice-extension-considered. * html * @see https * ://github.com/restlet/restlet-framework-java/blob/master/incubator/org * .restlet * .ext.guice/src/org/restlet/ext/guice/SelfInjectingServerResource.java * @author Tembrel * */ public abstract class SelfInjectingServerResource extends ServerResource { /** * Implemented by DI framework-specific code. For example, with Guice, the * statically-injected MembersInjector just calls * {@code injector.injectMembers(object)}. */ public interface MembersInjector { void injectMembers(Object object); } /** * Subclasseses overriding this method must call {@code super.doInit()} * first. */ protected void doInit() { ensureInjected(theMembersInjector); } @Inject private void injected() { // NOPMD injected.set(true); } void ensureInjected(MembersInjector membersInjector) { if (injected.compareAndSet(false, true)) { membersInjector.injectMembers(this); } } /** * Whether we've been injected yet. This protects against multiple injection * of a subclass that gets injected before doInit is called. */ private final AtomicBoolean injected = new AtomicBoolean(false); /** * Must be statically injected by DI framework. */ @Inject private static volatile MembersInjector theMembersInjector; }