package org.gbif.occurrence.download.util; import org.gbif.api.service.registry.DatasetOccurrenceDownloadUsageService; import org.gbif.api.service.registry.DatasetService; import org.gbif.api.service.registry.OccurrenceDownloadService; import org.gbif.occurrence.download.inject.DownloadWorkflowModule; import org.gbif.registry.ws.client.DatasetOccurrenceDownloadUsageWsClient; import org.gbif.registry.ws.client.DatasetWsClient; import org.gbif.registry.ws.client.OccurrenceDownloadWsClient; import org.gbif.utils.file.properties.PropertiesUtil; import org.gbif.ws.client.guice.SingleUserAuthModule; import org.gbif.ws.mixin.Mixins; import java.io.IOException; import java.util.Properties; import com.google.inject.AbstractModule; import com.google.inject.Guice; import com.google.inject.Injector; import com.sun.jersey.api.client.config.ClientConfig; import com.sun.jersey.api.client.config.DefaultClientConfig; import com.sun.jersey.api.client.filter.ClientFilter; import com.sun.jersey.api.json.JSONConfiguration; import com.sun.jersey.client.apache.ApacheHttpClient; import org.codehaus.jackson.jaxrs.JacksonJsonProvider; /** * Utility class to create registry web service clients. */ public class RegistryClientUtil { private static final int REGISTRY_CLIENT_TO = 600000; // registry client default timeout private final Injector injector; private final ApacheHttpClient httpClient; /** * Creates an HTTP client. */ private static ApacheHttpClient createHttpClient() { ClientConfig cc = new DefaultClientConfig(); cc.getClasses().add(JacksonJsonContextResolver.class); cc.getClasses().add(JacksonJsonProvider.class); cc.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, true); cc.getProperties().put(ClientConfig.PROPERTY_CONNECT_TIMEOUT, REGISTRY_CLIENT_TO); JacksonJsonContextResolver.addMixIns(Mixins.getPredefinedMixins()); return ApacheHttpClient.create(cc); } /** * Constructs an instance using properties class instance. */ public RegistryClientUtil(Properties properties) { httpClient = createHttpClient(); injector = Guice.createInjector(createAuthModuleInstance(properties)); } /** * Constructs an instance using the default properties file. */ public RegistryClientUtil() { try { httpClient = createHttpClient(); injector = Guice.createInjector(createAuthModuleInstance(PropertiesUtil.loadProperties(DownloadWorkflowModule.CONF_FILE))); } catch (IllegalArgumentException e) { throw e; } catch (IOException e) { throw new IllegalStateException(e); } } /** * Sets up a registry DatasetService client avoiding the use of guice as our gbif jackson libraries clash with the * hadoop versions. * Sets up an http client with a one minute timeout and http support only. */ public DatasetService setupDatasetService(String uri) { return new DatasetWsClient(httpClient.resource(uri), injector.getInstance(ClientFilter.class)); } /** * Sets up a DatasetOccurrenceDownloadUsageService client avoiding the use of guice as our gbif jackson libraries * clash with the hadoop versions. * Sets up an http client with a one minute timeout and http support only. */ public DatasetOccurrenceDownloadUsageService setupDatasetUsageService(String uri) { return new DatasetOccurrenceDownloadUsageWsClient(httpClient.resource(uri), injector.getInstance(ClientFilter.class)); } /** * Sets up a OccurrenceDownloadService client avoiding the use of guice as our gbif jackson libraries * clash with the hadoop versions. * Sets up an http client with a one minute timeout and http support only. */ public OccurrenceDownloadService setupOccurrenceDownloadService(String uri) { return new OccurrenceDownloadWsClient(httpClient.resource(uri), injector.getInstance(ClientFilter.class)); } /** * Creates a instance of the gbif authentication module. */ private AbstractModule createAuthModuleInstance(Properties properties) { return new SingleUserAuthModule(properties.getProperty(DownloadWorkflowModule.DefaultSettings.DOWNLOAD_USER_KEY), properties.getProperty(DownloadWorkflowModule.DefaultSettings.DOWNLOAD_PASSWORD_KEY)); } }