This is an automated email from the git hooks/post-receive script. New commit to branch feature/7677_action_export_donnees_server_distant in repository observe. See https://gitlab.nuiton.org/codelutin/observe.git commit eab2d46d090eb6fdbac18a555896560e6d363688 Author: Samuel Maisonneuve <maisonneuve@codelutin.com> Date: Tue Aug 23 18:21:24 2016 +0200 Remplace ImmutableSet<ReferentilDto> par des ReferntialMultimap dans UnidirectionalReferentialSynchronizeRequest afin de permettre la deserialisation de cet objet refs #7677 --- .../web/ObserveWebApplicationListener.java | 2 + ...tionalReferntialSynchronizeRequestInjector.java | 75 ++++++++++++++++++++++ ...nidirectionalReferentialSynchronizeRequest.java | 32 ++++++--- .../dto/gson/ReferentialMultimapAdapter.java | 5 +- .../dto/referential/ReferentialMultimap.java | 29 +++++++++ .../ReferentialSynchronizeDiffServiceTopia.java | 5 +- 6 files changed, 134 insertions(+), 14 deletions(-) diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebApplicationListener.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebApplicationListener.java index f4bd444..b6b757c 100644 --- a/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebApplicationListener.java +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebApplicationListener.java @@ -31,6 +31,7 @@ import fr.ird.observe.application.web.injector.ObserveDataSourceConfigurationInj import fr.ird.observe.application.web.injector.ObserveDtoInjector; import fr.ird.observe.application.web.injector.ObserveReferenceSetRequestInjector; import fr.ird.observe.application.web.injector.SqlScriptProducerRequestInjector; +import fr.ird.observe.application.web.injector.UnidirectionalReferntialSynchronizeRequestInjector; import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationRestConstants; import fr.ird.observe.services.dto.ObserveDbUserDto; import org.apache.commons.logging.Log; @@ -71,6 +72,7 @@ public class ObserveWebApplicationListener implements WebMotionServerListener { context.addInjector(new DateInjector(ObserveDataSourceConfigurationRestConstants.DATE_PATTERN)); context.addInjector(new SqlScriptProducerRequestInjector(gson)); context.addInjector(new ImmutableSetInjector()); + context.addInjector(new UnidirectionalReferntialSynchronizeRequestInjector(gson)); context.addConverter(new ObserveDtoConverter(gson), ObserveDbUserDto.class); context.getServletContext().setAttribute( diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/injector/UnidirectionalReferntialSynchronizeRequestInjector.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/injector/UnidirectionalReferntialSynchronizeRequestInjector.java new file mode 100644 index 0000000..59f0ad6 --- /dev/null +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/injector/UnidirectionalReferntialSynchronizeRequestInjector.java @@ -0,0 +1,75 @@ +package fr.ird.observe.application.web.injector; + +/*- + * #%L + * ObServe :: Application Web + * %% + * Copyright (C) 2008 - 2016 IRD, Codelutin, Tony Chemit + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ + +import com.google.common.base.Preconditions; +import com.google.gson.Gson; +import fr.ird.observe.services.service.actions.synchro.referential.legacy.UnidirectionalReferentialSynchronizeRequest; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.debux.webmotion.server.call.Call; +import org.debux.webmotion.server.handler.ExecutorParametersInjectorHandler; +import org.debux.webmotion.server.mapping.Mapping; + +import java.lang.reflect.Type; + +/** + * @author Samuel Maisonneuve - maisonneuve@codelutin.com + */ +public class UnidirectionalReferntialSynchronizeRequestInjector implements ExecutorParametersInjectorHandler.Injector { + + /** Logger. */ + private static final Log log = LogFactory.getLog(UnidirectionalReferntialSynchronizeRequestInjector.class); + + protected final Gson gson; + + public UnidirectionalReferntialSynchronizeRequestInjector(Gson gson) { + this.gson = gson; + } + + @Override + public Object getValue(Mapping mapping, Call call, String name, Class<?> type, Type generic) { + + UnidirectionalReferentialSynchronizeRequest result = null; + + if (type.equals(UnidirectionalReferentialSynchronizeRequest.class)) { + + Call.ParameterTree parameterTree = call.getParameterTree().getObject().get(name); + + Preconditions.checkNotNull(parameterTree, "Le paramètre " + name + " n'as pas été trouvé, recompiler (parameter)!"); + + String gsonContent = ((String[]) parameterTree.getValue())[0]; + + result = gson.fromJson(gsonContent, UnidirectionalReferentialSynchronizeRequest.class); + + if (log.isInfoEnabled()) { + log.info("Inject UnidirectionalReferntialSynchronizeRequestInjector: " + result); + } + + } + + return result; + + } + +} diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/legacy/UnidirectionalReferentialSynchronizeRequest.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/legacy/UnidirectionalReferentialSynchronizeRequest.java index fbab2e4..4ec070a 100644 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/legacy/UnidirectionalReferentialSynchronizeRequest.java +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/legacy/UnidirectionalReferentialSynchronizeRequest.java @@ -25,7 +25,9 @@ package fr.ird.observe.services.service.actions.synchro.referential.legacy; import com.google.common.base.MoreObjects; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Multiset; import fr.ird.observe.services.dto.referential.ReferentialDto; +import fr.ird.observe.services.dto.referential.ReferentialMultimap; import java.util.Objects; @@ -47,8 +49,8 @@ public class UnidirectionalReferentialSynchronizeRequest<R extends ReferentialDt } private final Class<R> referentialName; - private final ImmutableSet<R> referentialToAdd; - private final ImmutableSet<R> referentialToUpdate; + private final ReferentialMultimap<R> referentialToAdd; + private final ReferentialMultimap<R> referentialToUpdate; private final ImmutableSet<String> referentialToRemove; private final ImmutableMap<String, String> referentialToReplace; @@ -57,11 +59,25 @@ public class UnidirectionalReferentialSynchronizeRequest<R extends ReferentialDt } public ImmutableSet<R> getReferentialToAdd() { - return referentialToAdd; + ImmutableSet<R> result = new ImmutableSet.Builder().build(); + + Multiset<Class<R>> entries = referentialToAdd.keys(); + if (!entries.isEmpty()) { + result = referentialToAdd.get(entries.iterator().next()); + } + + return result; } public ImmutableSet<R> getReferentialToUpdate() { - return referentialToUpdate; + ImmutableSet<R> result = new ImmutableSet.Builder().build(); + + Multiset<Class<R>> entries = referentialToUpdate.keys(); + if (!entries.isEmpty()) { + result = referentialToUpdate.get(entries.iterator().next()); + } + + return result; } public ImmutableSet<String> getReferentialToRemove() { @@ -100,8 +116,8 @@ public class UnidirectionalReferentialSynchronizeRequest<R extends ReferentialDt } private UnidirectionalReferentialSynchronizeRequest(Class<R> referentialName, - ImmutableSet<R> referentialToAdd, - ImmutableSet<R> referentialToUpdate, + ReferentialMultimap<R> referentialToAdd, + ReferentialMultimap<R> referentialToUpdate, ImmutableSet<String> referentialToRemove, ImmutableMap<String, String> toReplace) { this.referentialName = referentialName; @@ -114,8 +130,8 @@ public class UnidirectionalReferentialSynchronizeRequest<R extends ReferentialDt public static class Builder<R extends ReferentialDto> { private final Class<R> referentialName; - private final ImmutableSet.Builder<R> toAddBuilder = ImmutableSet.builder(); - private final ImmutableSet.Builder<R> toUpdateBuilder = ImmutableSet.builder(); + private final ReferentialMultimap.Builder<R> toAddBuilder = ReferentialMultimap.builder(); + private final ReferentialMultimap.Builder<R> toUpdateBuilder = ReferentialMultimap.builder(); private final ImmutableSet.Builder<String> toRemoveBuilder = ImmutableSet.builder(); private final ImmutableMap.Builder<String, String> toReplaceBuilder = ImmutableMap.builder(); diff --git a/observe-services-model/src/main/java/fr/ird/observe/services/dto/gson/ReferentialMultimapAdapter.java b/observe-services-model/src/main/java/fr/ird/observe/services/dto/gson/ReferentialMultimapAdapter.java index 516a255..bd1b59d 100644 --- a/observe-services-model/src/main/java/fr/ird/observe/services/dto/gson/ReferentialMultimapAdapter.java +++ b/observe-services-model/src/main/java/fr/ird/observe/services/dto/gson/ReferentialMultimapAdapter.java @@ -22,7 +22,6 @@ package fr.ird.observe.services.dto.gson; * #L% */ -import com.google.common.collect.ImmutableSetMultimap; import com.google.common.reflect.TypeParameter; import com.google.common.reflect.TypeToken; import com.google.gson.JsonDeserializationContext; @@ -53,7 +52,7 @@ public class ReferentialMultimapAdapter implements JsonSerializer<ReferentialMul @Override public ReferentialMultimap deserialize(JsonElement json, Type type, JsonDeserializationContext context) throws JsonParseException { - ImmutableSetMultimap.Builder builder = ImmutableSetMultimap.builder(); + ReferentialMultimap.Builder builder = ReferentialMultimap.builder(); Set<Map.Entry<String, JsonElement>> entries = json.getAsJsonObject().entrySet(); for (Map.Entry<String, JsonElement> entry : entries) { @@ -72,7 +71,7 @@ public class ReferentialMultimapAdapter implements JsonSerializer<ReferentialMul builder.putAll(key, values); } - return ReferentialMultimap.copyOf(builder.build()); + return builder.build(); } diff --git a/observe-services-model/src/main/java/fr/ird/observe/services/dto/referential/ReferentialMultimap.java b/observe-services-model/src/main/java/fr/ird/observe/services/dto/referential/ReferentialMultimap.java index 1d1fb78..451b27f 100644 --- a/observe-services-model/src/main/java/fr/ird/observe/services/dto/referential/ReferentialMultimap.java +++ b/observe-services-model/src/main/java/fr/ird/observe/services/dto/referential/ReferentialMultimap.java @@ -22,6 +22,7 @@ package fr.ird.observe.services.dto.referential; * #L% */ +import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSetMultimap; @@ -52,6 +53,34 @@ public class ReferentialMultimap<K extends ReferentialDto> implements SetMultima return new ReferentialMultimap(multimap); } + public static <K extends ReferentialDto> Builder<K> builder() { + return new Builder<>(); + } + + public static class Builder<K extends ReferentialDto> { + private final ImmutableSetMultimap.Builder builder = ImmutableSetMultimap.builder(); + + public <K extends ReferentialDto> Builder add(K referentialDto) { + Preconditions.checkNotNull(referentialDto, "Can't add a null object in ReferentialMultimap"); + builder.put(referentialDto.getClass(), referentialDto); + return this; + } + + public <K extends ReferentialDto> Builder put(Class<K> dtoType, K referentialDto) { + builder.putAll(dtoType, referentialDto); + return this; + } + + public <K extends ReferentialDto> Builder putAll(Class<K> dtoType, Collection<K> values) { + builder.putAll(dtoType, values); + return this; + } + + public ReferentialMultimap<K> build() { + return copyOf(builder.build()); + } + } + private ReferentialMultimap() { immutableSetMultimap = ImmutableSetMultimap.<Class<K>, K>builder().build(); } diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/diff/ReferentialSynchronizeDiffServiceTopia.java b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/diff/ReferentialSynchronizeDiffServiceTopia.java index b4f701a..e83e77e 100644 --- a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/diff/ReferentialSynchronizeDiffServiceTopia.java +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/diff/ReferentialSynchronizeDiffServiceTopia.java @@ -1,7 +1,6 @@ package fr.ird.observe.services.service.actions.synchro.referential.diff; import com.google.common.collect.ImmutableSet; -import com.google.common.collect.ImmutableSetMultimap; import fr.ird.observe.ObserveEntityEnum; import fr.ird.observe.ObserveTopiaPersistenceContext; import fr.ird.observe.entities.Entities; @@ -65,7 +64,7 @@ public class ReferentialSynchronizeDiffServiceTopia extends ObserveServiceTopia } private <E extends ObserveReferentialEntity, R extends ReferentialDto> ReferentialMultimap<R> getReferentials0(Class<R> dtoType, Class<E> entityType, ImmutableSet<String> ids) { - ImmutableSetMultimap.Builder<Class<R>, R> result = ImmutableSetMultimap.builder(); + ReferentialMultimap.Builder<R> result = ReferentialMultimap.builder(); ReferentialLocale referentialLocale = getReferentialLocale(); List<E> entities = loadEntities(entityType, ids); for (E entity : entities) { @@ -73,7 +72,7 @@ public class ReferentialSynchronizeDiffServiceTopia extends ObserveServiceTopia result.put(dtoType, binder.toDto(referentialLocale, entity)); } - return ReferentialMultimap.copyOf(result.build()); + return result.build(); } @Override -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.