This is an automated email from the git hooks/post-receive script. New commit to branch feature/refactor_reference in repository observe. See http://git.codelutin.com/observe.git commit 64ba10386d93f9845c93d3d0458b5d4de165c2e2 Author: Tony CHEMIT <chemit@codelutin.com> Date: Sat Nov 14 02:12:31 2015 +0100 introduction nouvelle api de references plus simple et mise en place --- .../web/ObserveWebApplicationListener.java | 2 + .../v1/ReferenceSetServiceController.java | 10 +- .../ObserveReferenceSetRequestInjector.java | 51 +++++ .../services/service/ReferenceSetDefinition.java | 70 ------ .../service/ReferenceSetPropertyDefinition.java | 67 ------ .../service/ReferenceSetRequestDefinition.java | 53 ----- .../service/ReferenceSetRequestDefinitions.java | 39 ---- .../service/ReferenceSetRequestKeyDefinition.java | 86 ------- .../services/service/ReferenceSetService.java | 8 +- .../service/ReferentialReferenceSetResult.java | 55 ----- .../observe/services/dto/gson/ClassAdapter.java | 39 +++- .../services/dto/gson/ObserveDtoGsonSupplier.java | 2 + .../dto/gson/ObserveReferenceSetAdapter.java | 122 ++++++++++ .../services/dto/reference/ObserveReference.java | 61 +++++ .../dto/reference/ObserveReferenceSet.java | 69 ++++++ .../dto/reference/ObserveReferenceSetRequest.java | 20 +- .../dto/reference/ObserveReferenceSetResult.java | 64 ++++++ .../dto/reference/ObserveReferentialReference.java | 79 +++++++ .../definition/ObserveReferenceSetDefinition.java | 76 +++++++ .../definition/ObserveReferenceSetDefinitions.java | 41 ++-- .../ObserveReferenceSetRequestDefinition.java | 53 +++++ .../ObserveReferenceSetRequestDefinitions.java | 50 +++++ .../ObserveReferenceSetRequestKeyDefinition.java | 74 ++++++ .../service/ReferenceSetServiceRestTest.java | 96 ++++++++ .../EntityToReferentialReferenceDtoBuilder.java | 109 --------- .../dto/reference/ObserveReferenceSetBuilder.java | 250 +++++++++++++++++++++ .../services/service/ReferenceSetServiceTopia.java | 124 +++++----- .../service/ReferenceSetServiceTopiaTest.java | 54 +++++ 28 files changed, 1246 insertions(+), 578 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 764a415..a5816f6 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 @@ -27,6 +27,7 @@ import fr.ird.observe.application.web.converter.ObserveDtoConverter; import fr.ird.observe.application.web.injector.ObserveClassInjector; import fr.ird.observe.application.web.injector.ObserveDataSourceConfigurationInjector; import fr.ird.observe.application.web.injector.ObserveDtoInjector; +import fr.ird.observe.application.web.injector.ObserveReferenceSetRequestInjector; import fr.ird.observe.services.dto.ObserveDbUserDto; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -62,6 +63,7 @@ public class ObserveWebApplicationListener implements WebMotionServerListener { context.addInjector(new ObserveDataSourceConfigurationInjector(gson)); context.addInjector(new ObserveClassInjector()); context.addInjector(new ObserveDtoInjector(gson)); + context.addInjector(new ObserveReferenceSetRequestInjector(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/controller/v1/ReferenceSetServiceController.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/ReferenceSetServiceController.java index 7dcc967..ee5c30c 100644 --- a/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/ReferenceSetServiceController.java +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/ReferenceSetServiceController.java @@ -1,8 +1,10 @@ package fr.ird.observe.application.web.controller.v1; -import fr.ird.observe.services.service.ReferenceSetRequest; +import fr.ird.observe.services.dto.reference.ObserveReference; +import fr.ird.observe.services.dto.reference.ObserveReferenceSetRequest; +import fr.ird.observe.services.dto.reference.ObserveReferentialReference; import fr.ird.observe.services.service.ReferenceSetService; -import fr.ird.observe.services.service.ReferentialReferenceSetResult; +import fr.ird.observe.services.dto.reference.ObserveReferenceSetResult; /** * Created on 11/11/15. @@ -16,12 +18,12 @@ public class ReferenceSetServiceController extends ObserveAuthenticatedServiceCo } @Override - public ReferentialReferenceSetResult loadDataReferenceSets(ReferenceSetRequest request) { + public ObserveReferenceSetResult<ObserveReference> loadDataReferenceSets(ObserveReferenceSetRequest request) { return service.loadDataReferenceSets(request); } @Override - public ReferentialReferenceSetResult loadReferentialReferenceSets(ReferenceSetRequest request) { + public ObserveReferenceSetResult<ObserveReferentialReference> loadReferentialReferenceSets(ObserveReferenceSetRequest request) { return service.loadReferentialReferenceSets(request); } diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/injector/ObserveReferenceSetRequestInjector.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/injector/ObserveReferenceSetRequestInjector.java new file mode 100644 index 0000000..61edb8e --- /dev/null +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/injector/ObserveReferenceSetRequestInjector.java @@ -0,0 +1,51 @@ +package fr.ird.observe.application.web.injector; + +import com.google.common.base.Preconditions; +import com.google.gson.Gson; +import fr.ird.observe.services.dto.reference.ObserveReferenceSetRequest; +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; + +/** + * Created on 13/11/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class ObserveReferenceSetRequestInjector implements ExecutorParametersInjectorHandler.Injector { + + /** Logger. */ + private static final Log log = LogFactory.getLog(ObserveDataSourceConfigurationInjector.class); + + protected final Gson gson; + + public ObserveReferenceSetRequestInjector(Gson gson) { + this.gson = gson; + } + + @Override + public Object getValue(Mapping mapping, Call call, String name, Class<?> type, Type generic) { + + ObserveReferenceSetRequest referenceSetRequest = null; + if (type.equals(ObserveReferenceSetRequest.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]; + + referenceSetRequest = gson.fromJson(gsonContent, ObserveReferenceSetRequest.class); + + if (log.isInfoEnabled()) { + log.info("Inject referenceSetRequest: " + referenceSetRequest); + } + + } + + return referenceSetRequest; + + } +} diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/ReferenceSetDefinition.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/ReferenceSetDefinition.java deleted file mode 100644 index edac622..0000000 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/ReferenceSetDefinition.java +++ /dev/null @@ -1,70 +0,0 @@ -package fr.ird.observe.services.service; - -import com.google.common.collect.ImmutableSet; -import fr.ird.observe.services.dto.IdDto; -import fr.ird.observe.services.dto.ReferenceSetDto; - -import java.io.Serializable; - -/** - * Pour définir ce que l'on doit retrouver dans un ensemble de références d'un même type. - * - * Created on 11/11/15. - * - * @author Tony Chemit - chemit@codelutin.com - */ -public class ReferenceSetDefinition<D extends IdDto> implements Serializable{ - - private static final long serialVersionUID = 1L; - - /** - * Le type du dto qui doit être transformé en références. - * {@link ReferenceSetDto#getType()}. - */ - private final Class<D> type; - - private final ImmutableSet<ReferenceSetPropertyDefinition> properties; - - public ReferenceSetDefinition(Class<D> type, ImmutableSet<ReferenceSetPropertyDefinition> properties) { - this.type = type; - this.properties = properties; - } - - public Class<D> getType() { - return type; - } - - public ImmutableSet<ReferenceSetPropertyDefinition> getProperties() { - return properties; - } - - public static <D extends IdDto> Builder<D> builder(Class<D> type) { - return new Builder<>(type); - } - - public static class Builder<D extends IdDto> { - - private final Class<D> type; - - private final ImmutableSet.Builder<ReferenceSetPropertyDefinition> propertiesBuilder; - - public Builder(Class<D> type) { - this.type = type; - this.propertiesBuilder = ImmutableSet.builder(); - } - - public <O> Builder<D> addProperty(Class<O> type, String name) { - return addProperty(ReferenceSetPropertyDefinition.of(type, name)); - } - - public Builder<D> addProperty(ReferenceSetPropertyDefinition propertyDefinition) { - propertiesBuilder.add(propertyDefinition); - return this; - } - - public ReferenceSetDefinition<D> build() { - return new ReferenceSetDefinition<>(type, propertiesBuilder.build()); - } - } - -} diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/ReferenceSetPropertyDefinition.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/ReferenceSetPropertyDefinition.java deleted file mode 100644 index 79035bd..0000000 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/ReferenceSetPropertyDefinition.java +++ /dev/null @@ -1,67 +0,0 @@ -package fr.ird.observe.services.service; - -import com.google.common.base.MoreObjects; - -import java.io.Serializable; -import java.util.Objects; - -/** - * Pour définir une propriété à remonter dans un ensemble de référence. - * - * Created on 11/11/15. - * - * @author Tony Chemit - chemit@codelutin.com - */ -public class ReferenceSetPropertyDefinition<O> implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * Le type de la propriété. - */ - private final Class<O> type; - - /** - * Le nom de la propriété. - */ - private final String name; - - public static <O> ReferenceSetPropertyDefinition<O> of(Class<O> type, String name) { - return new ReferenceSetPropertyDefinition<>(type, name); - } - - public ReferenceSetPropertyDefinition(Class<O> type, String name) { - this.type = type; - this.name = name; - } - - public Class<O> getType() { - return type; - } - - public String getName() { - return name; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof ReferenceSetPropertyDefinition)) return false; - ReferenceSetPropertyDefinition<?> that = (ReferenceSetPropertyDefinition<?>) o; - return Objects.equals(type, that.type) && - Objects.equals(name, that.name); - } - - @Override - public int hashCode() { - return Objects.hash(type, name); - } - - @Override - public String toString() { - return MoreObjects.toStringHelper(this) - .add("type", type) - .add("name", name) - .toString(); - } -} diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/ReferenceSetRequestDefinition.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/ReferenceSetRequestDefinition.java deleted file mode 100644 index 2d49605..0000000 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/ReferenceSetRequestDefinition.java +++ /dev/null @@ -1,53 +0,0 @@ -package fr.ird.observe.services.service; - -import com.google.common.collect.ImmutableSet; -import fr.ird.observe.services.dto.IdDto; - -import java.io.Serializable; - -/** - * Pour définir une demande de récupération d'ensemble de références. - * - * Created on 11/11/15. - * - * @author Tony Chemit - chemit@codelutin.com - */ -public class ReferenceSetRequestDefinition implements Serializable { - - private static final long serialVersionUID = 1L; - - private final ImmutableSet<ReferenceSetRequestKeyDefinition> keys; - - public ReferenceSetRequestDefinition(ImmutableSet<ReferenceSetRequestKeyDefinition> keys) { - this.keys = keys; - } - - public ImmutableSet<ReferenceSetRequestKeyDefinition> getKeys() { - return keys; - } - - public static <D extends IdDto> Builder<D> builder(Class<D> type) { - return new Builder<>(type); - } - - public static class Builder<D extends IdDto> { - - private final Class<D> parentType; - - private final ImmutableSet.Builder<ReferenceSetRequestKeyDefinition> keysBuilder; - - public Builder(Class<D> parentType) { - this.parentType = parentType; - this.keysBuilder = ImmutableSet.builder(); - } - - public Builder<D> addKey(String name, ReferenceSetDefinitions propertyDefinition) { - keysBuilder.add(new ReferenceSetRequestKeyDefinition<>(parentType, propertyDefinition.getDefinition(), name)); - return this; - } - - public ReferenceSetRequestDefinition build() { - return new ReferenceSetRequestDefinition(keysBuilder.build()); - } - } -} diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/ReferenceSetRequestDefinitions.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/ReferenceSetRequestDefinitions.java deleted file mode 100644 index eef1c48..0000000 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/ReferenceSetRequestDefinitions.java +++ /dev/null @@ -1,39 +0,0 @@ -package fr.ird.observe.services.service; - -import fr.ird.observe.services.dto.IdDto; -import fr.ird.observe.services.dto.seine.TripSeineDto; - -/** - * Contient les définitions de tous les requêtes que les services proposent. - * - * Created on 11/11/15. - * - * @author Tony Chemit - chemit@codelutin.com - */ -public enum ReferenceSetRequestDefinitions { - - TRIP_SEINE_FORM(newBuilder(TripSeineDto.class) - .addKey(TripSeineDto.PROPERTY_OBSERVER, ReferenceSetDefinitions.PERSON) - .addKey(TripSeineDto.PROPERTY_CAPTAIN, ReferenceSetDefinitions.PERSON) - .addKey(TripSeineDto.PROPERTY_DATA_ENTRY_OPERATOR, ReferenceSetDefinitions.PERSON) - .addKey(TripSeineDto.PROPERTY_VESSEL, ReferenceSetDefinitions.VESSEL) - .addKey(TripSeineDto.PROPERTY_OCEAN, ReferenceSetDefinitions.OCEAN) - .addKey(TripSeineDto.PROPERTY_DEPARTURE_HARBOUR, ReferenceSetDefinitions.HARBOUR) - .addKey(TripSeineDto.PROPERTY_LANDING_HARBOUR, ReferenceSetDefinitions.HARBOUR) - .addKey(TripSeineDto.PROPERTY_PROGRAM, ReferenceSetDefinitions.PROGRAM)),; - - public final ReferenceSetRequestDefinition definition; - - ReferenceSetRequestDefinitions(ReferenceSetRequestDefinition.Builder definitionBuilder) { - this.definition = definitionBuilder.build(); - } - - public ReferenceSetRequestDefinition getDefinition() { - return definition; - } - - public static <D extends IdDto> ReferenceSetRequestDefinition.Builder<D> newBuilder(Class<D> parentType) { - return new ReferenceSetRequestDefinition.Builder<>(parentType); - } - -} diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/ReferenceSetRequestKeyDefinition.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/ReferenceSetRequestKeyDefinition.java deleted file mode 100644 index 8d72a4f..0000000 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/ReferenceSetRequestKeyDefinition.java +++ /dev/null @@ -1,86 +0,0 @@ -package fr.ird.observe.services.service; - -import com.google.common.base.Function; -import com.google.common.collect.Iterables; -import fr.ird.observe.services.dto.IdDto; -import fr.ird.observe.services.dto.referential.ReferentialDto; - -import java.util.Objects; - -/** - * Created on 10/11/15. - * - * @author Tony Chemit - chemit@codelutin.com - */ -public class ReferenceSetRequestKeyDefinition<D extends IdDto> { - - private final Class<? extends IdDto> parentType; - - private final ReferenceSetDefinition<D> referenceSetDefinition; - - private final String name; - - private final String[] propertyNames; - - private final Class<?>[] propertyTypes; - - public ReferenceSetRequestKeyDefinition(Class<? extends IdDto> parentType, ReferenceSetDefinition<D> referenceSetDefinition, String name) { - this.parentType = parentType; - this.referenceSetDefinition = referenceSetDefinition; - this.name = name; - this.propertyNames = Iterables.toArray(Iterables.transform(referenceSetDefinition.getProperties(), new Function<ReferenceSetPropertyDefinition, String>() { - - @Override - public String apply(ReferenceSetPropertyDefinition input) { - return input.getName(); - } - }), String.class); - this.propertyTypes = Iterables.toArray(Iterables.transform(referenceSetDefinition.getProperties(), new Function<ReferenceSetPropertyDefinition, Class<?>>() { - - @Override - public Class<?> apply(ReferenceSetPropertyDefinition input) { - return input.getType(); - } - }), Class.class); - } - - public Class<? extends IdDto> getParentType() { - return parentType; - } - - public Class<D> getType() { - return referenceSetDefinition.getType(); - } - - public String[] getPropertyNames() { - return propertyNames; - } - - public Class<?>[] getPropertyTypes() { - return propertyTypes; - } - - public String getName() { - return name; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof ReferenceSetRequestKeyDefinition)) return false; - ReferenceSetRequestKeyDefinition that = (ReferenceSetRequestKeyDefinition) o; - return Objects.equals(parentType, that.parentType) && - Objects.equals(referenceSetDefinition.getType(), that.referenceSetDefinition.getType()) && - Objects.equals(name, that.name); - } - - @Override - public int hashCode() { - return Objects.hash(parentType, referenceSetDefinition.getType(), name); - } - - public boolean isReferential() { - Class<?> type = referenceSetDefinition.getType(); - return type.isAssignableFrom(ReferentialDto.class); - } -} diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/ReferenceSetService.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/ReferenceSetService.java index 36f7d0e..2ce25b3 100644 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/ReferenceSetService.java +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/ReferenceSetService.java @@ -2,6 +2,10 @@ package fr.ird.observe.services.service; import fr.ird.observe.services.ObserveService; import fr.ird.observe.services.dto.ReferenceSetDto; +import fr.ird.observe.services.dto.reference.ObserveReference; +import fr.ird.observe.services.dto.reference.ObserveReferenceSetRequest; +import fr.ird.observe.services.dto.reference.ObserveReferentialReference; +import fr.ird.observe.services.dto.reference.ObserveReferenceSetResult; import fr.ird.observe.services.spi.ReadDataPermission; import fr.ird.observe.services.spi.ReadReferentialPermission; @@ -15,10 +19,10 @@ import fr.ird.observe.services.spi.ReadReferentialPermission; public interface ReferenceSetService extends ObserveService { @ReadDataPermission - ReferentialReferenceSetResult loadDataReferenceSets(ReferenceSetRequest request); + ObserveReferenceSetResult<ObserveReference> loadDataReferenceSets(ObserveReferenceSetRequest request); @ReadReferentialPermission - ReferentialReferenceSetResult loadReferentialReferenceSets(ReferenceSetRequest request); + ObserveReferenceSetResult<ObserveReferentialReference> loadReferentialReferenceSets(ObserveReferenceSetRequest request); } diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/ReferentialReferenceSetResult.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/ReferentialReferenceSetResult.java deleted file mode 100644 index 1de8e9e..0000000 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/ReferentialReferenceSetResult.java +++ /dev/null @@ -1,55 +0,0 @@ -package fr.ird.observe.services.service; - -import com.google.common.collect.ImmutableMap; -import fr.ird.observe.services.dto.ReferenceSetDto; - -/** - * Created on 10/11/15. - * - * @author Tony Chemit - chemit@codelutin.com - */ -public class ReferentialReferenceSetResult { - - private final ReferenceSetRequest request; - - private final ImmutableMap<String, ReferenceSetDto> referenceSetsMap; - - public ReferentialReferenceSetResult(ReferenceSetRequest request, ImmutableMap<String, ReferenceSetDto> referenceSetsMap) { - this.request = request; - this.referenceSetsMap = referenceSetsMap; - } - - public ReferenceSetRequest getRequest() { - return request; - } - - public ImmutableMap<String, ReferenceSetDto> getReferenceSetsMap() { - return referenceSetsMap; - } - - public static Builder builder(final ReferenceSetRequest request) { - return new Builder(request); - } - - public static class Builder { - - private final ReferenceSetRequest request; - - private final ImmutableMap.Builder<String, ReferenceSetDto> referenceSetsMapBuilder; - - public Builder(ReferenceSetRequest request) { - this.request = request; - this.referenceSetsMapBuilder = ImmutableMap.builder(); - } - - public Builder addKey(String name, ReferenceSetDto referenceSet) { - referenceSetsMapBuilder.put(name, referenceSet); - return this; - } - - public ReferentialReferenceSetResult build() { - return new ReferentialReferenceSetResult(request, referenceSetsMapBuilder.build()); - } - } - -} diff --git a/observe-services-model/src/main/java/fr/ird/observe/services/dto/gson/ClassAdapter.java b/observe-services-model/src/main/java/fr/ird/observe/services/dto/gson/ClassAdapter.java index bb235b9..22f2874 100644 --- a/observe-services-model/src/main/java/fr/ird/observe/services/dto/gson/ClassAdapter.java +++ b/observe-services-model/src/main/java/fr/ird/observe/services/dto/gson/ClassAdapter.java @@ -28,18 +28,29 @@ import com.google.gson.JsonElement; import com.google.gson.JsonParseException; import com.google.gson.JsonSerializationContext; import com.google.gson.JsonSerializer; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; import java.lang.reflect.Type; +import java.util.Map; +import java.util.TreeMap; /** * @author Arnaud Thimel - thimel@codelutin.com */ public class ClassAdapter implements JsonSerializer<Class<?>>, JsonDeserializer<Class<?>> { - private static final Log log = LogFactory.getLog(ClassAdapter.class); - + private static final Map<String, Class<?>> CLASS_CACHE = new TreeMap<>(); + + static { + CLASS_CACHE.put("boolean", boolean.class); + CLASS_CACHE.put("byte", byte.class); + CLASS_CACHE.put("char", char.class); + CLASS_CACHE.put("short", short.class); + CLASS_CACHE.put("int", int.class); + CLASS_CACHE.put("long", long.class); + CLASS_CACHE.put("float", float.class); + CLASS_CACHE.put("double", double.class); + } + @Override public JsonElement serialize(Class<?> src, Type typeOfSrc, JsonSerializationContext context) { return context.serialize(src.getCanonicalName(), String.class); @@ -50,15 +61,25 @@ public class ClassAdapter implements JsonSerializer<Class<?>>, JsonDeserializer< public Class<?> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { String className = json.getAsString(); + Class<?> result = CLASS_CACHE.get(className); + if (result == null) { + result = loadClass(className); + CLASS_CACHE.put(className, result); + } + + return result; + + } + + protected Class<?> loadClass(String className) { + try { Class<?> result = Class.forName(className); return result; - } catch (ClassNotFoundException cnfe) { - if (log.isErrorEnabled()) { - log.error("An exception occurred", cnfe); - } - throw new JsonParseException("Class not found: " + className, cnfe); + } catch (ClassNotFoundException e) { + throw new JsonParseException("Class not found: " + className, e); } } + } 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 9ba5b93..7552723 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 @@ -31,6 +31,7 @@ import com.google.gson.GsonBuilder; import fr.ird.observe.services.dto.FormDto; import fr.ird.observe.services.dto.ReferenceDto; import fr.ird.observe.services.dto.actions.report.ReportVariable; +import fr.ird.observe.services.dto.reference.ObserveReferenceSet; import fr.ird.observe.services.dto.referential.ReferentialReferenceDto; import org.nuiton.util.version.Version; @@ -94,6 +95,7 @@ public class ObserveDtoGsonSupplier implements Supplier<Gson> { gsonBuilder.registerTypeAdapter(ImmutableSet.class, new ImmutableSetAdapter()); gsonBuilder.registerTypeAdapter(ImmutableMap.class, new ImmutableMapAdapter()); gsonBuilder.registerTypeAdapter(ReferenceDto.class, new ReferenceDtoAdapter()); + gsonBuilder.registerTypeAdapter(ObserveReferenceSet.class, new ObserveReferenceSetAdapter()); gsonBuilder.registerTypeAdapter(ReferentialReferenceDto.class, new ReferentialReferenceDtoAdapter()); gsonBuilder.registerTypeAdapter(FormDto.class, new FormDtoAdapter()); gsonBuilder.registerTypeAdapter(ReportVariable.class, new ReportVariableAdapter()); diff --git a/observe-services-model/src/main/java/fr/ird/observe/services/dto/gson/ObserveReferenceSetAdapter.java b/observe-services-model/src/main/java/fr/ird/observe/services/dto/gson/ObserveReferenceSetAdapter.java new file mode 100644 index 0000000..300ae53 --- /dev/null +++ b/observe-services-model/src/main/java/fr/ird/observe/services/dto/gson/ObserveReferenceSetAdapter.java @@ -0,0 +1,122 @@ +package fr.ird.observe.services.dto.gson; + +import com.google.gson.JsonArray; +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 fr.ird.observe.services.dto.IdDto; +import fr.ird.observe.services.dto.reference.ObserveReference; +import fr.ird.observe.services.dto.reference.ObserveReferenceSet; +import fr.ird.observe.services.dto.reference.definition.ObserveReferenceSetDefinition; +import fr.ird.observe.services.dto.reference.ObserveReferentialReference; +import fr.ird.observe.services.dto.referential.ReferentialDto; + +import java.io.Serializable; +import java.lang.reflect.Type; +import java.util.Collection; +import java.util.Date; +import java.util.LinkedHashSet; + +/** + * Created on 13/11/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class ObserveReferenceSetAdapter implements JsonDeserializer<ObserveReferenceSet> { + + @Override + public ObserveReferenceSet deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { + + JsonObject jsonObject = json.getAsJsonObject(); + + ObserveReferenceSetDefinition definition = context.deserialize(jsonObject.get("definition"), ObserveReferenceSetDefinition.class); + + Class type = definition.getType(); + + Date lastUpdate = context.deserialize(jsonObject.get("lastUpdate"), Date.class); + + JsonArray jsonValues = jsonObject.get("values").getAsJsonArray(); + + Class[] propertyTypes = definition.getPropertyTypes(); + + ObserveReferenceSet referenceDto = new ObserveReferenceSet(); + referenceDto.setDefinition(definition); + referenceDto.setLastUpdate(lastUpdate); + + if (ReferentialDto.class.isAssignableFrom(type)) { + + Collection<ObserveReferentialReference> values = new LinkedHashSet<>(); + + for (JsonElement jsonValue : jsonValues) { + + ObserveReferentialReference ref = deserializeReferentialReference(context, jsonValue.getAsJsonObject(), propertyTypes); + values.add(ref); + } + + referenceDto.setValues(values); + + } else { + + Collection<ObserveReference> values = new LinkedHashSet<>(); + + for (JsonElement jsonValue : jsonValues) { + + ObserveReference ref = deserializeReference(context, jsonValue.getAsJsonObject(), propertyTypes); + values.add(ref); + } + + referenceDto.setValues(values); + } + + + return referenceDto; + + } + + private ObserveReferentialReference deserializeReferentialReference(JsonDeserializationContext context, JsonObject jsonObject, Class[] propertyTypes) { + + ObserveReferentialReference result = new ObserveReferentialReference(); + + deserialize0(context, jsonObject, propertyTypes, result); + + result.setVersion((long) context.deserialize(jsonObject.get(ReferentialDto.PROPERTY_VERSION), long.class)); + result.setCreateDate((Date) context.deserialize(jsonObject.get(ReferentialDto.PROPERTY_CREATE_DATE), Date.class)); + result.setLastUpdate((Date) context.deserialize(jsonObject.get(ReferentialDto.PROPERTY_LAST_UPDATE), Date.class)); + result.setEnabled((Boolean) context.deserialize(jsonObject.get(ReferentialDto.PROPERTY_ENABLED), boolean.class)); + result.setNeedComment((Boolean) context.deserialize(jsonObject.get(ReferentialDto.PROPERTY_NEED_COMMENT), boolean.class)); + + return result; + } + + private ObserveReference deserializeReference(JsonDeserializationContext context, JsonObject jsonObject, Class[] propertyTypes) { + + ObserveReference result = new ObserveReference(); + + deserialize0(context, jsonObject, propertyTypes, result); + + return result; + } + + private void deserialize0(JsonDeserializationContext context, JsonObject jsonObject, Class[] propertyTypes, ObserveReference result) { + + JsonArray valuesElement = jsonObject.get("values").getAsJsonArray(); + + result.setId((String) context.deserialize(jsonObject.get(IdDto.PROPERTY_ID), String.class)); + + Serializable[] values = new Serializable[propertyTypes.length]; + result.setValues(values); + + for (int i = 0, max = propertyTypes.length; i < max; i++) { + Class type = propertyTypes[i]; + JsonElement jsonValue = valuesElement.get(i); + if (jsonValue != null) { + Serializable value = context.deserialize(jsonValue, type); + values[i] = value; + } + } + + } + +} diff --git a/observe-services-model/src/main/java/fr/ird/observe/services/dto/reference/ObserveReference.java b/observe-services-model/src/main/java/fr/ird/observe/services/dto/reference/ObserveReference.java new file mode 100644 index 0000000..95038a1 --- /dev/null +++ b/observe-services-model/src/main/java/fr/ird/observe/services/dto/reference/ObserveReference.java @@ -0,0 +1,61 @@ +package fr.ird.observe.services.dto.reference; + +import com.google.common.base.MoreObjects; + +import java.io.Serializable; +import java.util.Arrays; +import java.util.Objects; + +/** + * Created on 13/11/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class ObserveReference implements Serializable { + + public static final String PROPERTY_ID = "id"; + + private static final long serialVersionUID = 1L; + + protected String id; + + protected Serializable[] values; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public Serializable[] getValues() { + return values; + } + + public void setValues(Serializable... values) { + this.values = values; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof ObserveReference)) return false; + ObserveReference that = (ObserveReference) o; + return !(id == null || that.id == null) && Objects.equals(id, that.id); + } + + @Override + public int hashCode() { + return Objects.hash(id); + } + + @Override + public String toString() { + return MoreObjects.toStringHelper(this) + .add("id", id) + .add("values", Arrays.asList(values)) + .toString(); + } + +} diff --git a/observe-services-model/src/main/java/fr/ird/observe/services/dto/reference/ObserveReferenceSet.java b/observe-services-model/src/main/java/fr/ird/observe/services/dto/reference/ObserveReferenceSet.java new file mode 100644 index 0000000..4d64af1 --- /dev/null +++ b/observe-services-model/src/main/java/fr/ird/observe/services/dto/reference/ObserveReferenceSet.java @@ -0,0 +1,69 @@ +package fr.ird.observe.services.dto.reference; + +import com.google.common.base.MoreObjects; +import fr.ird.observe.services.dto.IdDto; +import fr.ird.observe.services.dto.reference.definition.ObserveReferenceSetDefinition; + +import java.io.Serializable; +import java.util.Collection; +import java.util.Date; + +/** + * Created on 13/11/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class ObserveReferenceSet<D extends IdDto, R extends ObserveReference> implements Serializable { + + private static final long serialVersionUID = 1L; + + protected ObserveReferenceSetDefinition<D> definition; + + protected Collection<R> values; + + protected Date lastUpdate; + + public static <D extends IdDto, R extends ObserveReference> ObserveReferenceSet<D, R> of(ObserveReferenceSetDefinition<D> definition, + Collection<R> labels, + Date lastUpdate) { + ObserveReferenceSet<D, R> dto = new ObserveReferenceSet<>(); + + dto.setDefinition(definition); + dto.setValues(labels); + dto.setLastUpdate(lastUpdate); + return dto; + } + + public ObserveReferenceSetDefinition<D> getDefinition() { + return definition; + } + + public void setDefinition(ObserveReferenceSetDefinition<D> definition) { + this.definition = definition; + } + + public Collection<R> getValues() { + return values; + } + + public void setValues(Collection<R> values) { + this.values = values; + } + + public Date getLastUpdate() { + return lastUpdate; + } + + public void setLastUpdate(Date lastUpdate) { + this.lastUpdate = lastUpdate; + } + + @Override + public String toString() { + return MoreObjects.toStringHelper(this) + .add("definition", definition) + .add("values", values == null ? 0 : values.size()) + .add("lastUpdate", lastUpdate) + .toString(); + } +} diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/ReferenceSetRequest.java b/observe-services-model/src/main/java/fr/ird/observe/services/dto/reference/ObserveReferenceSetRequest.java similarity index 57% rename from observe-services-api/src/main/java/fr/ird/observe/services/service/ReferenceSetRequest.java rename to observe-services-model/src/main/java/fr/ird/observe/services/dto/reference/ObserveReferenceSetRequest.java index 4801de4..25ea7b6 100644 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/ReferenceSetRequest.java +++ b/observe-services-model/src/main/java/fr/ird/observe/services/dto/reference/ObserveReferenceSetRequest.java @@ -1,4 +1,4 @@ -package fr.ird.observe.services.service; +package fr.ird.observe.services.dto.reference; import com.google.common.collect.ImmutableMap; @@ -9,16 +9,11 @@ import java.util.Date; * * @author Tony Chemit - chemit@codelutin.com */ -public class ReferenceSetRequest { +public class ObserveReferenceSetRequest { - private final String requestName; + private String requestName; - private final ImmutableMap<String, Date> lastUpdateDates; - - public ReferenceSetRequest(String requestName, ImmutableMap<String, Date> lastUpdateDates) { - this.requestName = requestName; - this.lastUpdateDates = lastUpdateDates; - } + private ImmutableMap<String, Date> lastUpdateDates; public String getRequestName() { return requestName; @@ -28,4 +23,11 @@ public class ReferenceSetRequest { return lastUpdateDates; } + public void setRequestName(String requestName) { + this.requestName = requestName; + } + + public void setLastUpdateDates(ImmutableMap<String, Date> lastUpdateDates) { + this.lastUpdateDates = lastUpdateDates; + } } diff --git a/observe-services-model/src/main/java/fr/ird/observe/services/dto/reference/ObserveReferenceSetResult.java b/observe-services-model/src/main/java/fr/ird/observe/services/dto/reference/ObserveReferenceSetResult.java new file mode 100644 index 0000000..1c1614f --- /dev/null +++ b/observe-services-model/src/main/java/fr/ird/observe/services/dto/reference/ObserveReferenceSetResult.java @@ -0,0 +1,64 @@ +package fr.ird.observe.services.dto.reference; + +import com.google.common.collect.ImmutableMap; + +import java.util.Date; +import java.util.Map; + +/** + * Created on 10/11/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class ObserveReferenceSetResult<R extends ObserveReference> { + + private final String requestName; + + private final ImmutableMap<String, ObserveReferenceSet<?, R>> referenceSets; + + public static <R extends ObserveReference> Builder<R> builder(String requestName) { + return new Builder<>(requestName); + } + + public ObserveReferenceSetResult(String requestName, ImmutableMap<String, ObserveReferenceSet<?, R>> referenceSets) { + this.requestName = requestName; + this.referenceSets = referenceSets; + } + + public String getRequestName() { + return requestName; + } + + public ImmutableMap<String, ObserveReferenceSet<?, R>> getReferenceSets() { + return referenceSets; + } + + public ImmutableMap<String,Date> getLastUpdateDates() { + ImmutableMap.Builder<String,Date> builder = ImmutableMap.builder(); + for (Map.Entry<String, ObserveReferenceSet<?, R>> entry : referenceSets.entrySet()) { + builder.put(entry.getKey(), entry.getValue().getLastUpdate()); + } + return builder.build(); + } + public static class Builder<R extends ObserveReference> { + + private final String requestName; + + private final ImmutableMap.Builder<String, ObserveReferenceSet<?, R>> referenceSetsMapBuilder; + + public Builder(String requestName) { + this.requestName = requestName; + this.referenceSetsMapBuilder = ImmutableMap.builder(); + } + + public Builder addKey(String name, ObserveReferenceSet<?, R> referenceSet) { + referenceSetsMapBuilder.put(name, referenceSet); + return this; + } + + public ObserveReferenceSetResult<R> build() { + return new ObserveReferenceSetResult<>(requestName, referenceSetsMapBuilder.build()); + } + } + +} diff --git a/observe-services-model/src/main/java/fr/ird/observe/services/dto/reference/ObserveReferentialReference.java b/observe-services-model/src/main/java/fr/ird/observe/services/dto/reference/ObserveReferentialReference.java new file mode 100644 index 0000000..f82dd81 --- /dev/null +++ b/observe-services-model/src/main/java/fr/ird/observe/services/dto/reference/ObserveReferentialReference.java @@ -0,0 +1,79 @@ +package fr.ird.observe.services.dto.reference; + +import com.google.common.base.MoreObjects; + +import java.util.Arrays; +import java.util.Date; + +/** + * Created on 13/11/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class ObserveReferentialReference extends ObserveReference { + + private static final long serialVersionUID = 1L; + + protected boolean needComment; + + protected boolean enabled; + + protected Date createDate; + + protected Date lastUpdate; + + protected long version; + + public boolean isNeedComment() { + return needComment; + } + + public void setNeedComment(boolean needComment) { + this.needComment = needComment; + } + + public boolean isEnabled() { + return enabled; + } + + public void setEnabled(boolean enabled) { + this.enabled = enabled; + } + + public Date getLastUpdate() { + return lastUpdate; + } + + public void setLastUpdate(Date lastUpdate) { + this.lastUpdate = lastUpdate; + } + + public Date getCreateDate() { + return createDate; + } + + public void setCreateDate(Date createDate) { + this.createDate = createDate; + } + + public long getVersion() { + return version; + } + + public void setVersion(long version) { + this.version = version; + } + + @Override + public String toString() { + return MoreObjects.toStringHelper(this) + .add("id", id) + .add("needComment", needComment) + .add("enabled", enabled) + .add("version", version) + .add("createDate", createDate) + .add("lastUpdate", lastUpdate) + .add("values", Arrays.asList(values)) + .toString(); + } +} diff --git a/observe-services-model/src/main/java/fr/ird/observe/services/dto/reference/definition/ObserveReferenceSetDefinition.java b/observe-services-model/src/main/java/fr/ird/observe/services/dto/reference/definition/ObserveReferenceSetDefinition.java new file mode 100644 index 0000000..3a5f327 --- /dev/null +++ b/observe-services-model/src/main/java/fr/ird/observe/services/dto/reference/definition/ObserveReferenceSetDefinition.java @@ -0,0 +1,76 @@ +package fr.ird.observe.services.dto.reference.definition; + +import fr.ird.observe.services.dto.IdDto; + +import java.io.Serializable; +import java.util.LinkedList; + +/** + * Pour définir ce que l'on doit retrouver dans un ensemble de références d'un même type. + * + * Created on 11/11/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class ObserveReferenceSetDefinition<D extends IdDto> implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * Le type du dto qui doit être transformé en références. + * {@link ObserveReferenceSetDefinition#getType()}. + */ + private final Class<D> type; + + private final String[] propertyNames; + + private final Class<?>[] propertyTypes; + + public static <D extends IdDto> Builder<D> builder(Class<D> type) { + return new Builder<>(type); + } + + protected ObserveReferenceSetDefinition(Class<D> type, Class<?>[] propertyTypes, String... propertyNames) { + this.type = type; + this.propertyTypes = propertyTypes; + this.propertyNames = propertyNames; + } + + public Class<D> getType() { + return type; + } + + public Class<?>[] getPropertyTypes() { + return propertyTypes; + } + + public String[] getPropertyNames() { + return propertyNames; + } + + public static class Builder<D extends IdDto> { + + private final Class<D> type; + + private final LinkedList<Class<?>> propertyTypes; + + private final LinkedList<String> propertyNames; + + public Builder(Class<D> type) { + this.type = type; + this.propertyTypes = new LinkedList<>(); + this.propertyNames = new LinkedList<>(); + } + + public <O> Builder<D> addProperty(Class<O> type, String name) { + propertyTypes.add(type); + propertyNames.add(name); + return this; + } + + public ObserveReferenceSetDefinition<D> build() { + return new ObserveReferenceSetDefinition<>(type, propertyTypes.toArray(new Class[propertyTypes.size()]), propertyNames.toArray(new String[propertyNames.size()])); + } + } + +} diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/ReferenceSetDefinitions.java b/observe-services-model/src/main/java/fr/ird/observe/services/dto/reference/definition/ObserveReferenceSetDefinitions.java similarity index 90% rename from observe-services-api/src/main/java/fr/ird/observe/services/service/ReferenceSetDefinitions.java rename to observe-services-model/src/main/java/fr/ird/observe/services/dto/reference/definition/ObserveReferenceSetDefinitions.java index be4abc9..6e1f93b 100644 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/ReferenceSetDefinitions.java +++ b/observe-services-model/src/main/java/fr/ird/observe/services/dto/reference/definition/ObserveReferenceSetDefinitions.java @@ -1,4 +1,4 @@ -package fr.ird.observe.services.service; +package fr.ird.observe.services.dto.reference.definition; import fr.ird.observe.services.dto.constants.GearType; import fr.ird.observe.services.dto.referential.CountryDto; @@ -64,13 +64,13 @@ import fr.ird.observe.services.dto.referential.seine.WeightCategoryDto; import fr.ird.observe.services.dto.referential.seine.WindDto; /** - * Contient les définitions de tous les ensembles de référence utilisables dans les services. + * Contient les définitions de tous les ensembles de référence reconnus dans l'application. * * Created on 11/11/15. * * @author Tony Chemit - chemit@codelutin.com */ -public enum ReferenceSetDefinitions { +public enum ObserveReferenceSetDefinitions { COUNTRY(newDefaultDefinitionBuilder(CountryDto.class)), @@ -102,9 +102,9 @@ public enum ReferenceSetDefinitions { PERSON(newDefinitionBuilder(PersonDto.class) .addProperty(String.class, PersonDto.PROPERTY_FIRST_NAME) .addProperty(String.class, PersonDto.PROPERTY_LAST_NAME) - .addProperty(String.class, PersonDto.PROPERTY_CAPTAIN) - .addProperty(String.class, PersonDto.PROPERTY_DATA_ENTRY_OPERATOR) - .addProperty(String.class, PersonDto.PROPERTY_OBSERVER)), + .addProperty(boolean.class, PersonDto.PROPERTY_CAPTAIN) + .addProperty(boolean.class, PersonDto.PROPERTY_DATA_ENTRY_OPERATOR) + .addProperty(boolean.class, PersonDto.PROPERTY_OBSERVER)), PROGRAM(newDefinitionBuilder(ProgramDto.class) .addProperty(GearType.class, ProgramDto.PROPERTY_GEAR_TYPE) @@ -225,23 +225,18 @@ public enum ReferenceSetDefinitions { .addProperty(String.class, WindDto.PROPERTY_SPEED_RANGE) ); - private final ReferenceSetDefinition definition; + private final ObserveReferenceSetDefinition definition; - ReferenceSetDefinitions(ReferenceSetDefinition.Builder definition) { - this.definition = definition.build(); - } - - public ReferenceSetDefinition<?> getDefinition() { - return definition; - } - - protected static <R extends ReferentialDto> ReferenceSetDefinition.Builder newDefinitionBuilder(Class<R> type) { - ReferenceSetDefinition.Builder<R> builder = ReferenceSetDefinition.builder(type); + protected static <R extends ReferentialDto> ObserveReferenceSetDefinition.Builder newDefinitionBuilder(Class<R> type) { + ObserveReferenceSetDefinition.Builder<R> builder = ObserveReferenceSetDefinition.builder(type); + if (I18nReferentialDto.class.isAssignableFrom(type)) { + builder.addProperty(String.class, I18nReferentialDto.PROPERTY_LABEL); + } return builder; } - protected static <R extends ReferentialDto> ReferenceSetDefinition.Builder newDefaultDefinitionBuilder(Class<R> type) { - ReferenceSetDefinition.Builder<R> builder = ReferenceSetDefinition + protected static <R extends ReferentialDto> ObserveReferenceSetDefinition.Builder newDefaultDefinitionBuilder(Class<R> type) { + ObserveReferenceSetDefinition.Builder<R> builder = ObserveReferenceSetDefinition .builder(type) .addProperty(String.class, ReferentialDto.PROPERTY_CODE); if (I18nReferentialDto.class.isAssignableFrom(type)) { @@ -250,4 +245,12 @@ public enum ReferenceSetDefinitions { return builder; } + ObserveReferenceSetDefinitions(ObserveReferenceSetDefinition.Builder definition) { + this.definition = definition.build(); + } + + public ObserveReferenceSetDefinition<?> getDefinition() { + return definition; + } + } diff --git a/observe-services-model/src/main/java/fr/ird/observe/services/dto/reference/definition/ObserveReferenceSetRequestDefinition.java b/observe-services-model/src/main/java/fr/ird/observe/services/dto/reference/definition/ObserveReferenceSetRequestDefinition.java new file mode 100644 index 0000000..d3aa77c --- /dev/null +++ b/observe-services-model/src/main/java/fr/ird/observe/services/dto/reference/definition/ObserveReferenceSetRequestDefinition.java @@ -0,0 +1,53 @@ +package fr.ird.observe.services.dto.reference.definition; + +import com.google.common.collect.ImmutableSet; +import fr.ird.observe.services.dto.IdDto; + +import java.io.Serializable; + +/** + * Pour définir une demande de récupération d'ensemble de références. + * + * Created on 11/11/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class ObserveReferenceSetRequestDefinition implements Serializable { + + private static final long serialVersionUID = 1L; + + private final ImmutableSet<ObserveReferenceSetRequestKeyDefinition> keys; + + public static <D extends IdDto> Builder<D> builder(Class<D> type) { + return new Builder<>(type); + } + + public ObserveReferenceSetRequestDefinition(ImmutableSet<ObserveReferenceSetRequestKeyDefinition> keys) { + this.keys = keys; + } + + public ImmutableSet<ObserveReferenceSetRequestKeyDefinition> getKeys() { + return keys; + } + + public static class Builder<D extends IdDto> { + + private final Class<D> parentType; + + private final ImmutableSet.Builder<ObserveReferenceSetRequestKeyDefinition> keysBuilder; + + public Builder(Class<D> parentType) { + this.parentType = parentType; + this.keysBuilder = ImmutableSet.builder(); + } + + public Builder<D> addKey(String name, ObserveReferenceSetDefinitions propertyDefinition) { + keysBuilder.add(new ObserveReferenceSetRequestKeyDefinition<>(parentType, propertyDefinition.getDefinition(), name)); + return this; + } + + public ObserveReferenceSetRequestDefinition build() { + return new ObserveReferenceSetRequestDefinition(keysBuilder.build()); + } + } +} diff --git a/observe-services-model/src/main/java/fr/ird/observe/services/dto/reference/definition/ObserveReferenceSetRequestDefinitions.java b/observe-services-model/src/main/java/fr/ird/observe/services/dto/reference/definition/ObserveReferenceSetRequestDefinitions.java new file mode 100644 index 0000000..e7e520f --- /dev/null +++ b/observe-services-model/src/main/java/fr/ird/observe/services/dto/reference/definition/ObserveReferenceSetRequestDefinitions.java @@ -0,0 +1,50 @@ +package fr.ird.observe.services.dto.reference.definition; + +import fr.ird.observe.services.dto.IdDto; +import fr.ird.observe.services.dto.seine.TripSeineDto; + +/** + * Contient les définitions de tous les requêtes que les services proposent. + * + * Created on 11/11/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public enum ObserveReferenceSetRequestDefinitions { + + TRIP_SEINE_FORM(newBuilder(TripSeineDto.class) + .addKey(TripSeineDto.PROPERTY_OBSERVER, ObserveReferenceSetDefinitions.PERSON) + .addKey(TripSeineDto.PROPERTY_CAPTAIN, ObserveReferenceSetDefinitions.PERSON) + .addKey(TripSeineDto.PROPERTY_DATA_ENTRY_OPERATOR, ObserveReferenceSetDefinitions.PERSON) + .addKey(TripSeineDto.PROPERTY_VESSEL, ObserveReferenceSetDefinitions.VESSEL) + .addKey(TripSeineDto.PROPERTY_OCEAN, ObserveReferenceSetDefinitions.OCEAN) + .addKey(TripSeineDto.PROPERTY_DEPARTURE_HARBOUR, ObserveReferenceSetDefinitions.HARBOUR) + .addKey(TripSeineDto.PROPERTY_LANDING_HARBOUR, ObserveReferenceSetDefinitions.HARBOUR) + .addKey(TripSeineDto.PROPERTY_PROGRAM, ObserveReferenceSetDefinitions.PROGRAM)),; + + public final ObserveReferenceSetRequestDefinition definition; + + public static <D extends IdDto> ObserveReferenceSetRequestDefinition.Builder<D> newBuilder(Class<D> parentType) { + return new ObserveReferenceSetRequestDefinition.Builder<>(parentType); + } + + ObserveReferenceSetRequestDefinitions(ObserveReferenceSetRequestDefinition.Builder definitionBuilder) { + this.definition = definitionBuilder.build(); + } + + public ObserveReferenceSetRequestDefinition getDefinition() { + return definition; + } + + public static ObserveReferenceSetRequestDefinition get(String definitionName) { + + ObserveReferenceSetRequestDefinitions requestDefinitions = valueOf(definitionName); + if (requestDefinitions == null) { + throw new IllegalArgumentException("No definition with name " + definitionName + "registred"); + } + + return requestDefinitions.getDefinition(); + + } + +} diff --git a/observe-services-model/src/main/java/fr/ird/observe/services/dto/reference/definition/ObserveReferenceSetRequestKeyDefinition.java b/observe-services-model/src/main/java/fr/ird/observe/services/dto/reference/definition/ObserveReferenceSetRequestKeyDefinition.java new file mode 100644 index 0000000..f5156b4 --- /dev/null +++ b/observe-services-model/src/main/java/fr/ird/observe/services/dto/reference/definition/ObserveReferenceSetRequestKeyDefinition.java @@ -0,0 +1,74 @@ +package fr.ird.observe.services.dto.reference.definition; + +import com.google.common.base.MoreObjects; +import fr.ird.observe.services.dto.IdDto; +import fr.ird.observe.services.dto.referential.ReferentialDto; + +import java.util.Objects; + +/** + * Created on 10/11/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class ObserveReferenceSetRequestKeyDefinition<D extends IdDto> { + + private final Class<? extends IdDto> parentType; + + private final ObserveReferenceSetDefinition<D> referenceSetDefinition; + + private final String name; + + public ObserveReferenceSetRequestKeyDefinition(Class<? extends IdDto> parentType, ObserveReferenceSetDefinition<D> referenceSetDefinition, String name) { + this.parentType = parentType; + this.referenceSetDefinition = referenceSetDefinition; + this.name = name; + } + + public Class<? extends IdDto> getParentType() { + return parentType; + } + + public Class<D> getType() { + return referenceSetDefinition.getType(); + } + + public String getName() { + return name; + } + + public ObserveReferenceSetDefinition<D> getDefinition() { + return referenceSetDefinition; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof ObserveReferenceSetRequestKeyDefinition)) return false; + ObserveReferenceSetRequestKeyDefinition that = (ObserveReferenceSetRequestKeyDefinition) o; + return Objects.equals(parentType, that.parentType) && + Objects.equals(referenceSetDefinition.getType(), that.referenceSetDefinition.getType()) && + Objects.equals(name, that.name); + } + + @Override + public int hashCode() { + return Objects.hash(parentType, referenceSetDefinition.getType(), name); + } + + public boolean isReferential() { + Class<?> type = referenceSetDefinition.getType(); + return ReferentialDto.class.isAssignableFrom(type); + } + + @Override + public String toString() { + return MoreObjects.toStringHelper(this) + .add("parentType", parentType) + .add("name", name) + .add("type", referenceSetDefinition.getType()) + .add("propertyNames", referenceSetDefinition.getPropertyNames()) + .add("propertyTypes", referenceSetDefinition.getPropertyTypes()) + .toString(); + } +} diff --git a/observe-services-rest/src/test/java/fr/ird/observe/services/service/ReferenceSetServiceRestTest.java b/observe-services-rest/src/test/java/fr/ird/observe/services/service/ReferenceSetServiceRestTest.java new file mode 100644 index 0000000..e8a6eb2 --- /dev/null +++ b/observe-services-rest/src/test/java/fr/ird/observe/services/service/ReferenceSetServiceRestTest.java @@ -0,0 +1,96 @@ +package fr.ird.observe.services.service; + +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; +import fr.ird.observe.services.TestClassResource; +import fr.ird.observe.services.TestMethodResource; +import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationRest; +import fr.ird.observe.services.configuration.ObserveDataSourceConnection; +import fr.ird.observe.services.dto.reference.ObserveReferenceSet; +import fr.ird.observe.services.dto.reference.ObserveReferenceSetRequest; +import fr.ird.observe.services.dto.reference.ObserveReferenceSetResult; +import fr.ird.observe.services.dto.reference.ObserveReferentialReference; +import fr.ird.observe.services.dto.reference.definition.ObserveReferenceSetRequestDefinition; +import fr.ird.observe.services.dto.reference.definition.ObserveReferenceSetRequestDefinitions; +import fr.ird.observe.services.dto.reference.definition.ObserveReferenceSetRequestKeyDefinition; +import org.junit.Assert; +import org.junit.Before; +import org.junit.ClassRule; +import org.junit.Rule; +import org.junit.Test; + +import java.util.Date; + +/** + * Created on 13/11/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class ReferenceSetServiceRestTest { + + @ClassRule + public static final TestClassResource testClassResource = new TestClassResource(); + + @Rule + public final TestMethodResource testMethodResource = new TestMethodResource(testClassResource); + + + protected ReferenceSetService service; + + @Before + public void setUp() throws Exception { + + ObserveDataSourceConfigurationRest dataSourceConfiguration = testMethodResource.getDataSourceConfiguration().clone(); + DataSourceService dataSourceService = testClassResource.newService(dataSourceConfiguration, DataSourceService.class); + ObserveDataSourceConnection connection = dataSourceService.open(dataSourceConfiguration); + + service = testClassResource.newService(connection, ReferenceSetService.class); + + } + + @Test + public void testGetTripSeineRequest() throws Exception { + + String requestName = ObserveReferenceSetRequestDefinitions.TRIP_SEINE_FORM.name(); + + ObserveReferenceSetRequest request = new ObserveReferenceSetRequest(); + request.setRequestName(requestName); + request.setLastUpdateDates(ImmutableMap.<String, Date>of()); + + ObserveReferenceSetResult<ObserveReferentialReference> referenceSetResult = service.loadReferentialReferenceSets(request); + Assert.assertNotNull(referenceSetResult); + Assert.assertEquals(requestName, referenceSetResult.getRequestName()); + ImmutableMap<String, ObserveReferenceSet<?, ObserveReferentialReference>> referenceSetsMap = referenceSetResult.getReferenceSets(); + Assert.assertNotNull(referenceSetsMap); + + ObserveReferenceSetRequestDefinition definition = ObserveReferenceSetRequestDefinitions.get(requestName); + + ImmutableSet<ObserveReferenceSetRequestKeyDefinition> keys = definition.getKeys(); + for (ObserveReferenceSetRequestKeyDefinition key : keys) { + + String name = key.getName(); + Assert.assertTrue(referenceSetsMap.containsKey(name)); + + } + Assert.assertEquals(keys.size(), referenceSetsMap.size()); + + ImmutableMap<String, Date> lastUpdateDates = referenceSetResult.getLastUpdateDates(); + + request.setRequestName(requestName); + request.setLastUpdateDates(lastUpdateDates); + + // Re run the request, should receive no data + + ObserveReferenceSetResult<ObserveReferentialReference> referenceSetResult2 = service.loadReferentialReferenceSets(request); + Assert.assertNotNull(referenceSetResult2); + Assert.assertEquals(requestName, referenceSetResult2.getRequestName()); + ImmutableMap<String, ObserveReferenceSet<?, ObserveReferentialReference>> referenceSetsMap2 = referenceSetResult2.getReferenceSets(); + Assert.assertNotNull(referenceSetsMap2); + Assert.assertTrue(referenceSetsMap2.isEmpty()); + + + + + } + +} \ No newline at end of file diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/builder/EntityToReferentialReferenceDtoBuilder.java b/observe-services-topia/src/main/java/fr/ird/observe/services/builder/EntityToReferentialReferenceDtoBuilder.java index 25148fe..2cef244 100644 --- a/observe-services-topia/src/main/java/fr/ird/observe/services/builder/EntityToReferentialReferenceDtoBuilder.java +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/builder/EntityToReferentialReferenceDtoBuilder.java @@ -24,7 +24,6 @@ package fr.ird.observe.services.builder; import com.google.common.base.Function; import com.google.common.base.Preconditions; -import fr.ird.observe.entities.referentiel.ReferenceEntities; import fr.ird.observe.entities.referentiel.ReferenceEntity; import fr.ird.observe.services.ObserveServiceTopia; import fr.ird.observe.services.dto.ObserveDtoBinders; @@ -33,16 +32,12 @@ import fr.ird.observe.services.dto.constants.ReferentialLocale; import fr.ird.observe.services.dto.referential.ReferentialDto; import fr.ird.observe.services.dto.referential.ReferentialReferenceDto; import fr.ird.observe.services.dto.referential.ReferentialReferenceDtos; -import fr.ird.observe.services.service.ReferenceSetRequestKeyDefinition; import org.hibernate.Hibernate; import org.hibernate.proxy.HibernateProxy; import org.nuiton.topia.persistence.TopiaEntity; import org.nuiton.util.beans.Binder; -import org.nuiton.util.beans.BinderFactory; import java.io.Serializable; -import java.util.ArrayList; -import java.util.List; import java.util.Map; import java.util.Set; @@ -55,110 +50,6 @@ import java.util.Set; */ public class EntityToReferentialReferenceDtoBuilder<E extends ReferenceEntity, D extends ReferentialDto> { - private Class<D> type; - - private Binder<E, E> binder; - - private String[] propertyNames; - - private String[] entityPropertyNames; - - private Class<?>[] propertyTypes; - - private int referentialLocaleOrdinal; - - public static <E extends ReferenceEntity, D extends ReferentialDto> EntityToReferentialReferenceDtoBuilder<E, D> of(ReferentialLocale referentialLocale, ReferenceSetRequestKeyDefinition<D> requestKeyDefinition, Class<E> entityType) { - - EntityToReferentialReferenceDtoBuilder<E, D> referenceDtoBuilder = new EntityToReferentialReferenceDtoBuilder<>(); - - referenceDtoBuilder.type = requestKeyDefinition.getType(); - referenceDtoBuilder.referentialLocaleOrdinal = referentialLocale.ordinal(); - referenceDtoBuilder.binder = BinderFactory.newBinder(entityType); - referenceDtoBuilder.propertyNames = requestKeyDefinition.getPropertyNames(); - - List<String> entityPropertyNames = new ArrayList<>(); - - for (String propertyName : referenceDtoBuilder.propertyNames) { - - if (ReferentialReferenceDto.PROPERTY_LABEL.contains(propertyName)) { - propertyName = referentialLocale.getLibelle(); - } - entityPropertyNames.add(propertyName); - } - referenceDtoBuilder.entityPropertyNames = entityPropertyNames.toArray(new String[entityPropertyNames.size()]); - referenceDtoBuilder.propertyTypes = requestKeyDefinition.getPropertyTypes(); - - return referenceDtoBuilder; - - } - - public ReferentialReferenceDto<D> build(E entity) { - - Preconditions.checkNotNull(entity, "'entity' can't be null"); - - // on extrait l' entité du proxy hibernate - if (entity instanceof HibernateProxy) { - Hibernate.initialize(entity); - entity = (E) ((HibernateProxy) entity).getHibernateLazyInitializer().getImplementation(); - } - - Map<String, Object> entityProperties = binder.obtainProperties(entity, true, entityPropertyNames); - - Serializable[] propertyValues = new Serializable[propertyTypes.length]; - for (int i = 0; i < propertyTypes.length; i++) { - String propertyName = propertyNames[i]; - - Serializable propertyValue = (Serializable) entityProperties.get(propertyName); - if (propertyValue != null) { - - Class<?> propertyType = propertyTypes[i]; - - if (propertyValue instanceof ReferenceEntity) { - - ReferenceEntity referentialEntity = (ReferenceEntity) propertyValue; - if (String.class.equals(propertyType)) { - - // Conversion - - propertyValue = ReferenceEntities.toString(referentialLocaleOrdinal, referentialEntity); - - } else { - - // on veut récupérer une référence - //TODO - - } - - } else { - - propertyValue = transform(propertyValue); - - } - - Preconditions.checkState(propertyType.isAssignableFrom(propertyValue.getClass()), "Le type de la propriété " + propertyName + " devrait être du type " + propertyType.getName() + " mais vaut: " + propertyValue); - - } - - propertyValues[i] = propertyValue; - - } - - ReferentialReferenceDto<D> result = new ReferentialReferenceDto<>(); - result.init(type, propertyNames, propertyTypes, propertyValues); - - result.setId(entity.getTopiaId()); - result.setEnabled(entity.isEnabled()); - result.setNeedComment(entity.isNeedComment()); - - result.setVersion(entity.getTopiaVersion()); - result.setCreateDate(entity.getTopiaCreateDate()); - result.setLastUpdate(entity.getLastUpdate()); - result.setEnabled(fr.ird.observe.entities.constants.ReferenceStatus.enabled == entity.getStatus()); - - return result; - - } - public static <E extends ReferenceEntity, D extends ReferentialDto> ReferentialReferenceDto<D> build(Class<D> dtoType, ReferentialLocale referentialLocale, E entity) { Preconditions.checkNotNull(dtoType, "'dtoType' can't be null"); diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/dto/reference/ObserveReferenceSetBuilder.java b/observe-services-topia/src/main/java/fr/ird/observe/services/dto/reference/ObserveReferenceSetBuilder.java new file mode 100644 index 0000000..bda5a57 --- /dev/null +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/dto/reference/ObserveReferenceSetBuilder.java @@ -0,0 +1,250 @@ +package fr.ird.observe.services.dto.reference; + +import com.google.common.base.Defaults; +import com.google.common.base.Function; +import com.google.common.base.Preconditions; +import fr.ird.observe.entities.referentiel.ReferenceEntities; +import fr.ird.observe.entities.referentiel.ReferenceEntity; +import fr.ird.observe.services.dto.IdDto; +import fr.ird.observe.services.dto.ObserveDtosInitializer; +import fr.ird.observe.services.dto.constants.ReferentialLocale; +import fr.ird.observe.services.dto.reference.definition.ObserveReferenceSetDefinition; +import fr.ird.observe.services.dto.referential.ReferentialReferenceDto; +import org.hibernate.Hibernate; +import org.hibernate.proxy.HibernateProxy; +import org.nuiton.topia.persistence.TopiaEntity; +import org.nuiton.util.ReflectUtil; +import org.nuiton.util.beans.Binder; +import org.nuiton.util.beans.BinderFactory; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; + +/** + * Created on 13/11/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class ObserveReferenceSetBuilder<D extends IdDto, R extends ObserveReference> { + + private ObserveReferenceSetDefinition<D> definition; + + private Binder<TopiaEntity, TopiaEntity> binder; + + private String[] propertyNames; + + private String[] entityPropertyNames; + + private String i18nEntityPropertyName; + + private Class<?>[] propertyTypes; + + private int referentialLocaleOrdinal; + + private LinkedHashSet<R> references; + + private Date lastUpdateDate; + + public static <D extends IdDto, R extends ObserveReference> ObserveReferenceSetBuilder<D, R> of( + + ReferentialLocale referentialLocale, ObserveReferenceSetDefinition<D> definition, Class<TopiaEntity> entityType) { + + ObserveReferenceSetBuilder<D, R> referenceDtoBuilder = new ObserveReferenceSetBuilder<>(); + + referenceDtoBuilder.definition = definition; + referenceDtoBuilder.referentialLocaleOrdinal = referentialLocale.ordinal(); + referenceDtoBuilder.binder = BinderFactory.newBinder(entityType); + referenceDtoBuilder.propertyNames = definition.getPropertyNames(); + + List<String> entityPropertyNames = new ArrayList<>(); + + for (String propertyName : referenceDtoBuilder.propertyNames) { + + if (ReferentialReferenceDto.PROPERTY_LABEL.equals(propertyName)) { + propertyName = referenceDtoBuilder.i18nEntityPropertyName = referentialLocale.getLibelle(); + } + entityPropertyNames.add(propertyName); + } + referenceDtoBuilder.entityPropertyNames = entityPropertyNames.toArray(new String[entityPropertyNames.size()]); + referenceDtoBuilder.propertyTypes = definition.getPropertyTypes(); + referenceDtoBuilder.references = new LinkedHashSet<>(); + + return referenceDtoBuilder; + + } + + public ObserveReferenceSetBuilder<D, R> setLastUpdateDate(Date lastUpdateDate) { + this.lastUpdateDate = lastUpdateDate; + return this; + } + + public ObserveReferenceSet<D, R> build() { + return ObserveReferenceSet.of(definition, references, lastUpdateDate); + } + + public ObserveReferenceSetBuilder<D, R> addReferentialReference(TopiaEntity entity) { + + Map<String, Object> entityProperties = loadProperties(entity); + + Serializable[] propertyValues = new Serializable[propertyTypes.length]; + for (int i = 0; i < propertyTypes.length; i++) { + String propertyName = propertyNames[i]; + + if (ReferentialReferenceDto.PROPERTY_LABEL.equals(propertyName)) { + propertyName = i18nEntityPropertyName; + } + Serializable propertyValue = (Serializable) entityProperties.get(propertyName); + Class<?> propertyType = propertyTypes[i]; + + if (propertyValue == null) { + + if (propertyType.isPrimitive()) { + propertyValue = (Serializable) Defaults.defaultValue(propertyType); + } + + } else { + + if (propertyValue instanceof ReferenceEntity) { + + propertyValue = transformReferenceEntity(propertyType, (ReferenceEntity) propertyValue); + + } else { + + propertyValue = transform(propertyValue); + + } + + checkType(propertyName, propertyValue, propertyType); + + } + + propertyValues[i] = propertyValue; + + } + + ObserveReferentialReference result = new ObserveReferentialReference(); + + result.setValues(propertyValues); + result.setId(entity.getTopiaId()); + result.setVersion(entity.getTopiaVersion()); + result.setCreateDate(entity.getTopiaCreateDate()); + + ReferenceEntity referenceEntity = (ReferenceEntity) entity; + result.setEnabled(referenceEntity.isEnabled()); + result.setNeedComment(referenceEntity.isNeedComment()); + result.setLastUpdate(referenceEntity.getLastUpdate()); + result.setEnabled(fr.ird.observe.entities.constants.ReferenceStatus.enabled == referenceEntity.getStatus()); + + references.add((R) result); + + return this; + + } + + public ObserveReferenceSetBuilder<D, R> addReference(TopiaEntity entity) { + + Map<String, Object> entityProperties = loadProperties(entity); + + Serializable[] propertyValues = new Serializable[propertyTypes.length]; + for (int i = 0; i < propertyTypes.length; i++) { + String propertyName = propertyNames[i]; + + Serializable propertyValue = (Serializable) entityProperties.get(propertyName); + Class<?> propertyType = propertyTypes[i]; + + if (propertyValue == null) { + + if (propertyType.isPrimitive()) { + propertyValue = (Serializable) Defaults.defaultValue(propertyType); + } + + } else { + + if (propertyValue instanceof ReferenceEntity) { + + propertyValue = transformReferenceEntity(propertyType, (ReferenceEntity) propertyValue); + + } else if (propertyValue instanceof TopiaEntity) { + + //TODO + + } else { + + propertyValue = transform(propertyValue); + + } + + checkType(propertyName, propertyValue, propertyType); + + } + + propertyValues[i] = propertyValue; + + } + + ObserveReference result = new ObserveReference(); + result.setValues(propertyValues); + result.setId(entity.getTopiaId()); + + references.add((R) result); + + return this; + + } + + protected void checkType(String propertyName, Serializable propertyValue, Class<?> propertyType) { + if (propertyType.isPrimitive()) { + Preconditions.checkState(ReflectUtil.boxType(propertyType).isAssignableFrom(propertyValue.getClass()), "Le type de la propriété " + propertyName + " devrait être du type " + propertyType.getName() + " mais vaut: " + propertyValue); + } else { + Preconditions.checkState(propertyType.isAssignableFrom(propertyValue.getClass()), "Le type de la propriété " + propertyName + " devrait être du type " + propertyType.getName() + " mais vaut: " + propertyValue); + } + } + + protected Map<String, Object> loadProperties(TopiaEntity entity) { + + Preconditions.checkNotNull(entity, "'entity' can't be null"); + + // on extrait l' entité du proxy hibernate + if (entity instanceof HibernateProxy) { + Hibernate.initialize(entity); + entity = (TopiaEntity) ((HibernateProxy) entity).getHibernateLazyInitializer().getImplementation(); + } + + Map<String, Object> entityProperties = binder.obtainProperties(entity, true, entityPropertyNames); + return entityProperties; + + } + + protected Serializable transformReferenceEntity(Class<?> propertyType, ReferenceEntity referentialEntity) { + + Serializable result; + if (String.class.equals(propertyType)) { + + // Conversion + + result = ReferenceEntities.toString(referentialLocaleOrdinal, referentialEntity); + + } else { + + // on veut récupérer une référence + //TODO + result = null; + + } + + return result; + } + + protected Serializable transform(Object propertyValue) { + Function function = ObserveDtosInitializer.getEntityToDtoFunction(propertyValue); + if (function != null) { + propertyValue = function.apply(propertyValue); + } + return (Serializable) propertyValue; + } + +} diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/service/ReferenceSetServiceTopia.java b/observe-services-topia/src/main/java/fr/ird/observe/services/service/ReferenceSetServiceTopia.java index 3178da1..0189f1a 100644 --- a/observe-services-topia/src/main/java/fr/ird/observe/services/service/ReferenceSetServiceTopia.java +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/service/ReferenceSetServiceTopia.java @@ -3,20 +3,25 @@ package fr.ird.observe.services.service; import com.google.common.base.Optional; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableMap; -import fr.ird.observe.entities.referentiel.ReferenceEntity; import fr.ird.observe.services.ObserveServiceTopia; -import fr.ird.observe.services.builder.EntityToReferentialReferenceDtoBuilder; import fr.ird.observe.services.dto.IdDto; -import fr.ird.observe.services.dto.ReferenceSetDto; -import fr.ird.observe.services.dto.ReferenceSetDtos; +import fr.ird.observe.services.dto.reference.ObserveReference; +import fr.ird.observe.services.dto.reference.ObserveReferenceSet; +import fr.ird.observe.services.dto.reference.ObserveReferenceSetBuilder; +import fr.ird.observe.services.dto.reference.ObserveReferenceSetRequest; +import fr.ird.observe.services.dto.reference.ObserveReferenceSetResult; +import fr.ird.observe.services.dto.reference.ObserveReferentialReference; +import fr.ird.observe.services.dto.reference.definition.ObserveReferenceSetRequestDefinition; +import fr.ird.observe.services.dto.reference.definition.ObserveReferenceSetRequestDefinitions; +import fr.ird.observe.services.dto.reference.definition.ObserveReferenceSetRequestKeyDefinition; import fr.ird.observe.services.dto.referential.ReferentialDto; -import fr.ird.observe.services.dto.referential.ReferentialReferenceDto; import fr.ird.observe.services.entity.EntitiesExtractor; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.nuiton.topia.persistence.TopiaEntity; import java.util.Collections; import java.util.Date; -import java.util.LinkedHashSet; import java.util.Map; /** @@ -26,27 +31,25 @@ import java.util.Map; */ public class ReferenceSetServiceTopia extends ObserveServiceTopia implements ReferenceSetService { + /** Logger. */ + private static final Log log = LogFactory.getLog(ReferenceSetServiceTopia.class); + @Override - public ReferentialReferenceSetResult loadDataReferenceSets(ReferenceSetRequest request) { + public ObserveReferenceSetResult<ObserveReference> loadDataReferenceSets(ObserveReferenceSetRequest request) { String requestName = request.getRequestName(); - ReferenceSetRequestDefinitions requestDefinitions = ReferenceSetRequestDefinitions.valueOf(requestName); - if (requestDefinitions == null) { - throw new IllegalArgumentException("No request with name " + requestName + "registred"); - } + ObserveReferenceSetRequestDefinition requestDefinition = ObserveReferenceSetRequestDefinitions.get(requestName); - ReferenceSetRequestDefinition requestDefinition = requestDefinitions.getDefinition(); + ObserveReferenceSetResult.Builder<ObserveReference> resultBuilder = ObserveReferenceSetResult.builder(requestName); - ReferentialReferenceSetResult.Builder resultBuilder = new ReferentialReferenceSetResult.Builder(request); + for (ObserveReferenceSetRequestKeyDefinition definition : requestDefinition.getKeys()) { - for (ReferenceSetRequestKeyDefinition requestKeyDefinition : requestDefinition.getKeys()) { + boolean referential = definition.isReferential(); + Preconditions.checkArgument(!referential, "Can't obtain referenceSet of referential here, but try with " + definition); - boolean referential = requestKeyDefinition.isReferential(); - Preconditions.checkArgument(!referential, "Can't obtain referenceSet of referential here, but try with " + requestKeyDefinition); + ObserveReferenceSet<IdDto, ObserveReference> referenceSet = loadDataReferenceSet(definition); - String name = requestKeyDefinition.getName(); - - ReferenceSetDto referenceSet = loadDataReferenceSet(requestKeyDefinition); - resultBuilder.addKey(name, referenceSet); + String name = definition.getName(); + addKey(resultBuilder, name, referenceSet); } @@ -55,73 +58,82 @@ public class ReferenceSetServiceTopia extends ObserveServiceTopia implements Ref } @Override - public ReferentialReferenceSetResult loadReferentialReferenceSets(ReferenceSetRequest request) { + public ObserveReferenceSetResult<ObserveReferentialReference> loadReferentialReferenceSets(ObserveReferenceSetRequest request) { String requestName = request.getRequestName(); - ReferenceSetRequestDefinitions requestDefinitions = ReferenceSetRequestDefinitions.valueOf(requestName); - if (requestDefinitions == null) { - throw new IllegalArgumentException("No request with name " + requestName + "registred"); - } - ReferenceSetRequestDefinition requestDefinition = requestDefinitions.getDefinition(); + ObserveReferenceSetRequestDefinition requestDefinition = ObserveReferenceSetRequestDefinitions.get(requestName); - ReferentialReferenceSetResult.Builder resultBuilder = new ReferentialReferenceSetResult.Builder(request); + ObserveReferenceSetResult.Builder<ObserveReferentialReference> resultBuilder = ObserveReferenceSetResult.builder(requestName); ImmutableMap<String, Date> lastUpdateDates = request.getLastUpdateDates(); - for (ReferenceSetRequestKeyDefinition requestKeyDefinition : requestDefinition.getKeys()) { + for (ObserveReferenceSetRequestKeyDefinition definition : requestDefinition.getKeys()) { - boolean referential = requestKeyDefinition.isReferential(); - Preconditions.checkArgument(referential, "Can't obtain referenceSet of data here, but try with " + requestKeyDefinition); + boolean referential = definition.isReferential(); + Preconditions.checkArgument(referential, "Can't obtain referenceSet of data here, but try with " + definition); - String name = requestKeyDefinition.getName(); + String name = definition.getName(); Date lastUpdateDate = lastUpdateDates.get(name); - ReferenceSetDto referenceSet = loadReferentialReferenceSet(requestKeyDefinition, lastUpdateDate); - resultBuilder.addKey(name, referenceSet); + ObserveReferenceSet<ReferentialDto, ObserveReferentialReference> referenceSet = loadReferentialReferenceSet(definition, lastUpdateDate); + addKey(resultBuilder, name, referenceSet); + } return resultBuilder.build(); } - protected <D extends IdDto> ReferenceSetDto<D> loadDataReferenceSet(ReferenceSetRequestKeyDefinition<D> requestKeyDefinition) { + protected <D extends IdDto, R extends ObserveReference> void addKey(ObserveReferenceSetResult.Builder<R> resultBuilder, String name, ObserveReferenceSet<D, R> referenceSet) { + if (referenceSet != null) { + if (log.isInfoEnabled()) { + log.info("Add reference set " + name + " : " + referenceSet); + } + resultBuilder.addKey(name, referenceSet); + } + } - Class<D> type = requestKeyDefinition.getType(); - Class<TopiaEntity> entityType = getEntityType(type); - String name = requestKeyDefinition.getName(); + protected <D extends IdDto> ObserveReferenceSet<D, ObserveReference> loadDataReferenceSet(ObserveReferenceSetRequestKeyDefinition<D> requestKeyDefinition) { + + Class<TopiaEntity> entityType = getEntityType(requestKeyDefinition.getType()); - Iterable<TopiaEntity> entitiesExtractor = getEntities(requestKeyDefinition, Collections.<String, Object>emptyMap()); + ObserveReferenceSetBuilder<D, ObserveReference> referenceBuilder = ObserveReferenceSetBuilder.of(serviceContext.getReferentialLocale(), requestKeyDefinition.getDefinition(), entityType); - //TODO - ReferenceSetDto<D> referenceSet = null; + Iterable<TopiaEntity> entities = getEntities(requestKeyDefinition, Collections.<String, Object>emptyMap()); + for (TopiaEntity entity : entities) { + + referenceBuilder.addReference(entity); + + } + + ObserveReferenceSet<D, ObserveReference> referenceSet = referenceBuilder.build(); return referenceSet; + } - protected <D extends ReferentialDto, E extends ReferenceEntity> ReferenceSetDto<D> loadReferentialReferenceSet(ReferenceSetRequestKeyDefinition<D> requestKeyDefinition, Date lastUpdateDate) { + protected <D extends ReferentialDto> ObserveReferenceSet<D, ObserveReferentialReference> loadReferentialReferenceSet(ObserveReferenceSetRequestKeyDefinition<D> requestKeyDefinition, Date lastUpdateDate) { - Class<D> type = requestKeyDefinition.getType(); - Class<E> entityType = getEntityType(type); - String name = requestKeyDefinition.getName(); + Class<TopiaEntity> entityType = getEntityType(requestKeyDefinition.getType()); Optional<Date> lastUpdateOptional = getLastUpdate(entityType); - ReferenceSetDto<D> referenceSet; - if (lastUpdateOptional.isPresent() && lastUpdateOptional.get().after(lastUpdateDate)) { + ObserveReferenceSet<D, ObserveReferentialReference> referenceSet; + if (lastUpdateOptional.isPresent() && (lastUpdateDate == null || lastUpdateOptional.get().after(lastUpdateDate))) { + + ObserveReferenceSetBuilder<D, ObserveReferentialReference> referenceBuilder = ObserveReferenceSetBuilder.of(serviceContext.getReferentialLocale(), requestKeyDefinition.getDefinition(), entityType); - EntityToReferentialReferenceDtoBuilder<E, D> referenceBuilder = EntityToReferentialReferenceDtoBuilder.of(serviceContext.getReferentialLocale(), requestKeyDefinition, entityType); + referenceBuilder.setLastUpdateDate(lastUpdateOptional.get()); - Iterable<E> entities = getEntities(requestKeyDefinition, Collections.<String, Object>emptyMap()); + Iterable<TopiaEntity> entities = getEntities(requestKeyDefinition, Collections.<String, Object>emptyMap()); - LinkedHashSet<ReferentialReferenceDto<D>> labels = new LinkedHashSet<>(); - for (E entity : entities) { + for (TopiaEntity entity : entities) { - ReferentialReferenceDto<D> dto = referenceBuilder.build(entity); - labels.add(dto); + referenceBuilder.addReferentialReference(entity); } - referenceSet = ReferenceSetDtos.newReferenceSetDto(type, name, labels, lastUpdateOptional.get()); + referenceSet = referenceBuilder.build(); } else { @@ -130,13 +142,12 @@ public class ReferenceSetServiceTopia extends ObserveServiceTopia implements Ref } return referenceSet; - } + } - protected <E extends TopiaEntity, D extends IdDto> Iterable<E> getEntities(ReferenceSetRequestKeyDefinition<D> requestKeyDefinition, + protected <E extends TopiaEntity, D extends IdDto> Iterable<E> getEntities(ObserveReferenceSetRequestKeyDefinition<D> requestKeyDefinition, Map<String, Object> dataContext) { - Class<D> type = requestKeyDefinition.getType(); Class<E> entityType = getEntityType(type); Class<TopiaEntity> entityParentType = getEntityType(requestKeyDefinition.getParentType()); @@ -157,6 +168,7 @@ public class ReferenceSetServiceTopia extends ObserveServiceTopia implements Ref } return entities; + } } diff --git a/observe-services-topia/src/test/java/fr/ird/observe/services/service/ReferenceSetServiceTopiaTest.java b/observe-services-topia/src/test/java/fr/ird/observe/services/service/ReferenceSetServiceTopiaTest.java new file mode 100644 index 0000000..9af6322 --- /dev/null +++ b/observe-services-topia/src/test/java/fr/ird/observe/services/service/ReferenceSetServiceTopiaTest.java @@ -0,0 +1,54 @@ +package fr.ird.observe.services.service; + +import com.google.common.collect.ImmutableSet; +import fr.ird.observe.services.dto.reference.ObserveReferenceSetRequest; +import fr.ird.observe.services.dto.reference.definition.ObserveReferenceSetRequestDefinitions; +import fr.ird.observe.services.dto.reference.ObserveReferentialReference; +import fr.ird.observe.services.dto.reference.ObserveReferenceSetResult; +import org.junit.Assert; +import org.junit.Test; + +import java.util.Set; + +/** + * Created on 13/11/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class ReferenceSetServiceTopiaTest extends AbstractServiceTopiaTest { + + protected ReferenceSetService service; + + @Override + public Set<String> getTestNamesChangeDataBase() { + return ImmutableSet.of(); + } + + @Override + public String getScriptName() { + return "referentiel"; + } + + @Override + public void setUp() throws Exception { + super.setUp(); + + service = newService(ReferenceSetService.class); + + } + + @Test + public void testGetTripSeineRequest() throws Exception { + + String requestName = ObserveReferenceSetRequestDefinitions.TRIP_SEINE_FORM.name(); + ObserveReferenceSetRequest request = new ObserveReferenceSetRequest(); + request.setRequestName(requestName); + + ObserveReferenceSetResult<ObserveReferentialReference> referentialLabelSet = service.loadReferentialReferenceSets(request); + Assert.assertNotNull(referentialLabelSet); + Assert.assertEquals(requestName, referentialLabelSet.getRequestName()); + Assert.assertNotNull(referentialLabelSet.getReferenceSets()); + + } + +} \ No newline at end of file -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@list.forge.codelutin.com>.