branch feature/7739_syncrho_ref_en_serveur_distant updated (a15ba5a -> c6e9e01)
This is an automated email from the git hooks/post-receive script. New change to branch feature/7739_syncrho_ref_en_serveur_distant in repository observe. See https://gitlab.nuiton.org/codelutin/observe.git from a15ba5a Merge branch 'feature/7739_synchro_referential' into develop new c6e9e01 Corrige les problèmes de sérialisation/deserialisation liés à la synchro referentiel en serveur distant 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 c6e9e0123336894574fde84fba14ed8d5d671277 Author: Samuel Maisonneuve <maisonneuve@codelutin.com> Date: Thu Aug 18 16:37:45 2016 +0200 Corrige les problèmes de sérialisation/deserialisation liés à la synchro referentiel en serveur distant Introduit un objet ReferentialMultimap visant a transporter les objets ReferentialDto à travers les processus de sérialisation/deserialisation tout en conservant l'information du type concret refs #7739 Summary of changes: .../web/ObserveWebApplicationListener.java | 2 + ...eferentialSynchronizeDiffServiceController.java | 5 +- ...lassInjector.java => ImmutableSetInjector.java} | 46 ++++--- observe-application-web/src/main/resources/mapping | 2 + .../diff/ReferentialSynchronizeDiff.java | 12 +- .../diff/ReferentialSynchronizeDiffService.java | 5 +- .../diff/ReferentialSynchronizeDiffState.java | 2 +- .../diff/ReferentialSynchronizeDiffsEngine.java | 7 +- .../services/dto/gson/ImmutableSetAdapter.java | 1 - .../services/dto/gson/ObserveDtoGsonSupplier.java | 3 + .../dto/gson/ReferentialMultimapAdapter.java | 83 +++++++++++++ .../dto/referential/ReferentialMultimap.java | 134 +++++++++++++++++++++ .../ReferentialSynchronizeDiffServiceTopia.java | 12 +- .../sql/InsertSqlStatementGenerator.java | 5 +- .../sql/UpdateSqlStatementGenerator.java | 3 +- 15 files changed, 290 insertions(+), 32 deletions(-) copy observe-application-web/src/main/java/fr/ird/observe/application/web/injector/{ObserveClassInjector.java => ImmutableSetInjector.java} (50%) create mode 100644 observe-services-model/src/main/java/fr/ird/observe/services/dto/gson/ReferentialMultimapAdapter.java create mode 100644 observe-services-model/src/main/java/fr/ird/observe/services/dto/referential/ReferentialMultimap.java -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/7739_syncrho_ref_en_serveur_distant in repository observe. See https://gitlab.nuiton.org/codelutin/observe.git commit c6e9e0123336894574fde84fba14ed8d5d671277 Author: Samuel Maisonneuve <maisonneuve@codelutin.com> Date: Thu Aug 18 16:37:45 2016 +0200 Corrige les problèmes de sérialisation/deserialisation liés à la synchro referentiel en serveur distant Introduit un objet ReferentialMultimap visant a transporter les objets ReferentialDto à travers les processus de sérialisation/deserialisation tout en conservant l'information du type concret refs #7739 --- .../web/ObserveWebApplicationListener.java | 2 + ...eferentialSynchronizeDiffServiceController.java | 5 +- .../web/injector/ImmutableSetInjector.java | 84 +++++++++++++ observe-application-web/src/main/resources/mapping | 2 + .../diff/ReferentialSynchronizeDiff.java | 12 +- .../diff/ReferentialSynchronizeDiffService.java | 5 +- .../diff/ReferentialSynchronizeDiffState.java | 2 +- .../diff/ReferentialSynchronizeDiffsEngine.java | 7 +- .../services/dto/gson/ImmutableSetAdapter.java | 1 - .../services/dto/gson/ObserveDtoGsonSupplier.java | 3 + .../dto/gson/ReferentialMultimapAdapter.java | 83 +++++++++++++ .../dto/referential/ReferentialMultimap.java | 134 +++++++++++++++++++++ .../ReferentialSynchronizeDiffServiceTopia.java | 12 +- .../sql/InsertSqlStatementGenerator.java | 5 +- .../sql/UpdateSqlStatementGenerator.java | 3 +- 15 files changed, 343 insertions(+), 17 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 540f2e7..f4bd444 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 @@ -25,6 +25,7 @@ package fr.ird.observe.application.web; import com.google.gson.Gson; import fr.ird.observe.application.web.converter.ObserveDtoConverter; import fr.ird.observe.application.web.injector.DateInjector; +import fr.ird.observe.application.web.injector.ImmutableSetInjector; import fr.ird.observe.application.web.injector.ObserveClassInjector; import fr.ird.observe.application.web.injector.ObserveDataSourceConfigurationInjector; import fr.ird.observe.application.web.injector.ObserveDtoInjector; @@ -69,6 +70,7 @@ public class ObserveWebApplicationListener implements WebMotionServerListener { context.addInjector(new ObserveReferenceSetRequestInjector(gson)); context.addInjector(new DateInjector(ObserveDataSourceConfigurationRestConstants.DATE_PATTERN)); context.addInjector(new SqlScriptProducerRequestInjector(gson)); + context.addInjector(new ImmutableSetInjector()); context.addConverter(new ObserveDtoConverter(gson), ObserveDbUserDto.class); context.getServletContext().setAttribute( diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/actions/synchro/referential/diff/ReferentialSynchronizeDiffServiceController.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/actions/synchro/referential/diff/ReferentialSynchronizeDiffServiceController.java index e8ff987..c52788e 100644 --- a/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/actions/synchro/referential/diff/ReferentialSynchronizeDiffServiceController.java +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/actions/synchro/referential/diff/ReferentialSynchronizeDiffServiceController.java @@ -3,6 +3,7 @@ package fr.ird.observe.application.web.controller.v1.actions.synchro.referential import com.google.common.collect.ImmutableSet; import fr.ird.observe.application.web.controller.v1.ObserveAuthenticatedServiceControllerSupport; import fr.ird.observe.services.dto.referential.ReferentialDto; +import fr.ird.observe.services.dto.referential.ReferentialMultimap; import fr.ird.observe.services.dto.referential.ReferentialReferenceSet; import fr.ird.observe.services.service.actions.synchro.referential.diff.ReferentialDataSourceStates; import fr.ird.observe.services.service.actions.synchro.referential.diff.ReferentialSynchronizeDiffService; @@ -13,7 +14,7 @@ import fr.ird.observe.services.service.actions.synchro.referential.diff.Referent * @author Tony Chemit - chemit@codelutin.com */ public class ReferentialSynchronizeDiffServiceController extends ObserveAuthenticatedServiceControllerSupport<ReferentialSynchronizeDiffService> implements ReferentialSynchronizeDiffService { - protected ReferentialSynchronizeDiffServiceController() { + public ReferentialSynchronizeDiffServiceController() { super(ReferentialSynchronizeDiffService.class); } @@ -28,7 +29,7 @@ public class ReferentialSynchronizeDiffServiceController extends ObserveAuthenti } @Override - public <R extends ReferentialDto> ImmutableSet<R> getReferentials(Class<R> referentialName, ImmutableSet<String> ids) { + public <R extends ReferentialDto> ReferentialMultimap<R> getReferentials(Class<R> referentialName, ImmutableSet<String> ids) { return service.getReferentials(referentialName, ids); } diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/injector/ImmutableSetInjector.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/injector/ImmutableSetInjector.java new file mode 100644 index 0000000..a5b94e8 --- /dev/null +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/injector/ImmutableSetInjector.java @@ -0,0 +1,84 @@ +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.common.collect.ImmutableSet; +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; + +/** + * Cet injecteur a été mis en place pour permettre la conversion des immutableSet arrivant dans une requete. + * Les immutableSet provoquent une erreur lors du traitement par le framework webmotion qui traite ces objets comme des collections, + * essayant de les instancier avant de pousser des valeurs dedans... les ImmutableSet ne sont pas instanciables. + * + * Nous nous contentons ici de pousser les valeurs de la requête directement dans l'immutableSet + * car celles-ci nous arrivent non sérialisées (cf. fr.ird.observe.services.ObserveServiceFactoryRest.RemoteInvocationHandler.addParameters()) + * + * Cet injecteur ne fonctionnera pas si les données arrivent sérialisées. + * + * @author Samuel Maisonneuve - maisonneuve@codelutin.com + */ +public class ImmutableSetInjector implements ExecutorParametersInjectorHandler.Injector { + + /** Logger. */ + private static final Log log = LogFactory.getLog(ImmutableSetInjector.class); + + @Override + public Object getValue(Mapping mapping, Call call, String name, Class<?> type, Type generic) { + + ImmutableSet result = null; + + if (type.isAssignableFrom(ImmutableSet.class)) { + // Type des objets contenu dans le set + // Type[] actualTypeArguments = ((ParameterizedType) generic).getActualTypeArguments(); + // Type subType = actualTypeArguments[0]; + + ImmutableSet.Builder builder = ImmutableSet.builder(); + + Call.ParameterTree parameterTree = call.getParameterTree().getObject().get(name); + + Preconditions.checkNotNull(parameterTree, "Le paramètre " + name + " n'as pas été trouvé, recompiler (parameter)!"); + + String[] values = (String[]) parameterTree.getValue(); + for (String value: values) { + builder.add(value); + } + + result = builder.build(); + + if (log.isInfoEnabled()) { + log.info("Inject ImmutableSet: " + result); + } + + } + + return result; + + } +} diff --git a/observe-application-web/src/main/resources/mapping b/observe-application-web/src/main/resources/mapping index 755ead5..2eedb26 100644 --- a/observe-application-web/src/main/resources/mapping +++ b/observe-application-web/src/main/resources/mapping @@ -48,6 +48,8 @@ GET /admin/configuration/{method} Configuratio GET,POST,DELETE /api/v1/{service}/{method} {service}Controller.{method} GET,POST,DELETE /api/v1/{package}/{service}/{method} {package}.{service}Controller.{method} GET,POST,DELETE /api/v1/{package1}/{package2}/{service}/{method} {package1}.{package2}.{service}Controller.{method} +GET,POST,DELETE /api/v1/{package1}/{package2}/{package3}/{service}/{method} {package1}.{package2}.{package3}.{service}Controller.{method} +GET,POST,DELETE /api/v1/{package1}/{package2}/{package3}/{package4}/{service}/{method} {package1}.{package2}.{package3}.{package4}.{service}Controller.{method} diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/diff/ReferentialSynchronizeDiff.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/diff/ReferentialSynchronizeDiff.java index b1d3db0..30071fb 100644 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/diff/ReferentialSynchronizeDiff.java +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/diff/ReferentialSynchronizeDiff.java @@ -51,6 +51,14 @@ public class ReferentialSynchronizeDiff { } } + public static <K> Optional<ImmutableSet<K>> optionalOfEmptySet(ImmutableSet<K> set) { + Optional result = Optional.ofNullable(set); + if (set.isEmpty()) { + result = Optional.ofNullable(null); + } + return result; + } + /** * Tous les types de référentiels décrits pour cette source. */ @@ -72,11 +80,11 @@ public class ReferentialSynchronizeDiff { } public <R extends ReferentialDto> Optional<ImmutableSet<ReferentialSynchronizeDiffState>> getAddedReferentials(Class<R> referentialName) { - return Optional.ofNullable(addedReferentials.get(referentialName)); + return optionalOfEmptySet(addedReferentials.get(referentialName)); } public <R extends ReferentialDto> Optional<ImmutableSet<ReferentialSynchronizeDiffState>> getUpdatedReferentials(Class<R> referentialName) { - return Optional.ofNullable(updatedReferentials.get(referentialName)); + return optionalOfEmptySet(updatedReferentials.get(referentialName)); } public ImmutableSetMultimap<Class<? extends ReferentialDto>, String> getExistingIds() { 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 406f5d3..c19fa4a 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 @@ -3,7 +3,9 @@ package fr.ird.observe.services.service.actions.synchro.referential.diff; import com.google.common.collect.ImmutableSet; import fr.ird.observe.services.ObserveService; import fr.ird.observe.services.dto.referential.ReferentialDto; +import fr.ird.observe.services.dto.referential.ReferentialMultimap; import fr.ird.observe.services.dto.referential.ReferentialReferenceSet; +import fr.ird.observe.services.spi.PostRequest; import fr.ird.observe.services.spi.ReadReferentialPermission; /** @@ -19,8 +21,9 @@ public interface ReferentialSynchronizeDiffService extends ObserveService { @ReadReferentialPermission <R extends ReferentialDto> ReferentialReferenceSet<R> getReferentialReferenceSet(Class<R> referentialName, ImmutableSet<String> ids); + @PostRequest @ReadReferentialPermission - <R extends ReferentialDto> ImmutableSet<R> getReferentials(Class<R> referentialName, ImmutableSet<String> ids); + <R extends ReferentialDto> ReferentialMultimap<R> getReferentials(Class<R> referentialName, ImmutableSet<String> ids); /** * Récupération sur la source à synchroniser des versions de ses référentiels. diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/diff/ReferentialSynchronizeDiffState.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/diff/ReferentialSynchronizeDiffState.java index 50bc0f3..1578e9b 100644 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/diff/ReferentialSynchronizeDiffState.java +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/diff/ReferentialSynchronizeDiffState.java @@ -59,7 +59,7 @@ public class ReferentialSynchronizeDiffState implements Comparable<ReferentialSy @Override public int compareTo(ReferentialSynchronizeDiffState o) { - if (Objects.equals(lastUpdateDate, o.lastUpdateDate) && Objects.equals(version, o.getVersion())) { + if (Objects.equals(lastUpdateDate.getTime(), o.lastUpdateDate.getTime()) && Objects.equals(version, o.getVersion())) { return EQUALS; } return lastUpdateDate.before(o.getLastUpdateDate()) || version < o.getVersion() ? BEFORE : AFTER; diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/diff/ReferentialSynchronizeDiffsEngine.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/diff/ReferentialSynchronizeDiffsEngine.java index afcee38..1ae2baa 100644 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/diff/ReferentialSynchronizeDiffsEngine.java +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/diff/ReferentialSynchronizeDiffsEngine.java @@ -3,6 +3,7 @@ package fr.ird.observe.services.service.actions.synchro.referential.diff; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import fr.ird.observe.services.dto.referential.ReferentialDto; +import fr.ird.observe.services.dto.referential.ReferentialMultimap; import fr.ird.observe.services.dto.referential.ReferentialReferenceSet; import java.util.Set; @@ -56,12 +57,14 @@ public class ReferentialSynchronizeDiffsEngine { public <R extends ReferentialDto> ImmutableSet<R> getLeftReferentials(Class<R> referentialName, ImmutableSet<ReferentialSynchronizeDiffState> diffStates) { Set<String> ids = diffStates.stream().map(ReferentialSynchronizeDiffState::getId).collect(Collectors.toSet()); - return leftDiffService.getReferentials(referentialName, ImmutableSet.copyOf(ids)); + ReferentialMultimap<R> referentials = leftDiffService.getReferentials(referentialName, ImmutableSet.copyOf(ids)); + return referentials.get(referentialName); } public <R extends ReferentialDto> ImmutableSet<R> getRightReferentials(Class<R> referentialName, ImmutableSet<ReferentialSynchronizeDiffState> diffStates) { Set<String> ids = diffStates.stream().map(ReferentialSynchronizeDiffState::getId).collect(Collectors.toSet()); - return rightDiffService.getReferentials(referentialName, ImmutableSet.copyOf(ids)); + ReferentialMultimap<R> referentials = rightDiffService.getReferentials(referentialName, ImmutableSet.copyOf(ids)); + return referentials.get(referentialName); } public <R extends ReferentialDto> ReferentialReferenceSet<R> getLeftEnabledReferentialReferenceSet(Class<R> referentialName) { diff --git a/observe-services-model/src/main/java/fr/ird/observe/services/dto/gson/ImmutableSetAdapter.java b/observe-services-model/src/main/java/fr/ird/observe/services/dto/gson/ImmutableSetAdapter.java index 95c3532..d1f7fe5 100644 --- a/observe-services-model/src/main/java/fr/ird/observe/services/dto/gson/ImmutableSetAdapter.java +++ b/observe-services-model/src/main/java/fr/ird/observe/services/dto/gson/ImmutableSetAdapter.java @@ -55,5 +55,4 @@ public class ImmutableSetAdapter implements JsonDeserializer<ImmutableSet<?>> { return new TypeToken<Set<E>>() {} .where(new TypeParameter<E>() {}, subType); } - } 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 6b055db..a152b7e 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 @@ -36,6 +36,7 @@ import fr.ird.observe.services.dto.gson.reference.DataReferenceAdapter; import fr.ird.observe.services.dto.gson.reference.DataReferenceSetAdapter; import fr.ird.observe.services.dto.gson.reference.ReferentialReferenceAdapter; import fr.ird.observe.services.dto.gson.reference.ReferentialReferenceSetAdapter; +import fr.ird.observe.services.dto.referential.ReferentialMultimap; import fr.ird.observe.services.dto.referential.ReferentialReference; import fr.ird.observe.services.dto.referential.ReferentialReferenceSet; import org.nuiton.version.Version; @@ -104,6 +105,8 @@ public class ObserveDtoGsonSupplier implements Supplier<Gson> { gsonBuilder.registerTypeAdapter(Form.class, new FormAdapter()); gsonBuilder.registerTypeAdapter(ReportVariable.class, new ReportVariableAdapter()); gsonBuilder.registerTypeAdapter(Version.class, new VersionAdapter()); + + gsonBuilder.registerTypeAdapter(ReferentialMultimap.class, new ReferentialMultimapAdapter()); gsonBuilder.enableComplexMapKeySerialization(); } return gsonBuilder; 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 new file mode 100644 index 0000000..516a255 --- /dev/null +++ b/observe-services-model/src/main/java/fr/ird/observe/services/dto/gson/ReferentialMultimapAdapter.java @@ -0,0 +1,83 @@ +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.ImmutableSetMultimap; +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.JsonObject; +import com.google.gson.JsonParseException; +import com.google.gson.JsonSerializationContext; +import com.google.gson.JsonSerializer; +import fr.ird.observe.services.dto.referential.ReferentialMultimap; + +import java.lang.reflect.Type; +import java.util.Collection; +import java.util.Map; +import java.util.Set; + +/** + * @author Samuel Maisonneuve - maisonneuve@codelutin.com + */ +public class ReferentialMultimapAdapter implements JsonSerializer<ReferentialMultimap>, JsonDeserializer<ReferentialMultimap> { + + + @Override + public JsonElement serialize(ReferentialMultimap src, Type typeOfSrc, JsonSerializationContext context) { + return context.serialize(src.asMap()); + } + + @Override + public ReferentialMultimap deserialize(JsonElement json, Type type, JsonDeserializationContext context) throws JsonParseException { + + ImmutableSetMultimap.Builder builder = ImmutableSetMultimap.builder(); + + Set<Map.Entry<String, JsonElement>> entries = json.getAsJsonObject().entrySet(); + for (Map.Entry<String, JsonElement> entry : entries) { + String keyEntry = entry.getKey(); + JsonObject keyObject = new JsonObject(); + keyObject.addProperty("key", keyEntry); + + // Deserialize the key + Class key = context.deserialize(keyObject.getAsJsonPrimitive("key"), Class.class); + + // Deserialize the collection associated to the key + Type typeToken = collectionOf(key).getType(); + Collection values = context.deserialize(entry.getValue(), typeToken); + + // Add the key/values to the multimap + builder.putAll(key, values); + } + + return ReferentialMultimap.copyOf(builder.build()); + + } + + static <E> TypeToken<Collection<E>> collectionOf(Class<E> subType) { + return new TypeToken<Collection<E>>() {} + .where(new TypeParameter<E>() {}, subType); + } +} 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 new file mode 100644 index 0000000..2dddef6 --- /dev/null +++ b/observe-services-model/src/main/java/fr/ird/observe/services/dto/referential/ReferentialMultimap.java @@ -0,0 +1,134 @@ +package fr.ird.observe.services.dto.referential; + +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.ImmutableSetMultimap; +import com.google.common.collect.Multimap; +import com.google.common.collect.Multiset; +import com.google.common.collect.SetMultimap; + +import java.util.Collection; +import java.util.Map; + +/** + * @author smaisonneuve + * Created on 17/08/16. + */ +public class ReferentialMultimap<K extends ReferentialDto> implements SetMultimap<Class<K>, K> { + + private ImmutableSetMultimap<Class<K>, K> immutableSetMultimap; + + public static <K extends ReferentialDto, V> ReferentialMultimap<K> of() { + return new ReferentialMultimap(); + } + + public static <K extends ReferentialDto> ReferentialMultimap<K> of(Class<K> k1, K v1) { + return new ReferentialMultimap<K>(k1, v1); + } + + public static <K extends ReferentialDto> ReferentialMultimap<K> copyOf(Multimap<Class<K>, K> multimap) { + return new ReferentialMultimap(multimap); + } + + private ReferentialMultimap() { + immutableSetMultimap = ImmutableSetMultimap.<Class<K>, K>builder().build(); + } + + private ReferentialMultimap(Class<K> k1, K v1) { + immutableSetMultimap = ImmutableSetMultimap.of(k1, v1); + } + + private ReferentialMultimap(Multimap<Class<K>, K> multimap) { + immutableSetMultimap = ImmutableSetMultimap.copyOf(multimap); + } + + @Override + public ImmutableSet<K> get(Class<K> key) { + return immutableSetMultimap.get(key); + } + + @Override + public ImmutableSet<Class<K>> keySet() { + return immutableSetMultimap.keySet(); + } + + @Override + public Multiset<Class<K>> keys() { + return immutableSetMultimap.keys(); + } + + @Override + public Collection<K> values() { + return immutableSetMultimap.values(); + } + + @Override + public ImmutableSet<K> removeAll(Object key) { + return immutableSetMultimap.removeAll(key); + } + + @Override + public void clear() { + immutableSetMultimap.clear(); + } + + @Override + public int size() { + return immutableSetMultimap.size(); + } + + @Override + public boolean isEmpty() { + return immutableSetMultimap.isEmpty(); + } + + @Override + public boolean containsKey(Object key) { + return immutableSetMultimap.containsKey(key); + } + + @Override + public boolean containsValue(Object value) { + return immutableSetMultimap.containsValue(value); + } + + @Override + public boolean containsEntry(Object key, Object value) { + return immutableSetMultimap.containsEntry(key, value); + } + + @Override + public boolean put(Class<K> key, K value) { + return immutableSetMultimap.put(key, value); + } + + @Override + public boolean remove(Object key, Object value) { + return immutableSetMultimap.remove(key, value); + } + + @Override + public boolean putAll(Class<K> key, Iterable<? extends K> values) { + return immutableSetMultimap.putAll(key, values); + } + + @Override + public boolean putAll(Multimap<? extends Class<K>, ? extends K> multimap) { + return immutableSetMultimap.putAll(multimap); + } + + @Override + public ImmutableSet<K> replaceValues(Class<K> key, Iterable<? extends K> values) { + return immutableSetMultimap.replaceValues(key, values); + } + + @Override + public ImmutableSet<Map.Entry<Class<K>, K>> entries() { + return immutableSetMultimap.entries(); + } + + @Override + public ImmutableMap<Class<K>, Collection<K>> asMap() { + return immutableSetMultimap.asMap(); + } +} 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 3e4b2bd..b4f701a 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,6 +1,7 @@ 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; @@ -11,6 +12,7 @@ import fr.ird.observe.services.binder.BinderEngine; import fr.ird.observe.services.binder.referential.ReferentialBinderSupport; import fr.ird.observe.services.dto.constants.ReferentialLocale; import fr.ird.observe.services.dto.referential.ReferentialDto; +import fr.ird.observe.services.dto.referential.ReferentialMultimap; import fr.ird.observe.services.dto.referential.ReferentialReferenceSet; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -57,21 +59,21 @@ public class ReferentialSynchronizeDiffServiceTopia extends ObserveServiceTopia } @Override - public <R extends ReferentialDto> ImmutableSet<R> getReferentials(Class<R> referentialName, ImmutableSet<String> ids) { + public <R extends ReferentialDto> ReferentialMultimap<R> getReferentials(Class<R> referentialName, ImmutableSet<String> ids) { Class<? extends ObserveReferentialEntity> entityType = BinderEngine.get().getReferentialEntityType(referentialName); return getReferentials0(referentialName, entityType, ids); } - private <E extends ObserveReferentialEntity, R extends ReferentialDto> ImmutableSet<R> getReferentials0(Class<R> dtoType, Class<E> entityType, ImmutableSet<String> ids) { - ImmutableSet.Builder<R> result = ImmutableSet.builder(); + 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(); ReferentialLocale referentialLocale = getReferentialLocale(); List<E> entities = loadEntities(entityType, ids); for (E entity : entities) { ReferentialBinderSupport<ObserveReferentialEntity, R> binder = BinderEngine.get().getReferentialBinder(dtoType); - result.add(binder.toDto(referentialLocale, entity)); + result.put(dtoType, binder.toDto(referentialLocale, entity)); } - return result.build(); + return ReferentialMultimap.copyOf(result.build()); } @Override diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/sql/InsertSqlStatementGenerator.java b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/sql/InsertSqlStatementGenerator.java index 429a2f7..a31250e 100644 --- a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/sql/InsertSqlStatementGenerator.java +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/sql/InsertSqlStatementGenerator.java @@ -34,6 +34,7 @@ import org.nuiton.topia.persistence.metadata.TopiaMetadataEntity; import org.nuiton.util.beans.Binder; import org.nuiton.util.beans.BinderFactory; +import java.sql.Timestamp; import java.util.Collection; import java.util.Date; import java.util.LinkedHashSet; @@ -279,7 +280,7 @@ public class InsertSqlStatementGenerator<R extends ReferentialDto> { } private void addDateParameter(Date parameter, List<String> parameters) { - parameters.add("'" + parameter + "'"); + parameters.add("'" + new Timestamp(parameter.getTime()) + "'"); } private void addPrimitiveBooleanParameter(Boolean parameter, List<String> parameters) { @@ -299,7 +300,7 @@ public class InsertSqlStatementGenerator<R extends ReferentialDto> { } private void addTimestampParameter(Date parameter, List<String> parameters) { - parameters.add("'" + parameter + "'::timestamp"); + parameters.add("'" + new Timestamp(parameter.getTime()) + "'::timestamp"); } diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/sql/UpdateSqlStatementGenerator.java b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/sql/UpdateSqlStatementGenerator.java index 1a0556c..4513676 100644 --- a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/sql/UpdateSqlStatementGenerator.java +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/sql/UpdateSqlStatementGenerator.java @@ -32,6 +32,7 @@ import org.nuiton.topia.persistence.metadata.TopiaMetadataEntity; import org.nuiton.util.beans.Binder; import org.nuiton.util.beans.BinderFactory; +import java.sql.Timestamp; import java.util.Collection; import java.util.Date; import java.util.LinkedHashSet; @@ -312,7 +313,7 @@ public class UpdateSqlStatementGenerator<R extends ReferentialDto> { } private void addTimestampParameter(String columnName, Date parameter, StringBuilder parameters) { - addParameter0(columnName, "'" + parameter + "'::timestamp", parameters); + addParameter0(columnName, "'" + new Timestamp(parameter.getTime()) + "'::timestamp", parameters); } private void addEnumParameter(String columnName, Enum parameter, StringBuilder parameters) { -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
participants (1)
-
codelutin.com scm