This is an automated email from the git hooks/post-receive script. New commit to branch feature/7421 in repository observe. See http://git.codelutin.com/observe.git commit cca99f35eb293fc8ae7afff952bc842d8d1c31b4 Author: Sylvain Bavencoff <bavencoff@codelutin.com> Date: Wed Sep 16 10:29:27 2015 +0200 compression des requète (refs #7521) --- ...bserveDataSourceConfigurationRestConstants.java | 8 +- .../services/ObserveServiceFactoryRest.java | 55 +++++++++--- .../ObserveRestClientConfiguration.java | 75 ++++++++++++++++ ...bserveRestClientConfigurationInitException.java | 20 +++++ .../ObserveRestClientConfigurationOption.java | 100 +++++++++++++++++++++ .../ObserveRestClientConfigurationProvider.java | 37 ++++++++ .../services/http/ObserveResponseBuilder.java | 53 ++++++++++- .../org.nuiton.config.ApplicationConfigProvider | 1 + .../src/main/resources/observeRestClient.conf | 4 + 9 files changed, 333 insertions(+), 20 deletions(-) diff --git a/observe-services-configuration-rest/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConfigurationRestConstants.java b/observe-services-configuration-rest/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConfigurationRestConstants.java index ab827b8..d0c67f1 100644 --- a/observe-services-configuration-rest/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConfigurationRestConstants.java +++ b/observe-services-configuration-rest/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConfigurationRestConstants.java @@ -33,13 +33,15 @@ public interface ObserveDataSourceConfigurationRestConstants { Package ROOT_SERVICES_PACKAGE = DataSourceService.class.getPackage(); + String REQUEST_HEADER_PREFIX = "X-Observe-"; + String PARAMETER_DATA_SOURCE_CONFIGURATION = "dataSourceConfiguration"; - String REQUEST_APPLICATION_LOCALE = "applicationLocale"; + String REQUEST_APPLICATION_LOCALE = REQUEST_HEADER_PREFIX + "Application-Locale"; - String REQUEST_REFERENTIAL_LOCALE = "referentialLocale"; + String REQUEST_REFERENTIAL_LOCALE = REQUEST_HEADER_PREFIX + "Referential-Locale"; - String REQUEST_AUTHENTICATION_TOKEN = "authenticationToken"; + String REQUEST_AUTHENTICATION_TOKEN = REQUEST_HEADER_PREFIX + "Authentication-Token"; String REQUEST_ADMIN_API_KEY = "adminApiKey"; diff --git a/observe-services-rest/src/main/java/fr/ird/observe/services/ObserveServiceFactoryRest.java b/observe-services-rest/src/main/java/fr/ird/observe/services/ObserveServiceFactoryRest.java index f564b48..34800c9 100644 --- a/observe-services-rest/src/main/java/fr/ird/observe/services/ObserveServiceFactoryRest.java +++ b/observe-services-rest/src/main/java/fr/ird/observe/services/ObserveServiceFactoryRest.java @@ -37,6 +37,7 @@ import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationRestC import fr.ird.observe.services.configuration.ObserveDataSourceConnection; import fr.ird.observe.services.configuration.ObserveDataSourceConnectionRest; import fr.ird.observe.services.dto.gson.ObserveDtoGsonSupplier; +import fr.ird.observe.services.fr.ird.observe.client.rest.configuration.ObserveRestClientConfiguration; import fr.ird.observe.services.http.ObserveRequest; import fr.ird.observe.services.http.ObserveRequestBuilder; import fr.ird.observe.services.http.ObserveRequestMethod; @@ -63,23 +64,37 @@ public class ObserveServiceFactoryRest extends ObserveServiceFactorySupport impl /** Logger. */ private static final Log log = LogFactory.getLog(ObserveServiceFactoryRest.class); - protected final CachingParanamer paranamer = new CachingParanamer(); + protected final CachingParanamer paranamer; - protected final Supplier<Gson> gsonSupplier = new ObserveDtoGsonSupplier() { + protected final Supplier<Gson> gsonSupplier; - @Override - protected GsonBuilder getGsonBuilder(boolean prettyPrint) { + protected final ObserveResponseBuilder responseBuilder; - GsonBuilder builder = super.getGsonBuilder(prettyPrint); + protected final ObserveRestClientConfiguration configuration; - // Les ObserveDataSourceConnection sont obligatoirement de type ObserveDataSourceConnectionRest - builder.registerTypeAdapter(ObserveDataSourceConnection.class, new ObserveDataSourceConnectionAdapter()); - return builder; + public ObserveServiceFactoryRest() { - } - }; + paranamer = new CachingParanamer(); + + gsonSupplier = new ObserveDtoGsonSupplier() { + @Override + protected GsonBuilder getGsonBuilder(boolean prettyPrint) { + + GsonBuilder builder = super.getGsonBuilder(prettyPrint); + + // Les ObserveDataSourceConnection sont obligatoirement de type ObserveDataSourceConnectionRest + builder.registerTypeAdapter(ObserveDataSourceConnection.class, new ObserveDataSourceConnectionAdapter()); + return builder; + + } + }; + + configuration = new ObserveRestClientConfiguration(); + + configuration.init(); - protected final ObserveResponseBuilder responseBuilder = ObserveResponseBuilder.create(gsonSupplier); + responseBuilder = ObserveResponseBuilder.create(gsonSupplier, configuration.isCompressRequest()); + } @Override public <S extends ObserveService> boolean accept(ObserveDataSourceConfiguration dataSourceConfiguration, Class<S> serviceType) { @@ -135,7 +150,13 @@ public class ObserveServiceFactoryRest extends ObserveServiceFactorySupport impl protected <S extends ObserveService> S newRemoteProxyServiceInstance(Class<S> serviceType, ObserveServiceInitializer observeServiceInitializer) { - RemoteInvocationHandler handler = new RemoteInvocationHandler<>(paranamer, serviceType, observeServiceInitializer, gsonSupplier, responseBuilder); + RemoteInvocationHandler handler = new RemoteInvocationHandler<>(paranamer, + serviceType, + observeServiceInitializer, + gsonSupplier, + responseBuilder, + configuration.isCompressRequest()); + S result = Reflection.newProxy(serviceType, handler); return result; @@ -159,7 +180,14 @@ public class ObserveServiceFactoryRest extends ObserveServiceFactorySupport impl protected final ObserveResponseBuilder responseBuilder; - public RemoteInvocationHandler(Paranamer paranamer, Class<E> serviceClass, ObserveServiceInitializer observeServiceInitializer, Supplier<Gson> gsonSupplier, ObserveResponseBuilder responseBuilder) { + protected final boolean compressRequest; + + public RemoteInvocationHandler(Paranamer paranamer, + Class<E> serviceClass, + ObserveServiceInitializer observeServiceInitializer, + Supplier<Gson> gsonSupplier, + ObserveResponseBuilder responseBuilder, + boolean compressRequest) { this.paranamer = paranamer; this.serviceClass = serviceClass; this.locateService = serviceClass.getCanonicalName().replace(ROOT_SERVICES_PACKAGE.getName(), "").replace(".", "/"); @@ -175,6 +203,7 @@ public class ObserveServiceFactoryRest extends ObserveServiceFactorySupport impl this.applicationLocale = observeServiceInitializer.getApplicationLocale().toString(); this.referentialLocale = observeServiceInitializer.getReferentialLocale().getLocale().toString(); this.responseBuilder = responseBuilder; + this.compressRequest = compressRequest; } protected String getServiceUrl() { diff --git a/observe-services-rest/src/main/java/fr/ird/observe/services/fr/ird/observe/client/rest/configuration/ObserveRestClientConfiguration.java b/observe-services-rest/src/main/java/fr/ird/observe/services/fr/ird/observe/client/rest/configuration/ObserveRestClientConfiguration.java new file mode 100644 index 0000000..e3b4bc6 --- /dev/null +++ b/observe-services-rest/src/main/java/fr/ird/observe/services/fr/ird/observe/client/rest/configuration/ObserveRestClientConfiguration.java @@ -0,0 +1,75 @@ +package fr.ird.observe.services.fr.ird.observe.client.rest.configuration; + +import com.google.common.base.Charsets; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.config.ApplicationConfig; +import org.nuiton.config.ApplicationConfigHelper; +import org.nuiton.config.ApplicationConfigProvider; +import org.nuiton.config.ArgumentsParserException; + +/** + * @author Sylvain Bavencoff - bavencoff@codelutin.com + */ +public class ObserveRestClientConfiguration { + + private static final Log log = LogFactory.getLog(ObserveRestClientConfiguration.class); + + protected static final String DEFAULT_OBSERVE_REST_CLIENT_CONFIGURATION_FILENAME = "observeRestClient.conf"; + + private final ApplicationConfig applicationConfig; + + public ObserveRestClientConfiguration() { + this(DEFAULT_OBSERVE_REST_CLIENT_CONFIGURATION_FILENAME); + } + + public ObserveRestClientConfiguration(String confFileName) { + applicationConfig = new ApplicationConfig(); + applicationConfig.setEncoding(Charsets.UTF_8.name()); + applicationConfig.setConfigFileName(confFileName); + ApplicationConfigProvider applicationConfigProvider = ApplicationConfigHelper.getProvider(getClass().getClassLoader(), ObserveRestClientConfigurationProvider.OBSERVE_REST_CLIENT_CONFIGURATION_PROVIDER_NAME); + applicationConfig.loadDefaultOptions(applicationConfigProvider.getOptions()); + + } + + public boolean isDevMode() { + return applicationConfig.getOptionAsBoolean(ObserveRestClientConfigurationOption.DEV_MODE.getKey()); + } + + public boolean isCompressRequest() { + return applicationConfig.getOptionAsBoolean(ObserveRestClientConfigurationOption.COMPRESS_REQUEST.getKey()); + } + + public void init(String... args) { + + if (log.isInfoEnabled()) { + log.info("Starts to init ObserveRestClient configuration..."); + } + + try { + applicationConfig.parse(args); + } catch (ArgumentsParserException e) { + throw new ObserveRestClientConfigurationInitException("could not parse configuration", e); + } + + if (log.isInfoEnabled()) { + String message = getConfigurationDescription(); + log.info(message); + } + + } + + public String getConfigurationDescription() { + StringBuilder builder = new StringBuilder(); + builder.append("\n====================================================================================================================="); + builder.append("\n=== Observe Rest Client configuration ==============================================================================="); + builder.append(String.format("\n=== %1$-40s = %2$s", "Filename", applicationConfig.getConfigFileName())); + for (ObserveRestClientConfigurationOption option : ObserveRestClientConfigurationOption.orderedByNameValues()) { + builder.append(String.format("\n=== %1$-40s = %2$s", option.getKey(), applicationConfig.getOption(option))); + } + builder.append("\n====================================================================================================================="); + return builder.toString(); + } + + +} diff --git a/observe-services-rest/src/main/java/fr/ird/observe/services/fr/ird/observe/client/rest/configuration/ObserveRestClientConfigurationInitException.java b/observe-services-rest/src/main/java/fr/ird/observe/services/fr/ird/observe/client/rest/configuration/ObserveRestClientConfigurationInitException.java new file mode 100644 index 0000000..b78466b --- /dev/null +++ b/observe-services-rest/src/main/java/fr/ird/observe/services/fr/ird/observe/client/rest/configuration/ObserveRestClientConfigurationInitException.java @@ -0,0 +1,20 @@ +package fr.ird.observe.services.fr.ird.observe.client.rest.configuration; + +/** + * @author Sylvain Bavencoff - bavencoff@codelutin.com + */ +public class ObserveRestClientConfigurationInitException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + public ObserveRestClientConfigurationInitException() { + } + + public ObserveRestClientConfigurationInitException(String message) { + super(message); + } + + public ObserveRestClientConfigurationInitException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/observe-services-rest/src/main/java/fr/ird/observe/services/fr/ird/observe/client/rest/configuration/ObserveRestClientConfigurationOption.java b/observe-services-rest/src/main/java/fr/ird/observe/services/fr/ird/observe/client/rest/configuration/ObserveRestClientConfigurationOption.java new file mode 100644 index 0000000..c5bb3d9 --- /dev/null +++ b/observe-services-rest/src/main/java/fr/ird/observe/services/fr/ird/observe/client/rest/configuration/ObserveRestClientConfigurationOption.java @@ -0,0 +1,100 @@ +package fr.ird.observe.services.fr.ird.observe.client.rest.configuration; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Lists; +import org.apache.commons.lang3.NotImplementedException; +import org.nuiton.config.ConfigOptionDef; +import org.nuiton.util.version.Version; + +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +import static org.nuiton.i18n.I18n.n; + +/** + * @author Sylvain Bavencoff - bavencoff@codelutin.com + */ +public enum ObserveRestClientConfigurationOption implements ConfigOptionDef { + + BUILD_VERSION("observeRestClient.build.version", n("observeRestClient.build.version.description"), "", Version.class), + BUILD_DATE("observeRestClient.build.date", n("observeRestClient.build.date.description"), "", String.class), + BUILD_NUMBER("observeRestClient.build.number", n("observeRestClient.build.number.description"), "", String.class), + + DEV_MODE("observeRestClient.devMode", n("observeRestClient.devMode.description"), "true", boolean.class), + COMPRESS_REQUEST("observeRestClient.compressRequest", n("observeRestClient.compressRequest.description"), "true", boolean.class); + + ObserveRestClientConfigurationOption(String key, String description, String defaultValue, Class<?> type) { + this.key = key; + this.description = description; + this.defaultValue = defaultValue; + this.type = type; + } + + private final String key; + + private final String description; + + private final String defaultValue; + + private final Class<?> type; + + @Override + public String getKey() { + return key; + } + + @Override + public Class<?> getType() { + return type; + } + + @Override + public String getDescription() { + return description; + } + + @Override + public String getDefaultValue() { + return defaultValue; + } + + @Override + public boolean isTransient() { + return false; + } + + @Override + public boolean isFinal() { + return true; + } + + @Override + public void setDefaultValue(String defaultValue) { + throw new NotImplementedException("Can't invoke setDefaultValue method"); + } + + @Override + public void setTransient(boolean isTransient) { + throw new NotImplementedException("Can't invoke setTransient method"); + } + + @Override + public void setFinal(boolean isFinal) { + throw new NotImplementedException("Can't invoke setFinal method"); + } + + public static ImmutableList<ObserveRestClientConfigurationOption> orderedByNameValues() { + + List<ObserveRestClientConfigurationOption> values = Lists.newArrayList(values()); + Collections.sort(values, new Comparator<ObserveRestClientConfigurationOption>() { + + @Override + public int compare(ObserveRestClientConfigurationOption o1, ObserveRestClientConfigurationOption o2) { + return o1.getKey().compareTo(o2.getKey()); + } + }); + return ImmutableList.copyOf(values); + + } +} diff --git a/observe-services-rest/src/main/java/fr/ird/observe/services/fr/ird/observe/client/rest/configuration/ObserveRestClientConfigurationProvider.java b/observe-services-rest/src/main/java/fr/ird/observe/services/fr/ird/observe/client/rest/configuration/ObserveRestClientConfigurationProvider.java new file mode 100644 index 0000000..964415d --- /dev/null +++ b/observe-services-rest/src/main/java/fr/ird/observe/services/fr/ird/observe/client/rest/configuration/ObserveRestClientConfigurationProvider.java @@ -0,0 +1,37 @@ +package fr.ird.observe.services.fr.ird.observe.client.rest.configuration; + +import org.nuiton.config.ApplicationConfigProvider; +import org.nuiton.config.ConfigActionDef; +import org.nuiton.config.ConfigOptionDef; + +import java.util.Locale; + +import static org.nuiton.i18n.I18n.l; + +/** + * @author Sylvain Bavencoff - bavencoff@codelutin.com + */ +public class ObserveRestClientConfigurationProvider implements ApplicationConfigProvider { + + public static final String OBSERVE_REST_CLIENT_CONFIGURATION_PROVIDER_NAME = "observeRestClient"; + + @Override + public String getName() { + return OBSERVE_REST_CLIENT_CONFIGURATION_PROVIDER_NAME; + } + + @Override + public String getDescription(Locale locale) { + return l(locale, "observeRestClient.configuration.description"); + } + + @Override + public ConfigOptionDef[] getOptions() { + return ObserveRestClientConfigurationOption.values(); + } + + @Override + public ConfigActionDef[] getActions() { + return new ConfigActionDef[0]; + } +} diff --git a/observe-services-rest/src/main/java/fr/ird/observe/services/http/ObserveResponseBuilder.java b/observe-services-rest/src/main/java/fr/ird/observe/services/http/ObserveResponseBuilder.java index 563674a..71e1367 100644 --- a/observe-services-rest/src/main/java/fr/ird/observe/services/http/ObserveResponseBuilder.java +++ b/observe-services-rest/src/main/java/fr/ird/observe/services/http/ObserveResponseBuilder.java @@ -35,9 +35,15 @@ import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.http.Header; +import org.apache.http.HeaderElement; +import org.apache.http.HttpEntity; +import org.apache.http.HttpRequest; +import org.apache.http.HttpRequestInterceptor; import org.apache.http.HttpResponse; +import org.apache.http.HttpResponseInterceptor; import org.apache.http.NameValuePair; import org.apache.http.client.HttpClient; +import org.apache.http.client.entity.GzipDecompressingEntity; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpDelete; import org.apache.http.client.methods.HttpEntityEnclosingRequestBase; @@ -53,11 +59,12 @@ import org.apache.http.entity.mime.HttpMultipartMode; import org.apache.http.entity.mime.MultipartEntity; import org.apache.http.entity.mime.content.FileBody; import org.apache.http.entity.mime.content.StringBody; -import org.apache.http.impl.client.DefaultHttpClient; -import org.apache.http.impl.conn.PoolingClientConnectionManager; +import org.apache.http.impl.client.HttpClientBuilder; +import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; import org.apache.http.params.BasicHttpParams; import org.apache.http.params.CoreConnectionPNames; import org.apache.http.params.HttpParams; +import org.apache.http.protocol.HttpContext; import java.io.File; import java.io.IOException; @@ -79,8 +86,43 @@ public class ObserveResponseBuilder { private static final Log log = LogFactory.getLog(ObserveResponseBuilder.class); - public static ObserveResponseBuilder create(Supplier<Gson> gsonSupplier) { - return new ObserveResponseBuilder(new DefaultHttpClient(new PoolingClientConnectionManager()), gsonSupplier); + public static ObserveResponseBuilder create(Supplier<Gson> gsonSupplier, boolean compressData) { + HttpClientBuilder clientBuilder = HttpClientBuilder.create(); + if (compressData) { + clientBuilder.addInterceptorFirst(new HttpRequestInterceptor() { + + @Override + public void process(HttpRequest request,HttpContext context) { + if (!request.containsHeader("Accept-Encoding")) { + request.addHeader("Accept-Encoding", "gzip"); + } + } + + }); + clientBuilder.addInterceptorLast(new HttpResponseInterceptor() { + + @Override + public void process(HttpResponse response, HttpContext context) { + HttpEntity entity = response.getEntity(); + if (entity != null) { + Header contentEncoding = entity.getContentEncoding(); + if (contentEncoding != null) { + HeaderElement[] codecs = contentEncoding.getElements(); + for (HeaderElement codec : codecs) { + if (codec.getName().equalsIgnoreCase("gzip")) { + response.setEntity( + new GzipDecompressingEntity(response.getEntity())); + return; + } + } + } + } + } + }); + } + clientBuilder.setConnectionManager(new PoolingHttpClientConnectionManager()); + + return new ObserveResponseBuilder(clientBuilder.build(), gsonSupplier); } public static ObserveResponseBuilder create(HttpClient client, Supplier<Gson> gsonSupplier) { @@ -302,6 +344,9 @@ public class ObserveResponseBuilder { try { HttpResponse response = client.execute(request); + if (log.isInfoEnabled()) { + log.info("content-encoding : " + response.getLastHeader("Content-Encoding") + " content-Lenght : " + response.getLastHeader("Content-Length")); + } return response; } catch (UnknownHostException | ConnectException e) { // Le service n'est pas accessible diff --git a/observe-services-rest/src/main/resources/META-INF/services/org.nuiton.config.ApplicationConfigProvider b/observe-services-rest/src/main/resources/META-INF/services/org.nuiton.config.ApplicationConfigProvider new file mode 100644 index 0000000..35019d4 --- /dev/null +++ b/observe-services-rest/src/main/resources/META-INF/services/org.nuiton.config.ApplicationConfigProvider @@ -0,0 +1 @@ +fr.ird.observe.services.fr.ird.observe.client.rest.configuration.ObserveRestClientConfigurationProvider \ No newline at end of file diff --git a/observe-services-rest/src/main/resources/observeRestClient.conf b/observe-services-rest/src/main/resources/observeRestClient.conf new file mode 100644 index 0000000..3e34132 --- /dev/null +++ b/observe-services-rest/src/main/resources/observeRestClient.conf @@ -0,0 +1,4 @@ +observeRestClient.devMode=${devMode} +observeRestClient.build.version=${project.version} +observeRestClient.build.date=${buildDate} +observeRestClient.build.number=${buildNumber} \ No newline at end of file -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@list.forge.codelutin.com>.