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