This is an automated email from the git hooks/post-receive script. New commit to branch feature/4309_correction_synchro_ref_avancee_serveur_distant in repository observe. See https://gitlab.nuiton.org/codelutin/observe.git commit 38a6aa9e3719ac691b4f46ff2c11eae3a005c8e2 Author: Samuel Maisonneuve <maisonneuve@codelutin.com> Date: Fri Aug 26 18:39:06 2016 +0200 Corrige les erreurs liées à la sérialisation/deserialisation des objets Introduit notamment un ImmutableMultimapAdapter refs #4309 --- .../diff/ReferentialSynchronizeDiffService.java | 1 + .../ng/ReferentialSynchronizeRequest.java | 9 ++- ...entialSynchronizeServiceProduceSqlsRequest.java | 3 +- ...rentialSynchronizeServiceProduceSqlsResult.java | 4 +- .../ng/ReferentialSynchronizeSqlsRequest.java | 3 +- .../dto/gson/ImmutableMultimapAdapter.java | 85 ++++++++++++++++++++++ .../services/dto/gson/ObserveDtoGsonSupplier.java | 2 + 7 files changed, 100 insertions(+), 7 deletions(-) diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/diff/ReferentialSynchronizeDiffService.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/diff/ReferentialSynchronizeDiffService.java index c19fa4a..e1a98d4 100644 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/diff/ReferentialSynchronizeDiffService.java +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/diff/ReferentialSynchronizeDiffService.java @@ -18,6 +18,7 @@ public interface ReferentialSynchronizeDiffService extends ObserveService { @ReadReferentialPermission <R extends ReferentialDto> ReferentialReferenceSet<R> getEnabledReferentialReferenceSet(Class<R> referentialName); + @PostRequest @ReadReferentialPermission <R extends ReferentialDto> ReferentialReferenceSet<R> getReferentialReferenceSet(Class<R> referentialName, ImmutableSet<String> ids); diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/ng/ReferentialSynchronizeRequest.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/ng/ReferentialSynchronizeRequest.java index 240d2cb..6a4f0fe 100644 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/ng/ReferentialSynchronizeRequest.java +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/ng/ReferentialSynchronizeRequest.java @@ -5,6 +5,7 @@ import com.google.common.collect.ImmutableMultimap; import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSetMultimap; import com.google.common.collect.Multimap; +import fr.ird.observe.services.dto.ObserveDto; import fr.ird.observe.services.dto.referential.ReferentialDto; import fr.ird.observe.services.service.actions.synchro.referential.ng.task.ReferentialSynchronizeTask; import fr.ird.observe.services.service.actions.synchro.referential.ng.task.ReferentialSynchronizeTaskType; @@ -20,18 +21,18 @@ import java.util.stream.Collectors; * @author Tony Chemit - chemit@codelutin.com * @since 5.0 */ -public class ReferentialSynchronizeRequest { +public class ReferentialSynchronizeRequest implements ObserveDto { /** Logger. */ private static final Log log = LogFactory.getLog(ReferentialSynchronizeRequest.class); private final ImmutableMultimap<ReferentialSynchronizeTaskType, ReferentialSynchronizeTask<?>> tasks; private final ImmutableSet<Class<? extends ReferentialDto>> types; - private final Multimap<Class<? extends ReferentialDto>, String> idsOnlyExistingOnThisSide; + private final ImmutableSetMultimap<Class<? extends ReferentialDto>, String> idsOnlyExistingOnThisSide; private ReferentialSynchronizeRequest(ImmutableMultimap<ReferentialSynchronizeTaskType, ReferentialSynchronizeTask<?>> tasks, ImmutableSet<Class<? extends ReferentialDto>> types, - Multimap<Class<? extends ReferentialDto>, String> idsOnlyExistingOnThisSide) { + ImmutableSetMultimap<Class<? extends ReferentialDto>, String> idsOnlyExistingOnThisSide) { this.tasks = tasks; this.types = types; this.idsOnlyExistingOnThisSide = idsOnlyExistingOnThisSide; @@ -93,7 +94,7 @@ public class ReferentialSynchronizeRequest { } public ReferentialSynchronizeRequest build() { - return new ReferentialSynchronizeRequest(tasksBuilder.build(), typesBuilder.build(), idsOnlyExistingOnThisSide); + return new ReferentialSynchronizeRequest(tasksBuilder.build(), typesBuilder.build(), ImmutableSetMultimap.copyOf(idsOnlyExistingOnThisSide)); } public <R extends ReferentialDto> Builder addTask(ReferentialSynchronizeTaskType taskType, Class<R> type, String referentialId, String replaceReferentialId) { diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/ng/ReferentialSynchronizeServiceProduceSqlsRequest.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/ng/ReferentialSynchronizeServiceProduceSqlsRequest.java index 9362c29..d976d7b 100644 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/ng/ReferentialSynchronizeServiceProduceSqlsRequest.java +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/ng/ReferentialSynchronizeServiceProduceSqlsRequest.java @@ -1,6 +1,7 @@ package fr.ird.observe.services.service.actions.synchro.referential.ng; import com.google.common.collect.ImmutableSetMultimap; +import fr.ird.observe.services.dto.ObserveDto; import fr.ird.observe.services.dto.referential.ReferentialDto; import fr.ird.observe.services.service.actions.synchro.referential.ng.task.ReferentialSynchronizeTaskType; @@ -11,7 +12,7 @@ import java.util.Set; * * @author Tony Chemit - chemit@codelutin.com */ -public class ReferentialSynchronizeServiceProduceSqlsRequest { +public class ReferentialSynchronizeServiceProduceSqlsRequest implements ObserveDto { private final ReferentialSynchronizeRequest leftRequest; private final ReferentialSynchronizeRequest rightRequest; diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/ng/ReferentialSynchronizeServiceProduceSqlsResult.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/ng/ReferentialSynchronizeServiceProduceSqlsResult.java index e495f4f..43a4e95 100644 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/ng/ReferentialSynchronizeServiceProduceSqlsResult.java +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/ng/ReferentialSynchronizeServiceProduceSqlsResult.java @@ -1,11 +1,13 @@ package fr.ird.observe.services.service.actions.synchro.referential.ng; +import fr.ird.observe.services.dto.ObserveDto; + /** * Created on 15/08/16. * * @author Tony Chemit - chemit@codelutin.com */ -public class ReferentialSynchronizeServiceProduceSqlsResult { +public class ReferentialSynchronizeServiceProduceSqlsResult implements ObserveDto { protected final ReferentialSynchronizeSqlsRequest leftRequest; protected final ReferentialSynchronizeSqlsRequest rightRequest; diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/ng/ReferentialSynchronizeSqlsRequest.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/ng/ReferentialSynchronizeSqlsRequest.java index b3ac9b9..8b4300a 100644 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/ng/ReferentialSynchronizeSqlsRequest.java +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/ng/ReferentialSynchronizeSqlsRequest.java @@ -1,5 +1,6 @@ package fr.ird.observe.services.service.actions.synchro.referential.ng; +import fr.ird.observe.services.dto.ObserveDto; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -9,7 +10,7 @@ import org.apache.commons.logging.LogFactory; * @author Tony Chemit - chemit@codelutin.com * @since 5.0 */ -public class ReferentialSynchronizeSqlsRequest { +public class ReferentialSynchronizeSqlsRequest implements ObserveDto { /** Logger. */ private static final Log log = LogFactory.getLog(ReferentialSynchronizeSqlsRequest.class); diff --git a/observe-services-model/src/main/java/fr/ird/observe/services/dto/gson/ImmutableMultimapAdapter.java b/observe-services-model/src/main/java/fr/ird/observe/services/dto/gson/ImmutableMultimapAdapter.java new file mode 100644 index 0000000..1888d0c --- /dev/null +++ b/observe-services-model/src/main/java/fr/ird/observe/services/dto/gson/ImmutableMultimapAdapter.java @@ -0,0 +1,85 @@ +package fr.ird.observe.services.dto.gson; + +/* + * #%L + * ObServe :: Services model + * %% + * Copyright (C) 2008 - 2015 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.collect.ImmutableMultimap; +import com.google.common.reflect.TypeParameter; +import com.google.common.reflect.TypeToken; +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonParseException; +import com.google.gson.JsonSerializationContext; +import com.google.gson.JsonSerializer; + +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * @author Samuel Maisonneuve - maisonneuve@codelutin.com + */ +public class ImmutableMultimapAdapter implements JsonSerializer<ImmutableMultimap>, JsonDeserializer<ImmutableMultimap> { + + + @Override + public JsonElement serialize(ImmutableMultimap src, Type typeOfSrc, JsonSerializationContext context) { + return context.serialize(src.asMap()); + } + + @Override + public ImmutableMultimap deserialize(JsonElement json, Type type, JsonDeserializationContext context) throws JsonParseException { + + ImmutableMultimap.Builder builder = ImmutableMultimap.builder(); + + Type[] actualTypeArguments = ((ParameterizedType) type).getActualTypeArguments(); + Type keyType = actualTypeArguments[0]; + Type valueType = actualTypeArguments[1]; + + Type type2 = mapOf(TypeToken.of(keyType), TypeToken.of(valueType)).getType(); + Map map = context.deserialize(json, type2); + + for (Object key : map.keySet()) { + Object multimapKeyType = ((Class) keyType).cast(key); + List multimapValues = (List) map.get(key); + + for (Object multimapValue : multimapValues) { + builder.put(multimapKeyType, multimapValue); + } + } + + ImmutableMultimap result = builder.build(); + return result; + + } + + + static <K, V> TypeToken<Map<K, Collection<V>>> mapOf(TypeToken<K> keyType, TypeToken<V> valueType) { + return new TypeToken<Map<K, Collection<V>>>() {} + .where(new TypeParameter<K>() {}, keyType) + .where(new TypeParameter<V>() {}, valueType); + } + +} diff --git a/observe-services-model/src/main/java/fr/ird/observe/services/dto/gson/ObserveDtoGsonSupplier.java b/observe-services-model/src/main/java/fr/ird/observe/services/dto/gson/ObserveDtoGsonSupplier.java index a152b7e..c7202a6 100644 --- a/observe-services-model/src/main/java/fr/ird/observe/services/dto/gson/ObserveDtoGsonSupplier.java +++ b/observe-services-model/src/main/java/fr/ird/observe/services/dto/gson/ObserveDtoGsonSupplier.java @@ -25,6 +25,7 @@ package fr.ird.observe.services.dto.gson; import com.google.common.base.Supplier; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableMultimap; import com.google.common.collect.ImmutableSet; import com.google.gson.Gson; import com.google.gson.GsonBuilder; @@ -96,6 +97,7 @@ public class ObserveDtoGsonSupplier implements Supplier<Gson> { gsonBuilder.registerTypeAdapter(ImmutableList.class, new ImmutableListAdapter()); gsonBuilder.registerTypeAdapter(ImmutableSet.class, new ImmutableSetAdapter()); gsonBuilder.registerTypeAdapter(ImmutableMap.class, new ImmutableMapAdapter()); + gsonBuilder.registerTypeAdapter(ImmutableMultimap.class, new ImmutableMultimapAdapter()); gsonBuilder.registerTypeAdapter(DataReference.class, new DataReferenceAdapter()); gsonBuilder.registerTypeAdapter(ReferentialReference.class, new ReferentialReferenceAdapter()); -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.