package uk.bl.odin.orcid; import java.util.logging.Level; import java.util.logging.Logger; import org.restlet.Context; import uk.bl.odin.orcid.client.OrcidOAuthClient; import uk.bl.odin.orcid.client.OrcidPublicClient; import uk.bl.odin.orcid.domain.CacheManager; import uk.bl.odin.orcid.domain.IsOrcidWorkProvider; import com.google.inject.AbstractModule; import com.google.inject.name.Names; /** * Manages dependencies. Uses context passed from Servlet Init params. * * @author tom * */ public class GuiceConfigModule extends AbstractModule { private static final Logger log = Logger.getLogger(GuiceConfigModule.class.getName()); private Context context; public static final String CONFIG_KEY_OrcidClientID = "OrcidClientID"; public static final String CONFIG_KEY_OrcidClientSecret = "OrcidClientSecret"; public static final String CONFIG_KEY_OrcidReturnURI = "OrcidReturnURI"; public static final String CONFIG_KEY_OrcidSandbox = "OrcidSandbox"; public static final String CONFIG_KEY_OrcidWorkProvider = "OrcidWorkProvider"; public static final String CONFIG_KEY_CacheTimeout = "OrcidCacheTimeout"; public static final String CONFIG_KEY_CacheMaxsize = "OrcidCacheMaxsize"; public GuiceConfigModule(Context context) { super(); this.context = context; } /** * Validates configuration and creates dependencies. Uses config from * web.xml * * Init params * <ul> * <li>"OrcidWorkProvider" fully qualified class name for * IsOrcidWorkProvider instance</li> * <li>"OrcidClientID", "OrcidClientSecret", "OrcidReturnURI" ORCID OAuth * params</li> * <li>"OrcidSandbox" true for sandbox, otherwise use live api</li> * </ul> * * Binds a singleton OrcidOAuthClient & the configured IsOrcidWorkProvider * class as not-a-singleton Binds passed config as * Named("{init_param_name}") * */ @Override protected void configure() { // validate OAuth configuration if (context.getParameters().getFirst(CONFIG_KEY_OrcidClientID) == null || context.getParameters().getFirst(CONFIG_KEY_OrcidClientSecret) == null || context.getParameters().getFirst(CONFIG_KEY_OrcidReturnURI) == null || context.getParameters().getFirst(CONFIG_KEY_OrcidSandbox) == null) { log.severe("Init params are: " + context.getParameters().toString()); throw new IllegalStateException("cannot create OrcidOAuthClient - missing init parameter(s)"); } if (context.getParameters().getFirst(CONFIG_KEY_OrcidWorkProvider) == null) { log.severe("Init params are: " + context.getParameters().toString()); throw new IllegalStateException("cannot create OrcidWorkProvier - missing init parameter"); } // Resolve OrcidWork provider IsOrcidWorkProvider provider; try { provider = (IsOrcidWorkProvider) Class.forName( context.getParameters().getFirst(CONFIG_KEY_OrcidWorkProvider).getValue()).newInstance(); } catch (Exception e) { throw new IllegalStateException("cannot create OrcidWorkProvier", e); } // Suppress Guice warning when on GAE // see https://code.google.com/p/google-guice/issues/detail?id=488 Logger.getLogger("com.google.inject.internal.util").setLevel(Level.WARNING); // bind config params bind(String.class).annotatedWith(Names.named(CONFIG_KEY_OrcidClientID)).toInstance( context.getParameters().getFirst(CONFIG_KEY_OrcidClientID).getValue().toString()); bind(String.class).annotatedWith(Names.named(CONFIG_KEY_OrcidClientSecret)).toInstance( context.getParameters().getFirst(CONFIG_KEY_OrcidClientSecret).getValue().toString()); bind(String.class).annotatedWith(Names.named(CONFIG_KEY_OrcidReturnURI)).toInstance( context.getParameters().getFirst(CONFIG_KEY_OrcidReturnURI).getValue().toString()); bind(Boolean.class).annotatedWith(Names.named(CONFIG_KEY_OrcidSandbox)).toInstance( Boolean.valueOf(context.getParameters().getFirst(CONFIG_KEY_OrcidSandbox).getValue().toString())); // TODO: - put in external config? bind(Integer.class).annotatedWith(Names.named(CONFIG_KEY_CacheTimeout)).toInstance(30); bind(Integer.class).annotatedWith(Names.named(CONFIG_KEY_CacheMaxsize)).toInstance(1000); // bind dependencies bind(OrcidOAuthClient.class).asEagerSingleton(); bind(OrcidPublicClient.class).asEagerSingleton(); bind(CacheManager.class).asEagerSingleton(); bind(IsOrcidWorkProvider.class).to(provider.getClass()); } }