branch feature/7421 created (now cca99f3)
This is an automated email from the git hooks/post-receive script. New change to branch feature/7421 in repository observe. See http://git.codelutin.com/observe.git at cca99f3 compression des requète (refs #7521) This branch includes the following new commits: new cca99f3 compression des requète (refs #7521) The 1 revisions listed above as "new" are entirely new to this repository and will be described in separate emails. The revisions listed as "adds" were already present in the repository and have only been added to this reference. Detailed log of new commits: commit cca99f35eb293fc8ae7afff952bc842d8d1c31b4 Author: Sylvain Bavencoff <bavencoff@codelutin.com> Date: Wed Sep 16 10:29:27 2015 +0200 compression des requète (refs #7521) -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@list.forge.codelutin.com>.
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>.
participants (1)
-
codelutin.com scm