This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository observe. See http://git.codelutin.com/observe.git commit 306d8146b4ed76362af16aac022585b3e9083677 Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon Aug 17 09:48:22 2015 +0200 Revue du builder de modele --- .../services/service/EntityToModelVisitor.java | 112 -------------- .../services/service/ReferentialModelBuilder.java | 171 +++++++++++++++++++++ .../services/service/ReferentialServiceTopia.java | 10 +- .../service/ReferentialModelBuilderTest.java | 72 +++++++++ 4 files changed, 246 insertions(+), 119 deletions(-) diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/service/EntityToModelVisitor.java b/observe-services-topia/src/main/java/fr/ird/observe/services/service/EntityToModelVisitor.java deleted file mode 100644 index abd84f8..0000000 --- a/observe-services-topia/src/main/java/fr/ird/observe/services/service/EntityToModelVisitor.java +++ /dev/null @@ -1,112 +0,0 @@ -package fr.ird.observe.services.service; - -import com.google.common.collect.ImmutableMap; -import fr.ird.observe.services.model.referential.ReferentialLabelModel; -import fr.ird.observe.services.model.referential.ReferentialLabelModels; -import fr.ird.observe.services.model.referential.ReferentialModel; -import org.nuiton.topia.persistence.EntityVisitor; -import org.nuiton.topia.persistence.TopiaEntity; -import org.nuiton.util.beans.Binder; -import org.nuiton.util.beans.BinderFactory; - -import java.io.Closeable; -import java.util.Collection; -import java.util.LinkedHashSet; - -/** - * Created on 16/08/15. - * - * @author Tony Chemit - chemit@codelutin.com - */ -public class EntityToModelVisitor<M extends ReferentialModel> implements EntityVisitor, Closeable { - - private M result; - - private ImmutableMap.Builder<String, Object> valuesBuilder; - - private Binder<M, M> binder; - - public EntityToModelVisitor(M result) { - this.result = result; - this.binder = (Binder<M, M>) BinderFactory.newBinder(result.getClass()); - this.valuesBuilder = new ImmutableMap.Builder<>(); - } - - @Override - public void start(TopiaEntity entity) { - } - - @Override - public void end(TopiaEntity entity) { - ImmutableMap<String, Object> properties = valuesBuilder.build(); - binder.injectProperties(properties, result); - - } - - @Override - public void visit(TopiaEntity entity, String propertyName, Class<?> type, Object value) { - - if (value != null) { - - Object valueToAdd = value; - if (value instanceof TopiaEntity) { - - TopiaEntity entityValue = (TopiaEntity) value; - valueToAdd = entityToRef(entityValue); - - } - - valuesBuilder.put(propertyName, valueToAdd); - - } - - } - - @Override - public void visit(TopiaEntity entity, String propertyName, Class<?> collectionType, Class<?> type, Object value) { - - if (value != null) { - - Object valueToAdd = value; - if (TopiaEntity.class.isAssignableFrom(type)) { - - Collection<? extends TopiaEntity> topiaEntities = (Collection<? extends TopiaEntity>) value; - LinkedHashSet<ReferentialLabelModel> models = new LinkedHashSet<>(topiaEntities.size()); - for (TopiaEntity entityValue : topiaEntities) { - - models.add(entityToRef(entityValue)); - } - valueToAdd = models; - - } - - valuesBuilder.put(propertyName, valueToAdd); - - } - - } - - @Override - public void visit(TopiaEntity entity, String propertyName, Class<?> collectionType, Class<?> type, int index, Object value) { - } - - @Override - public void clear() { - valuesBuilder = null; - result = null; - binder = null; - } - - protected ReferentialLabelModel entityToRef(TopiaEntity entityValue) { - - ReferentialLabelModel label = ReferentialLabelModels.newReferentialLabelModel(); - label.setId(entityValue.getTopiaId()); - return label; - - } - - @Override - public void close() { - clear(); - } -} diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/service/ReferentialModelBuilder.java b/observe-services-topia/src/main/java/fr/ird/observe/services/service/ReferentialModelBuilder.java new file mode 100644 index 0000000..9152e71 --- /dev/null +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/service/ReferentialModelBuilder.java @@ -0,0 +1,171 @@ +package fr.ird.observe.services.service; + +import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableMap; +import fr.ird.observe.entities.constants.GearType; +import fr.ird.observe.entities.constants.ReferenceStatus; +import fr.ird.observe.entities.referentiel.Program; +import fr.ird.observe.services.model.referential.ReferentialLabelModel; +import fr.ird.observe.services.model.referential.ReferentialLabelModels; +import fr.ird.observe.services.model.referential.ReferentialModel; +import org.nuiton.topia.persistence.EntityVisitor; +import org.nuiton.topia.persistence.TopiaEntity; +import org.nuiton.util.beans.Binder; +import org.nuiton.util.beans.BinderFactory; + +import java.io.Closeable; +import java.util.Collection; +import java.util.LinkedHashSet; + +/** + * Created on 16/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class ReferentialModelBuilder<M extends ReferentialModel> implements Closeable { + + private M result; + + private ImmutableMap.Builder<String, Object> valuesBuilder; + + private Binder<M, M> binder; + + private final EntityVisitor visitor; + + public static <M extends ReferentialModel> ReferentialModelBuilder<M> create(Class<M> modelType) { + + Preconditions.checkNotNull(modelType, "modelType can't be null."); + M result; + try { + result = modelType.newInstance(); + } catch (InstantiationException | IllegalAccessException e) { + throw new IllegalStateException("Could not instanciate model of type: " + modelType.getName()); + } + ReferentialModelBuilder<M> visitor = new ReferentialModelBuilder<>(result); + return visitor; + } + + public ReferentialModelBuilder<M> copyEntity(TopiaEntity entity) { + entity.accept(visitor); + return this; + } + + public M build() { + + ImmutableMap<String, Object> properties = valuesBuilder.build(); + binder.injectProperties(properties, result); + return result; + + } + + protected ReferentialModelBuilder(M result) { + this.result = result; + this.binder = (Binder<M, M>) BinderFactory.newBinder(result.getClass()); + this.valuesBuilder = new ImmutableMap.Builder<>(); + this.visitor = new ToModelVisitor(); + } + + + protected void putPropertyValue(String propertyName, Object propertyValue) { + + if (TopiaEntity.TOPIA_ID.equals(propertyName)) { + propertyName = ReferentialModel.PROPERTY_ID; + } else if (Program.PROPERTY_GEAR_TYPE.equals(propertyName)) { + + GearType entityGearType = (GearType) propertyValue; + propertyValue = fr.ird.observe.services.model.constants.GearType.valueOf(entityGearType.name()); + + } else if (Program.PROPERTY_STATUS.equals(propertyName)) { + + ReferenceStatus entityGearType = (ReferenceStatus) propertyValue; + propertyValue = fr.ird.observe.services.model.constants.ReferenceStatus.valueOf(entityGearType.name()); + + } + + //TODO Ajouter les autres exceptions de transformations + valuesBuilder.put(propertyName, propertyValue); + + } + + protected ReferentialLabelModel entityToRef(TopiaEntity entityValue) { + + ReferentialLabelModel label = ReferentialLabelModels.newReferentialLabelModel(); + label.setId(entityValue.getTopiaId()); + return label; + + } + + @Override + public void close() { + valuesBuilder = null; + result = null; + binder = null; + visitor.clear(); + } + + class ToModelVisitor implements EntityVisitor { + + @Override + public void start(TopiaEntity entity) { + visit(entity, TopiaEntity.TOPIA_ID, String.class, entity.getTopiaId()); + //visit(entity, TopiaEntity.TOPIA_VERSION, long.class, entity.getTopiaVersion()); + //visit(entity, TopiaEntity.TOPIA_CREATE_DATE, Date.class, entity.getTopiaCreateDate()); + } + + @Override + public void end(TopiaEntity entity) { + } + + @Override + public void visit(TopiaEntity entity, String propertyName, Class<?> type, Object value) { + + if (value != null) { + + Object valueToAdd = value; + if (value instanceof TopiaEntity) { + + TopiaEntity entityValue = (TopiaEntity) value; + valueToAdd = entityToRef(entityValue); + + } + + putPropertyValue(propertyName, valueToAdd); + + } + + } + + @Override + public void visit(TopiaEntity entity, String propertyName, Class<?> collectionType, Class<?> type, Object value) { + + if (value != null) { + + Object valueToAdd = value; + if (TopiaEntity.class.isAssignableFrom(type)) { + + Collection<? extends TopiaEntity> topiaEntities = (Collection<? extends TopiaEntity>) value; + LinkedHashSet<ReferentialLabelModel> models = new LinkedHashSet<>(topiaEntities.size()); + for (TopiaEntity entityValue : topiaEntities) { + + models.add(entityToRef(entityValue)); + } + valueToAdd = models; + + } + + putPropertyValue(propertyName, valueToAdd); + + } + + } + + @Override + public void visit(TopiaEntity entity, String propertyName, Class<?> collectionType, Class<?> type, int index, Object value) { + } + + @Override + public void clear() { + + } + } +} diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/service/ReferentialServiceTopia.java b/observe-services-topia/src/main/java/fr/ird/observe/services/service/ReferentialServiceTopia.java index ab4d12c..9d60512 100644 --- a/observe-services-topia/src/main/java/fr/ird/observe/services/service/ReferentialServiceTopia.java +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/service/ReferentialServiceTopia.java @@ -189,14 +189,10 @@ public class ReferentialServiceTopia extends ObserveServiceTopia implements Refe protected <M extends ReferentialModel> M toModel(Class<M> modelType, TopiaEntity entity) { - try { - M model = modelType.newInstance(); - try (EntityToModelVisitor<M> visitor = new EntityToModelVisitor<>(model)) { - entity.accept(visitor); - } + try (ReferentialModelBuilder<M> modelBuilder = ReferentialModelBuilder.create(modelType)) { + modelBuilder.copyEntity(entity); + M model = modelBuilder.build(); return model; - } catch (InstantiationException | IllegalAccessException e) { - throw new IllegalStateException("Could not create model of type: " + modelType.getName()); } } diff --git a/observe-services-topia/src/test/java/fr/ird/observe/services/service/ReferentialModelBuilderTest.java b/observe-services-topia/src/test/java/fr/ird/observe/services/service/ReferentialModelBuilderTest.java new file mode 100644 index 0000000..1f87ee2 --- /dev/null +++ b/observe-services-topia/src/test/java/fr/ird/observe/services/service/ReferentialModelBuilderTest.java @@ -0,0 +1,72 @@ +package fr.ird.observe.services.service; + +import fr.ird.observe.entities.constants.GearType; +import fr.ird.observe.entities.constants.ReferenceStatus; +import fr.ird.observe.entities.referentiel.Organism; +import fr.ird.observe.entities.referentiel.OrganismImpl; +import fr.ird.observe.entities.referentiel.Program; +import fr.ird.observe.entities.referentiel.ProgramImpl; +import fr.ird.observe.services.model.referential.ProgramModel; +import org.junit.Assert; +import org.junit.Test; +import org.nuiton.util.DateUtil; + +/** + * Created on 17/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class ReferentialModelBuilderTest { + + @Test + public void testCopy() { + + Program program = new ProgramImpl(); + program.setCode("code"); + program.setNeedComment(true); + program.setStatus(ReferenceStatus.enabled); + program.setLabel1("label1"); + program.setLabel2("label2"); + program.setLabel3("label3"); + program.setLabel4("label4"); + program.setLabel5("label5"); + program.setLabel6("label6"); + program.setLabel7("label7"); + program.setLabel8("label8"); + program.setTopiaId("Program1"); + program.setStartDate(DateUtil.createDate(1, 1, 1)); + program.setEndDate(DateUtil.createDate(1, 1, 2)); + program.setGearType(GearType.seine); + program.setTargetDiscardsObservation(1); + Organism organism = new OrganismImpl(); + organism.setTopiaId("Oraganism1"); + program.setOrganism(organism); + + ReferentialModelBuilder<ProgramModel> builder = ReferentialModelBuilder.create(ProgramModel.class); + builder.copyEntity(program); + ProgramModel programModel = builder.build(); + + Assert.assertEquals(program.getCode(), programModel.getCode()); + Assert.assertEquals(program.isNeedComment(), programModel.isNeedComment()); + Assert.assertNotNull(programModel.getStatus()); + Assert.assertEquals(program.getStatus().name(), programModel.getStatus().name()); + + Assert.assertEquals(program.getLabel1(), programModel.getLabel1()); + Assert.assertEquals(program.getLabel2(), programModel.getLabel2()); + Assert.assertEquals(program.getLabel3(), programModel.getLabel3()); + Assert.assertEquals(program.getLabel4(), programModel.getLabel4()); + Assert.assertEquals(program.getLabel5(), programModel.getLabel5()); + Assert.assertEquals(program.getLabel6(), programModel.getLabel6()); + Assert.assertEquals(program.getLabel7(), programModel.getLabel7()); + Assert.assertEquals(program.getLabel8(), programModel.getLabel8()); + Assert.assertEquals(program.getTopiaId(), programModel.getId()); + Assert.assertNotNull(programModel.getGearType()); + Assert.assertEquals(program.getGearType().name(), programModel.getGearType().name()); + Assert.assertEquals(program.getTargetDiscardsObservation(), programModel.getTargetDiscardsObservation()); + Assert.assertNotNull(programModel.getOrganism()); + Assert.assertEquals(program.getOrganism().getTopiaId(), programModel.getOrganism().getId()); + + } + + +} \ 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>.