branch feature/7739 updated (b42e495 -> f9047bd)
This is an automated email from the git hooks/post-receive script. New change to branch feature/7739 in repository observe. See http://git.codelutin.com/observe.git from b42e495 ajout de tests (refs #7739) new f9047bd debut du remplacement des ref obsolètes (refs #7739) The 1 revisions listed above as "new" are entirely new to this repository and will be described in separate emails. The revisions listed as "adds" were already present in the repository and have only been added to this reference. Detailed log of new commits: commit f9047bdd8b5374fc9694082e08ba56b022f78e91 Author: Kevin Morin <morin@codelutin.com> Date: Thu Nov 26 10:17:38 2015 +0100 debut du remplacement des ref obsolètes (refs #7739) Summary of changes: .../synchro/SynchronizationServiceController.java | 7 ++ .../synchro/PropertyReplacementDefinition.java | 37 +++++++++ .../actions/synchro/SynchronizationService.java | 3 + .../java/fr/ird/observe/services/dto/DtoMap.java | 13 ++++ .../synchro/SynchronizationServiceTopia.java | 49 ++++++++++++ .../synchro/SynchronizationServiceTopiaTest.java | 87 ++++++++++++++++++++++ 6 files changed, 196 insertions(+) create mode 100644 observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/PropertyReplacementDefinition.java -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@list.forge.codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/7739 in repository observe. See http://git.codelutin.com/observe.git commit f9047bdd8b5374fc9694082e08ba56b022f78e91 Author: Kevin Morin <morin@codelutin.com> Date: Thu Nov 26 10:17:38 2015 +0100 debut du remplacement des ref obsolètes (refs #7739) --- .../synchro/SynchronizationServiceController.java | 7 ++ .../synchro/PropertyReplacementDefinition.java | 37 +++++++++ .../actions/synchro/SynchronizationService.java | 3 + .../java/fr/ird/observe/services/dto/DtoMap.java | 13 ++++ .../synchro/SynchronizationServiceTopia.java | 49 ++++++++++++ .../synchro/SynchronizationServiceTopiaTest.java | 87 ++++++++++++++++++++++ 6 files changed, 196 insertions(+) diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/actions/synchro/SynchronizationServiceController.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/actions/synchro/SynchronizationServiceController.java index c2eef2d..c9d1029 100644 --- a/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/actions/synchro/SynchronizationServiceController.java +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/actions/synchro/SynchronizationServiceController.java @@ -1,8 +1,10 @@ package fr.ird.observe.application.web.controller.v1.actions.synchro; +import com.google.common.collect.Multimap; import fr.ird.observe.application.web.controller.v1.ObserveAuthenticatedServiceControllerSupport; import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; import fr.ird.observe.services.service.actions.synchro.ObserveDiffState; +import fr.ird.observe.services.service.actions.synchro.PropertyReplacementDefinition; import fr.ird.observe.services.service.actions.synchro.SynchronizationService; /** @@ -20,4 +22,9 @@ public class SynchronizationServiceController extends ObserveAuthenticatedServic public ObserveDiffState.ObserveDiffStateMap buildReferentielDifferentiel(ObserveDataSourceConfiguration dstDSC) { return service.buildReferentielDifferentiel(dstDSC); } + + @Override + public void updateReferentiel(Multimap<PropertyReplacementDefinition, String> obsoleteRefReplacement) { + service.updateReferentiel(obsoleteRefReplacement); + } } diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/PropertyReplacementDefinition.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/PropertyReplacementDefinition.java new file mode 100644 index 0000000..ee40cff --- /dev/null +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/PropertyReplacementDefinition.java @@ -0,0 +1,37 @@ +package fr.ird.observe.services.service.actions.synchro; + +import fr.ird.observe.services.dto.IdDto; + +import java.io.Serializable; + +/** + * @author Kevin Morin (Code Lutin) + * @since 5.0 + */ +public class PropertyReplacementDefinition implements Serializable { + + //FIXME dto ou entité ? + private final Class<? extends IdDto> type; + + private final String propertyName; + + private final String replacementId; + + public PropertyReplacementDefinition(String replacementId, Class<? extends IdDto> type, String propertyName) { + this.replacementId = replacementId; + this.type = type; + this.propertyName = propertyName; + } + + public String getReplacementId() { + return replacementId; + } + + public String getPropertyName() { + return propertyName; + } + + public Class<? extends IdDto> getType() { + return type; + } +} diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/SynchronizationService.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/SynchronizationService.java index 16e38ef..3f652b7 100644 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/SynchronizationService.java +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/SynchronizationService.java @@ -1,5 +1,6 @@ package fr.ird.observe.services.service.actions.synchro; +import com.google.common.collect.Multimap; import fr.ird.observe.services.ObserveService; import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; @@ -10,4 +11,6 @@ import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; public interface SynchronizationService extends ObserveService { ObserveDiffState.ObserveDiffStateMap buildReferentielDifferentiel(ObserveDataSourceConfiguration dstDSC); + + void updateReferentiel(Multimap<PropertyReplacementDefinition, String> obsoleteRefReplacement); } diff --git a/observe-services-model/src/main/java/fr/ird/observe/services/dto/DtoMap.java b/observe-services-model/src/main/java/fr/ird/observe/services/dto/DtoMap.java index 3dd3487..dd87614 100644 --- a/observe-services-model/src/main/java/fr/ird/observe/services/dto/DtoMap.java +++ b/observe-services-model/src/main/java/fr/ird/observe/services/dto/DtoMap.java @@ -40,4 +40,17 @@ public class DtoMap extends HashMap<Class<? extends IdDto>, List<? extends IdDto public DtoMap(Map<? extends Class<? extends IdDto>, ? extends List<? extends IdDto>> m) { super(m); } + + public int totalSize() { + int totalSize = 0; + + for (Class<? extends IdDto> aClass : keySet()) { + List<? extends IdDto> idDtos = get(aClass); + if (idDtos != null) { + totalSize += idDtos.size(); + } + } + + return totalSize; + } } diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/SynchronizationServiceTopia.java b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/SynchronizationServiceTopia.java index 8be7431..36e079d 100644 --- a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/SynchronizationServiceTopia.java +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/SynchronizationServiceTopia.java @@ -3,6 +3,7 @@ package fr.ird.observe.services.service.actions.synchro; import com.google.common.base.Predicate; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; +import com.google.common.collect.Multimap; import fr.ird.observe.ObserveTopiaApplicationContext; import fr.ird.observe.ObserveTopiaPersistenceContext; import fr.ird.observe.entities.Entities; @@ -12,6 +13,7 @@ import fr.ird.observe.services.ObserveTopiaApplicationContextFactory; import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopiaSupport; import fr.ird.observe.services.configuration.ObserveDataSourceConnection; +import fr.ird.observe.services.dto.IdDto; import fr.ird.observe.services.service.DataSourceService; import org.apache.commons.io.IOUtils; import org.apache.commons.logging.Log; @@ -21,8 +23,11 @@ import org.nuiton.topia.persistence.TopiaEntity; import org.nuiton.topia.persistence.util.DiffState; import org.nuiton.topia.persistence.util.TopiaEntityBinder; import org.nuiton.topia.persistence.util.TopiaEntityHelper; +import org.nuiton.util.beans.BeanUtil; +import java.lang.reflect.Method; import java.util.ArrayList; +import java.util.Collection; import java.util.List; /** @@ -168,6 +173,50 @@ public class SynchronizationServiceTopia extends ObserveServiceTopia implements return new ArrayList<E>(result); } + @Override + public void updateReferentiel(Multimap<PropertyReplacementDefinition, String> obsoleteRefReplacement) { + + for (PropertyReplacementDefinition propertyReplacementDefinition : obsoleteRefReplacement.keySet()) { + + Class<? extends IdDto> dtoType = propertyReplacementDefinition.getType(); + Class<TopiaEntity> entityType = getEntityType(dtoType); + + String propertyName = propertyReplacementDefinition.getPropertyName(); + String replacementId = propertyReplacementDefinition.getReplacementId(); + + try { + Class<? extends TopiaEntity> propertyEntityClass = + (Class<? extends TopiaEntity>) entityType.getField(propertyName).getDeclaringClass(); + Class<? extends IdDto> propertyDtoClass = getDtoType(propertyEntityClass); + + TopiaEntity propertyNewValue = loadEntity(propertyDtoClass, propertyEntityClass, replacementId); + + Collection<String> entityIds = obsoleteRefReplacement.get(propertyReplacementDefinition); + + for (String id : entityIds) { + TopiaEntity topiaEntity = loadEntity(dtoType, entityType, id); + + Method mutator = BeanUtil.getMutator(topiaEntity, propertyName); + mutator.invoke(topiaEntity, propertyNewValue); + + saveEntity(entityType, topiaEntity); + } + + } catch (NoSuchFieldException e) { + if (log.isErrorEnabled()) { + log.error("error, the property " + propertyName + " does not exist for entity " + entityType, e); + } + + } catch (ReflectiveOperationException e) { + if (log.isErrorEnabled()) { + log.error("error while setting the new property value", e); + } + } + } + + + } + protected <E extends TopiaEntity> List<E> getList0(ObserveTopiaPersistenceContext persistenceContext, Class<E> klass, Predicate<E> predicate, diff --git a/observe-services-topia/src/test/java/fr/ird/observe/services/service/actions/synchro/SynchronizationServiceTopiaTest.java b/observe-services-topia/src/test/java/fr/ird/observe/services/service/actions/synchro/SynchronizationServiceTopiaTest.java index b147406..6e37152 100644 --- a/observe-services-topia/src/test/java/fr/ird/observe/services/service/actions/synchro/SynchronizationServiceTopiaTest.java +++ b/observe-services-topia/src/test/java/fr/ird/observe/services/service/actions/synchro/SynchronizationServiceTopiaTest.java @@ -1,12 +1,19 @@ package fr.ird.observe.services.service.actions.synchro; +import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.ImmutableSet; +import com.google.common.collect.ListMultimap; +import com.google.common.collect.Lists; import fr.ird.observe.services.ApplicationContextResource; import fr.ird.observe.services.DataSourceResource; import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopiaH2; +import fr.ird.observe.services.dto.DtoMap; import fr.ird.observe.services.dto.FormDto; +import fr.ird.observe.services.dto.IdDto; +import fr.ird.observe.services.dto.IdDtos; import fr.ird.observe.services.dto.ReferenceDto; import fr.ird.observe.services.dto.ReferenceSetDto; +import fr.ird.observe.services.dto.referential.CountryDto; import fr.ird.observe.services.dto.referential.PersonDto; import fr.ird.observe.services.dto.referential.VesselDto; import fr.ird.observe.services.service.AbstractServiceTopiaTest; @@ -17,7 +24,10 @@ import org.junit.Assert; import org.junit.Rule; import org.junit.Test; +import java.lang.reflect.Field; import java.util.Date; +import java.util.LinkedHashSet; +import java.util.List; import java.util.Set; /** @@ -151,4 +161,81 @@ public class SynchronizationServiceTopiaTest extends AbstractServiceTopiaTest { } + @Test + public void testUpdateReferentiel() throws Exception { + + ReferentialService referentialService = newService(ReferentialService.class); + + ReferenceSetDto<CountryDto> referentialReferenceSet = referentialService.getReferentialReferenceSet(CountryDto.class); + + //find the most used country + LinkedHashSet<ReferenceDto> reference = referentialReferenceSet.getReference(); + + DtoMap maxAllUsages = null; + String notUsedId = null; + CountryDto oldCountry = null; + + for (ReferenceDto<CountryDto> referenceDto : reference) { + + CountryDto country = referentialService.loadToRead(CountryDto.class, referenceDto.getId()).getForm(); + DtoMap allUsages = referentialService.findAllUsages(country); + + if (allUsages.isEmpty() && notUsedId == null) { + notUsedId = referenceDto.getId(); + + } else if (maxAllUsages == null) { + maxAllUsages = allUsages; + oldCountry = country; + + } else { + int inClassSize = allUsages.size(); + int usageSize = allUsages.totalSize(); + + if (inClassSize > maxAllUsages.size() + || inClassSize == maxAllUsages.size() && usageSize > maxAllUsages.totalSize()) { + maxAllUsages = allUsages; + oldCountry = country; + } + + } + } + + ListMultimap<PropertyReplacementDefinition, String> refToUpdate = ArrayListMultimap.create(); + + // replace the most used country by an used one + for (Class<? extends IdDto> dtoType : maxAllUsages.keySet()) { + + String propertyName = null; + + // FIXME find the property name in the meta data next to come in topia + Field[] fields = dtoType.getFields(); + for (Field field : fields) { + if (CountryDto.class.equals(field.getType())) { + propertyName = field.getName(); + break; + } + } + + + PropertyReplacementDefinition propertyReplacementDefinition = + new PropertyReplacementDefinition(notUsedId, dtoType, propertyName); + List<? extends IdDto> idDtos = maxAllUsages.get(dtoType); + List<String> ids = Lists.transform(idDtos, IdDtos.getIdFunction()); + refToUpdate.putAll(propertyReplacementDefinition, ids); + + } + + service.updateReferentiel(refToUpdate); + + DtoMap oldCountryUsages = referentialService.findAllUsages(oldCountry); + Assert.assertEquals(0, oldCountryUsages.size()); + + CountryDto newCountry = referentialService.loadToRead(CountryDto.class, notUsedId).getForm(); + DtoMap newCountryUsages = referentialService.findAllUsages(newCountry); + Assert.assertEquals(maxAllUsages.size(), newCountryUsages.size()); + Assert.assertEquals(maxAllUsages.totalSize(), newCountryUsages.totalSize()); + Assert.assertEquals(maxAllUsages, newCountryUsages); + + } + } -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@list.forge.codelutin.com>.
participants (1)
-
codelutin.com scm