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 1338aeb185110981e252dedbea5c3c6ff16b5dda 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>.