// Path: src/main/java/uk/bl/odin/orcid/domain/CacheManager.java
// public class CacheManager {
// 
// 	private final Cache<SearchKey, OrcidSearchResults> searchCache;
// 
// 	private final Cache<String, OrcidProfile> profileCache;
// 
// 	@Inject
// 	public CacheManager(@Named("OrcidCacheTimeout") Integer timeOutInMinutes,
// 			@Named("OrcidCacheMaxsize") Integer maximumSize) {
// 		searchCache = CacheBuilder.newBuilder().expireAfterWrite(timeOutInMinutes, TimeUnit.MINUTES)
// 				.maximumSize(maximumSize).build();
// 		profileCache = CacheBuilder.newBuilder().expireAfterWrite(timeOutInMinutes, TimeUnit.MINUTES)
// 				.maximumSize(maximumSize).build();
// 	}
// 
// 	public Cache<SearchKey, OrcidSearchResults> getSearchCache() {
// 		return searchCache;
// 	}
// 
// 	public Cache<String, OrcidProfile> getProfilecache() {
// 		return profileCache;
// 	}
// 
// }
// 
// Path: src/main/java/uk/bl/odin/orcid/domain/IsOrcidWorkProvider.java
// public interface IsOrcidWorkProvider {
// 	public IsOrcidWork fetch(String id) throws IOException;
// }


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;
		// 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();
// Path: src/main/java/uk/bl/odin/orcid/domain/CacheManager.java
// public class CacheManager {
// 
// 	private final Cache<SearchKey, OrcidSearchResults> searchCache;
// 
// 	private final Cache<String, OrcidProfile> profileCache;
// 
// 	@Inject
// 	public CacheManager(@Named("OrcidCacheTimeout") Integer timeOutInMinutes,
// 			@Named("OrcidCacheMaxsize") Integer maximumSize) {
// 		searchCache = CacheBuilder.newBuilder().expireAfterWrite(timeOutInMinutes, TimeUnit.MINUTES)
// 				.maximumSize(maximumSize).build();
// 		profileCache = CacheBuilder.newBuilder().expireAfterWrite(timeOutInMinutes, TimeUnit.MINUTES)
// 				.maximumSize(maximumSize).build();
// 	}
// 
// 	public Cache<SearchKey, OrcidSearchResults> getSearchCache() {
// 		return searchCache;
// 	}
// 
// 	public Cache<String, OrcidProfile> getProfilecache() {
// 		return profileCache;
// 	}
// 
// }
// 
// Path: src/main/java/uk/bl/odin/orcid/domain/IsOrcidWorkProvider.java
// public interface IsOrcidWorkProvider {
// 	public IsOrcidWork fetch(String id) throws IOException;
// }


// Path: src/main/java/uk/bl/odin/orcid/GuiceConfigModule.java
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;

		// 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();