Tony CHEMIT pushed to branch develop at ultreiaio / ird-observe
Commits:
-
93b95077
by Tony Chemit at 2020-05-15T11:01:52+02:00
-
1ae23adb
by Tony Chemit at 2020-05-15T11:15:21+02:00
-
b3e8d3f6
by Tony Chemit at 2020-05-15T11:17:06+02:00
9 changed files:
- client-datasource-actions/src/main/java/fr/ird/observe/client/datasource/actions/AdminUIHandler.java
- services-local/src/main/java/fr/ird/observe/services/local/service/actions/synchro/referential/legacy/UnidirectionalReferentialSynchronizeLocalServiceLocal.java
- services-local/src/main/java/fr/ird/observe/services/local/service/actions/synchro/referential/ng/ReferentialSynchronizeSqlListRequestBuilder.java
- services-local/src/main/java/fr/ird/observe/services/local/service/actions/synchro/referential/sql/InsertSqlGenerator.java
- services-local/src/main/java/fr/ird/observe/services/local/service/actions/synchro/referential/sql/InsertSqlStatementGenerator.java
- services-local/src/main/java/fr/ird/observe/services/local/service/actions/synchro/referential/sql/InsertSqlWithCascadeStatementGenerator.java
- services-local/src/main/java/fr/ird/observe/services/local/service/actions/synchro/referential/sql/UpdateSqlStatementGenerator.java
- services-local/src/main/java/fr/ird/observe/services/local/service/actions/synchro/referential/sql/UpdateSqlWithCascadeStatementGenerator.java
- + services-local/src/main/java/fr/ird/observe/services/local/service/actions/synchro/referential/sql/WithCascadeStatementGenerator.java
Changes:
| ... | ... | @@ -272,9 +272,7 @@ public class AdminUIHandler implements UIHandler<AdminUI>, WithClientUIContext { |
| 272 | 272 |
|
| 273 | 273 |
if (ui.getModel().getStepState(AdminStep.SAVE_LOCAL) == WizardState.PENDING) {
|
| 274 | 274 |
SaveLocalUI tabUI = (SaveLocalUI) ui.getStepUI(AdminStep.SAVE_LOCAL);
|
| 275 |
- if (tabUI.getStepModel().isLocalSourceNeedSave()) {
|
|
| 276 |
- SwingUtilities.invokeLater(tabUI.getStart()::doClick);
|
|
| 277 |
- } else {
|
|
| 275 |
+ if (!tabUI.getStepModel().isLocalSourceNeedSave()) {
|
|
| 278 | 276 |
SwingUtilities.invokeLater(tabUI.getContinueAction()::doClick);
|
| 279 | 277 |
}
|
| 280 | 278 |
}
|
| ... | ... | @@ -41,10 +41,12 @@ import fr.ird.observe.services.local.service.actions.synchro.referential.sql.Upd |
| 41 | 41 |
import fr.ird.observe.services.service.LastUpdateDateService;
|
| 42 | 42 |
import fr.ird.observe.services.service.actions.synchro.referential.legacy.UnidirectionalReferentialSynchronizeLocalService;
|
| 43 | 43 |
import fr.ird.observe.services.service.actions.synchro.referential.legacy.UnidirectionalReferentialSynchronizeRequest;
|
| 44 |
+import fr.ird.observe.services.service.usage.DtoUsageCountRequest;
|
|
| 45 |
+import fr.ird.observe.services.service.usage.DtoUsageCountResult;
|
|
| 46 |
+import fr.ird.observe.services.service.usage.UsageService;
|
|
| 44 | 47 |
import fr.ird.observe.spi.DbModelHelper;
|
| 45 | 48 |
import fr.ird.observe.spi.context.ReferentialDtoEntityContext;
|
| 46 | 49 |
import org.nuiton.topia.persistence.TopiaDao;
|
| 47 |
-import org.nuiton.topia.persistence.TopiaEntity;
|
|
| 48 | 50 |
import org.nuiton.topia.persistence.metadata.TopiaMetadataEntity;
|
| 49 | 51 |
import org.nuiton.topia.persistence.metadata.TopiaMetadataModel;
|
| 50 | 52 |
import org.nuiton.topia.persistence.support.TopiaSqlWork;
|
| ... | ... | @@ -63,19 +65,20 @@ import java.util.Set; |
| 63 | 65 |
public class UnidirectionalReferentialSynchronizeLocalServiceLocal extends ObserveServiceLocal implements UnidirectionalReferentialSynchronizeLocalService {
|
| 64 | 66 |
|
| 65 | 67 |
private LastUpdateDateService lastUpdateDateService;
|
| 68 |
+ private UsageService usageService;
|
|
| 66 | 69 |
|
| 67 | 70 |
@Override
|
| 68 | 71 |
public void setServiceContext(ObserveServiceContextLocal serviceContext) {
|
| 69 | 72 |
super.setServiceContext(serviceContext);
|
| 70 | 73 |
lastUpdateDateService = serviceContext.newService(LastUpdateDateService.class);
|
| 74 |
+ usageService = serviceContext.newService(UsageService.class);
|
|
| 71 | 75 |
}
|
| 72 | 76 |
|
| 73 | 77 |
@Override
|
| 74 | 78 |
public <D extends ReferentialDto> ImmutableSet<String> filterIdsUsedInLocalSource(Class<D> dtoType, ImmutableSet<String> ids) {
|
| 75 |
- Class<? extends ReferentialEntity<D, ?>> entityType = DbModelHelper.fromReferentialDtoWeak(dtoType).toEntityType();
|
|
| 76 | 79 |
Set<String> result = new LinkedHashSet<>();
|
| 77 | 80 |
for (String id : ids) {
|
| 78 |
- int count = countUsage0(entityType, id);
|
|
| 81 |
+ long count = countUsage0(dtoType, id);
|
|
| 79 | 82 |
if (count > 0) {
|
| 80 | 83 |
result.add(id);
|
| 81 | 84 |
}
|
| ... | ... | @@ -101,7 +104,7 @@ public class UnidirectionalReferentialSynchronizeLocalServiceLocal extends Obser |
| 101 | 104 |
TopiaMetadataModel metadataModel = serviceContext.getTopiaApplicationContext().getMetadataModel();
|
| 102 | 105 |
TopiaMetadataEntity metadataEntity = metadataModel.getEntity(referentielName);
|
| 103 | 106 |
if (request.withReferentialToAdd()) {
|
| 104 |
- InsertSqlStatementGenerator<D> sqlStatementGenerator = new InsertSqlStatementGenerator<>(metadataModel, metadataEntity, dtoType);
|
|
| 107 |
+ InsertSqlStatementGenerator sqlStatementGenerator = new InsertSqlStatementGenerator(metadataModel, metadataEntity);
|
|
| 105 | 108 |
ImmutableSet<D> referentialToAdd = request.getReferentialToAdd();
|
| 106 | 109 |
if (ObjectMaterialDto.class.equals(dtoType)) {
|
| 107 | 110 |
// must reorder to be sure to insert parent before sons
|
| ... | ... | @@ -149,15 +152,10 @@ public class UnidirectionalReferentialSynchronizeLocalServiceLocal extends Obser |
| 149 | 152 |
lastUpdateDateService.updateReferentialLastUpdateDates();
|
| 150 | 153 |
}
|
| 151 | 154 |
|
| 152 |
- private <E extends ReferentialEntity<?, ?>> int countUsage0(Class<E> entityType, String id) {
|
|
| 153 |
- TopiaDao<E> dao = getTopiaPersistenceContext().getDao(entityType);
|
|
| 154 |
- E e = dao.forTopiaIdEquals(id).findUnique();
|
|
| 155 |
- Map<Class<? extends TopiaEntity>, List<? extends TopiaEntity>> allUsages = dao.findAllUsages(e);
|
|
| 156 |
- int count = 0;
|
|
| 157 |
- for (List<? extends TopiaEntity> entities : allUsages.values()) {
|
|
| 158 |
- count += entities.size();
|
|
| 159 |
- }
|
|
| 160 |
- return count;
|
|
| 155 |
+ private <D extends ReferentialDto> long countUsage0(Class<D> dtoType, String id) {
|
|
| 156 |
+ DtoUsageCountRequest<D> request = new DtoUsageCountRequest<>(dtoType, id);
|
|
| 157 |
+ DtoUsageCountResult<?> usageCount = usageService.count(request);
|
|
| 158 |
+ return usageCount.getCount().values().stream().reduce(Long::sum).orElse(0L);
|
|
| 161 | 159 |
}
|
| 162 | 160 |
|
| 163 | 161 |
private <E extends ReferentialEntity<D, R>, D extends ReferentialDto, R extends ReferentialDtoReference<D, R>> ReferentialDtoReferenceSet<R> getLocalSourceReferentialToDelete0(Class<E> entityType, Class<R> referenceType, ImmutableSet<String> ids) {
|
| ... | ... | @@ -140,20 +140,13 @@ public class ReferentialSynchronizeSqlListRequestBuilder { |
| 140 | 140 |
private <D extends ReferentialDto, R extends ReferentialDtoReference<D, R>, E extends ReferentialEntity<D, R>> void onAdd(TopiaMetadataEntity metadata, Class<D> dtoType, Class<E> entityType, Set<ReferentialSynchronizeTask> tasks, Multimap<Class<? extends ReferentialDto>, String> newIds) {
|
| 141 | 141 |
|
| 142 | 142 |
List<E> insertEntities = loadEntities(entityType, tasks);
|
| 143 |
- InsertSqlGenerator<D> insertGenerator;
|
|
| 143 |
+ InsertSqlGenerator insertGenerator;
|
|
| 144 | 144 |
if (metadata.withEntities()) {
|
| 145 | 145 |
Multimap<Class<? extends ReferentialDto>, String> allIds = ArrayListMultimap.create(request.getIdsOnlyExistingOnThisSide());
|
| 146 | 146 |
allIds.putAll(newIds);
|
| 147 |
- insertGenerator = new InsertSqlWithCascadeStatementGenerator<D>(metadataModel, metadata, dtoType, allIds) {
|
|
| 148 |
- |
|
| 149 |
- @Override
|
|
| 150 |
- protected <DD extends ReferentialDto> ImmutableList<String> insertMissingReferential(Class<DD> referentialType, String id) {
|
|
| 151 |
- ReferentialDtoEntityContext<DD, ?, ?, ?> modelContext = DbModelHelper.fromReferentialDto(referentialType);
|
|
| 152 |
- return addExtraInsertStatement(modelContext, id);
|
|
| 153 |
- }
|
|
| 154 |
- };
|
|
| 147 |
+ insertGenerator = new InsertSqlWithCascadeStatementGenerator(service, metadataModel, metadata, dtoType, allIds);
|
|
| 155 | 148 |
} else {
|
| 156 |
- insertGenerator = new InsertSqlStatementGenerator<>(metadataModel, metadata, dtoType);
|
|
| 149 |
+ insertGenerator = new InsertSqlStatementGenerator(metadataModel, metadata);
|
|
| 157 | 150 |
}
|
| 158 | 151 |
|
| 159 | 152 |
for (E entity : insertEntities) {
|
| ... | ... | @@ -173,15 +166,7 @@ public class ReferentialSynchronizeSqlListRequestBuilder { |
| 173 | 166 |
if (metadata.withEntities()) {
|
| 174 | 167 |
Multimap<Class<? extends ReferentialDto>, String> allIds = ArrayListMultimap.create(request.getIdsOnlyExistingOnThisSide());
|
| 175 | 168 |
allIds.putAll(newIds);
|
| 176 |
- updateGenerator = new UpdateSqlWithCascadeStatementGenerator<D>(metadataModel, metadata, request.getIdsOnlyExistingOnThisSide()) {
|
|
| 177 |
- |
|
| 178 |
- @Override
|
|
| 179 |
- protected <DD extends ReferentialDto> ImmutableList<String> insertMissingReferential(Class<DD> referentialType, String id) {
|
|
| 180 |
- ReferentialDtoEntityContext<DD, ?, ?, ?> modelContext = DbModelHelper.fromReferentialDto(referentialType);
|
|
| 181 |
- return addExtraInsertStatement(modelContext, id);
|
|
| 182 |
- }
|
|
| 183 |
- };
|
|
| 184 |
- |
|
| 169 |
+ updateGenerator = new UpdateSqlWithCascadeStatementGenerator(service, metadataModel, metadata, request.getIdsOnlyExistingOnThisSide());
|
|
| 185 | 170 |
} else {
|
| 186 | 171 |
updateGenerator = new UpdateSqlStatementGenerator(metadataModel, metadata);
|
| 187 | 172 |
}
|
| ... | ... | @@ -256,7 +241,6 @@ public class ReferentialSynchronizeSqlListRequestBuilder { |
| 256 | 241 |
}
|
| 257 | 242 |
}
|
| 258 | 243 |
|
| 259 |
- |
|
| 260 | 244 |
private <D extends ReferentialDto> void onDeactivateWithReplacement(TopiaMetadataEntity metadata, Class<D> dtoType, Set<ReferentialSynchronizeTask> tasks) {
|
| 261 | 245 |
|
| 262 | 246 |
ReplaceSqlStatementGenerator replaceGenerator = new ReplaceSqlStatementGenerator(metadataModel, metadata);
|
| ... | ... | @@ -277,18 +261,6 @@ public class ReferentialSynchronizeSqlListRequestBuilder { |
| 277 | 261 |
}
|
| 278 | 262 |
}
|
| 279 | 263 |
|
| 280 |
- private <D extends ReferentialDto, E extends ReferentialEntity<D, ?>> ImmutableList<String> addExtraInsertStatement(ReferentialDtoEntityContext<D, ?, E, ?> binder, String id) {
|
|
| 281 |
- |
|
| 282 |
- Class<E> entityType = binder.toEntityType();
|
|
| 283 |
- Class<D> dtoType = binder.toDtoType();
|
|
| 284 |
- String referentialName = ObserveEntityEnum.valueOf(entityType).name();
|
|
| 285 |
- TopiaMetadataEntity metadata = metadataModel.getEntity(referentialName);
|
|
| 286 |
- |
|
| 287 |
- InsertSqlStatementGenerator<D> insertGenerator = new InsertSqlStatementGenerator<>(metadataModel, metadata, dtoType);
|
|
| 288 |
- D referential = service.loadEntityToReferentialDto(binder, id);
|
|
| 289 |
- return insertGenerator.generateSql(referential);
|
|
| 290 |
- }
|
|
| 291 |
- |
|
| 292 | 264 |
private <E extends ReferentialEntity> List<E> loadEntities(Class<E> entityType, Set<ReferentialSynchronizeTask> tasks) {
|
| 293 | 265 |
Set<String> ids = tasks.stream().map(ReferentialSynchronizeTask::getReferentialId).collect(Collectors.toSet());
|
| 294 | 266 |
return service.getTopiaPersistenceContext().loadEntities(entityType, ids);
|
| ... | ... | @@ -29,7 +29,7 @@ import fr.ird.observe.dto.referential.ReferentialDto; |
| 29 | 29 |
* @author Tony Chemit - dev@tchemit.fr
|
| 30 | 30 |
* @since ?
|
| 31 | 31 |
*/
|
| 32 |
-public interface InsertSqlGenerator<D extends ReferentialDto> {
|
|
| 32 |
+public interface InsertSqlGenerator {
|
|
| 33 | 33 |
|
| 34 |
- ImmutableList<String> generateSql(D referentialDto);
|
|
| 34 |
+ ImmutableList<String> generateSql(ReferentialDto referentialDto);
|
|
| 35 | 35 |
}
|
| ... | ... | @@ -48,7 +48,7 @@ import java.util.Set; |
| 48 | 48 |
*
|
| 49 | 49 |
* @author Tony Chemit - dev@tchemit.fr
|
| 50 | 50 |
*/
|
| 51 |
-public class InsertSqlStatementGenerator<D extends ReferentialDto> implements InsertSqlGenerator<D> {
|
|
| 51 |
+public class InsertSqlStatementGenerator implements InsertSqlGenerator {
|
|
| 52 | 52 |
|
| 53 | 53 |
private final TopiaMetadataEntity metadataEntity;
|
| 54 | 54 |
private final Set<TopiaMetadataComposition> compositions;
|
| ... | ... | @@ -61,7 +61,7 @@ public class InsertSqlStatementGenerator<D extends ReferentialDto> implements In |
| 61 | 61 |
private final Set<String> primitiveLongPropertyNames;
|
| 62 | 62 |
private final Set<String> primitiveFloatPropertyNames;
|
| 63 | 63 |
|
| 64 |
- public InsertSqlStatementGenerator(TopiaMetadataModel topiaMetadataModel, TopiaMetadataEntity metadataEntity, Class<D> dtoType) {
|
|
| 64 |
+ public InsertSqlStatementGenerator(TopiaMetadataModel topiaMetadataModel, TopiaMetadataEntity metadataEntity) {
|
|
| 65 | 65 |
this.metadataEntity = Objects.requireNonNull(metadataEntity);
|
| 66 | 66 |
this.compositions = topiaMetadataModel.getCompositions(this.metadataEntity);
|
| 67 | 67 |
this.associations = topiaMetadataModel.getAssociations(this.metadataEntity);
|
| ... | ... | @@ -79,7 +79,7 @@ public class InsertSqlStatementGenerator<D extends ReferentialDto> implements In |
| 79 | 79 |
|
| 80 | 80 |
@SuppressWarnings("unchecked")
|
| 81 | 81 |
@Override
|
| 82 |
- public ImmutableList<String> generateSql(D referentialDto) {
|
|
| 82 |
+ public ImmutableList<String> generateSql(ReferentialDto referentialDto) {
|
|
| 83 | 83 |
|
| 84 | 84 |
ImmutableList.Builder<String> result = ImmutableList.builder();
|
| 85 | 85 |
|
| ... | ... | @@ -152,22 +152,27 @@ public class InsertSqlStatementGenerator<D extends ReferentialDto> implements In |
| 152 | 152 |
for (TopiaMetadataAssociation association : associations) {
|
| 153 | 153 |
|
| 154 | 154 |
Collection<ReferentialDtoReference<?, ?>> associationValues = referentialDto.get(association.getTargetPropertyName());
|
| 155 |
- for (ReferentialDtoReference<?, ?> associationValue : associationValues) {
|
|
| 156 |
- String insertAssocationSql = TopiaSqlStatements.generateAssociationInsertStatement(association, id, associationValue.getId());
|
|
| 157 |
- result.add(TopiaSqlStatements.boxAssociationStatement(insertAssocationSql));
|
|
| 155 |
+ for (@SuppressWarnings("rawtypes") ReferentialDtoReference associationValue : associationValues) {
|
|
| 156 |
+ addAssociation(association, id, associationValue, result);
|
|
| 158 | 157 |
}
|
| 159 | 158 |
}
|
| 160 | 159 |
return result.build();
|
| 160 |
+ }
|
|
| 161 | 161 |
|
| 162 |
+ protected <DD extends ReferentialDto, RR extends ReferentialDtoReference<DD, RR>> void addAssociation(TopiaMetadataAssociation association,
|
|
| 163 |
+ String sourceId,
|
|
| 164 |
+ RR associationValue,
|
|
| 165 |
+ ImmutableList.Builder<String> builder) {
|
|
| 166 |
+ String insertSql = TopiaSqlStatements.generateAssociationInsertStatement(association, sourceId, associationValue.getId());
|
|
| 167 |
+ builder.add(TopiaSqlStatements.boxAssociationStatement(insertSql));
|
|
| 162 | 168 |
}
|
| 163 | 169 |
|
| 170 |
+ protected <DD extends ReferentialDto, RR extends ReferentialDtoReference<DD, RR>> void addReferentialReferenceParameter(RR parameter, List<String> parameters, ImmutableList.Builder<String> result) {
|
|
| 171 |
+ addStringParameter(parameter.getId(), parameters);
|
|
| 172 |
+ }
|
|
| 164 | 173 |
|
| 165 |
- <DD extends ReferentialDto, RR extends ReferentialDtoReference<DD, RR>> void addAssociation(TopiaMetadataAssociation association,
|
|
| 166 |
- String sourceId,
|
|
| 167 |
- RR associationValue,
|
|
| 168 |
- ImmutableList.Builder<String> builder) {
|
|
| 169 |
- String insertAssocationSql = TopiaSqlStatements.generateAssociationInsertStatement(association, sourceId, associationValue.getId());
|
|
| 170 |
- builder.add(TopiaSqlStatements.boxAssociationStatement(insertAssocationSql));
|
|
| 174 |
+ protected <DD extends ReferentialDto> void addReferentialDtoParameter(DD parameter, List<String> parameters, ImmutableList.Builder<String> result) {
|
|
| 175 |
+ addStringParameter(parameter.getId(), parameters);
|
|
| 171 | 176 |
}
|
| 172 | 177 |
|
| 173 | 178 |
private Set<String> computeColumnNames(TopiaMetadataEntity metadataEntity,
|
| ... | ... | @@ -227,12 +232,4 @@ public class InsertSqlStatementGenerator<D extends ReferentialDto> implements In |
| 227 | 232 |
parameters.add("" + parameter);
|
| 228 | 233 |
}
|
| 229 | 234 |
|
| 230 |
- protected <DD extends ReferentialDto, RR extends ReferentialDtoReference<DD, RR>> void addReferentialReferenceParameter(RR parameter, List<String> parameters, ImmutableList.Builder<String> result) {
|
|
| 231 |
- addStringParameter(parameter.getId(), parameters);
|
|
| 232 |
- }
|
|
| 233 |
- |
|
| 234 |
- protected <DD extends ReferentialDto> void addReferentialDtoParameter(DD parameter, List<String> parameters, ImmutableList.Builder<String> result) {
|
|
| 235 |
- addStringParameter(parameter.getId(), parameters);
|
|
| 236 |
- }
|
|
| 237 |
- |
|
| 238 | 235 |
}
|
| ... | ... | @@ -26,6 +26,7 @@ import com.google.common.collect.ImmutableList; |
| 26 | 26 |
import com.google.common.collect.Multimap;
|
| 27 | 27 |
import fr.ird.observe.dto.reference.ReferentialDtoReference;
|
| 28 | 28 |
import fr.ird.observe.dto.referential.ReferentialDto;
|
| 29 |
+import fr.ird.observe.services.local.service.actions.synchro.referential.ng.ReferentialSynchronizeServiceLocal;
|
|
| 29 | 30 |
import org.nuiton.topia.persistence.metadata.TopiaMetadataAssociation;
|
| 30 | 31 |
import org.nuiton.topia.persistence.metadata.TopiaMetadataEntity;
|
| 31 | 32 |
import org.nuiton.topia.persistence.metadata.TopiaMetadataModel;
|
| ... | ... | @@ -40,62 +41,43 @@ import java.util.List; |
| 40 | 41 |
* @author Tony Chemit - dev@tchemit.fr
|
| 41 | 42 |
* @since 5.0
|
| 42 | 43 |
*/
|
| 43 |
-public abstract class InsertSqlWithCascadeStatementGenerator<D extends ReferentialDto> implements InsertSqlGenerator<D>{
|
|
| 44 |
+public class InsertSqlWithCascadeStatementGenerator extends WithCascadeStatementGenerator implements InsertSqlGenerator {
|
|
| 44 | 45 |
|
| 45 |
- private final InsertSqlStatementGenerator<D> delegateGenerator;
|
|
| 46 |
- private final Multimap<Class<? extends ReferentialDto>, String> idsOnlyExistingOnThisSide;
|
|
| 46 |
+ private final InsertSqlStatementGenerator delegateGenerator;
|
|
| 47 | 47 |
|
| 48 |
- protected InsertSqlWithCascadeStatementGenerator(TopiaMetadataModel topiaMetadataModel, TopiaMetadataEntity metadataEntity,
|
|
| 49 |
- Class<D> dtoType,
|
|
| 48 |
+ public InsertSqlWithCascadeStatementGenerator(ReferentialSynchronizeServiceLocal service,
|
|
| 49 |
+ TopiaMetadataModel topiaMetadataModel,
|
|
| 50 |
+ TopiaMetadataEntity metadataEntity,
|
|
| 51 |
+ Class<? extends ReferentialDto> dtoType,
|
|
| 50 | 52 |
Multimap<Class<? extends ReferentialDto>, String> idsOnlyExistingOnThisSide) {
|
| 51 |
- this.idsOnlyExistingOnThisSide = idsOnlyExistingOnThisSide;
|
|
| 52 |
- this.delegateGenerator = new InsertSqlStatementGenerator<D>(topiaMetadataModel, metadataEntity, dtoType) {
|
|
| 53 |
- |
|
| 53 |
+ super(service, topiaMetadataModel);
|
|
| 54 |
+ this.delegateGenerator = new InsertSqlStatementGenerator(topiaMetadataModel, metadataEntity) {
|
|
| 54 | 55 |
@Override
|
| 55 |
- <DD extends ReferentialDto, RR extends ReferentialDtoReference<DD, RR>> void addAssociation(TopiaMetadataAssociation association,
|
|
| 56 |
- String sourceId,
|
|
| 57 |
- RR associationValue,
|
|
| 58 |
- ImmutableList.Builder<String> builder) {
|
|
| 56 |
+ protected <DD extends ReferentialDto, RR extends ReferentialDtoReference<DD, RR>> void addAssociation(TopiaMetadataAssociation association,
|
|
| 57 |
+ String sourceId,
|
|
| 58 |
+ RR associationValue,
|
|
| 59 |
+ ImmutableList.Builder<String> builder) {
|
|
| 59 | 60 |
super.addAssociation(association, sourceId, associationValue, builder);
|
| 60 |
- addMissingReferentialIfNecessary(associationValue.getDtoType(), associationValue.getId(), builder);
|
|
| 61 |
+ addMissingReferentialIfNecessary(idsOnlyExistingOnThisSide, associationValue.getDtoType(), associationValue.getId(), builder);
|
|
| 61 | 62 |
}
|
| 62 | 63 |
|
| 63 | 64 |
@Override
|
| 64 |
- protected <DD extends ReferentialDto, RR extends ReferentialDtoReference<DD, RR>> void addReferentialReferenceParameter(RR parameter, List<String> parameters, ImmutableList.Builder<String> result) {
|
|
| 65 |
- super.addReferentialReferenceParameter(parameter, parameters, result);
|
|
| 66 |
- addMissingReferentialIfNecessary(parameter.getDtoType(), parameter.getId(), result);
|
|
| 65 |
+ protected <DD extends ReferentialDto, RR extends ReferentialDtoReference<DD, RR>> void addReferentialReferenceParameter(RR parameter, List<String> parameters, ImmutableList.Builder<String> builder) {
|
|
| 66 |
+ super.addReferentialReferenceParameter(parameter, parameters, builder);
|
|
| 67 |
+ addMissingReferentialIfNecessary(idsOnlyExistingOnThisSide, parameter.getDtoType(), parameter.getId(), builder);
|
|
| 67 | 68 |
}
|
| 68 | 69 |
|
| 69 | 70 |
@Override
|
| 70 |
- protected <DD extends ReferentialDto> void addReferentialDtoParameter(DD parameter, List<String> parameters, ImmutableList.Builder<String> result) {
|
|
| 71 |
- super.addReferentialDtoParameter(parameter, parameters, result);
|
|
| 72 |
- addMissingReferentialIfNecessary(dtoType, parameter.getId(), result);
|
|
| 71 |
+ protected <DD extends ReferentialDto> void addReferentialDtoParameter(DD parameter, List<String> parameters, ImmutableList.Builder<String> builder) {
|
|
| 72 |
+ super.addReferentialDtoParameter(parameter, parameters, builder);
|
|
| 73 |
+ addMissingReferentialIfNecessary(idsOnlyExistingOnThisSide, dtoType, parameter.getId(), builder);
|
|
| 73 | 74 |
}
|
| 74 | 75 |
};
|
| 75 | 76 |
}
|
| 76 | 77 |
|
| 77 |
- protected abstract <DD extends ReferentialDto> ImmutableList<String> insertMissingReferential(Class<DD> referentialType, String id);
|
|
| 78 |
- |
|
| 79 | 78 |
@Override
|
| 80 |
- public ImmutableList<String> generateSql(D referentialDto) {
|
|
| 81 |
- |
|
| 79 |
+ public ImmutableList<String> generateSql(ReferentialDto referentialDto) {
|
|
| 82 | 80 |
return delegateGenerator.generateSql(referentialDto);
|
| 83 |
- |
|
| 84 |
- }
|
|
| 85 |
- |
|
| 86 |
- private <DD extends ReferentialDto> void addMissingReferentialIfNecessary(Class<DD> associationType, String associationId, ImmutableList.Builder<String> builder) {
|
|
| 87 |
- |
|
| 88 |
- if (idsOnlyExistingOnThisSide.containsEntry(associationType, associationId)) {
|
|
| 89 |
- |
|
| 90 |
- // il faut insérer aussi ce référentiel
|
|
| 91 |
- ImmutableList<String> sql = insertMissingReferential(associationType, associationId);
|
|
| 92 |
- |
|
| 93 |
- builder.addAll(sql);
|
|
| 94 |
- |
|
| 95 |
- // ce référentiel est désormais présent dans les deux sources
|
|
| 96 |
- idsOnlyExistingOnThisSide.remove(associationType, associationId);
|
|
| 97 |
- |
|
| 98 |
- }
|
|
| 99 | 81 |
}
|
| 100 | 82 |
|
| 101 | 83 |
}
|
| ... | ... | @@ -208,14 +208,22 @@ public class UpdateSqlStatementGenerator implements UpdateSqlGenerator { |
| 208 | 208 |
return result.build();
|
| 209 | 209 |
}
|
| 210 | 210 |
|
| 211 |
- <DD extends ReferentialDto, RR extends ReferentialDtoReference<DD, RR>> void addAssociation(TopiaMetadataAssociation association,
|
|
| 212 |
- String sourceId,
|
|
| 213 |
- RR associationValue,
|
|
| 214 |
- ImmutableList.Builder<String> builder) {
|
|
| 211 |
+ protected <DD extends ReferentialDto, RR extends ReferentialDtoReference<DD, RR>> void addAssociation(TopiaMetadataAssociation association,
|
|
| 212 |
+ String sourceId,
|
|
| 213 |
+ RR associationValue,
|
|
| 214 |
+ ImmutableList.Builder<String> builder) {
|
|
| 215 | 215 |
String insertSql = TopiaSqlStatements.generateAssociationInsertStatement(association, sourceId, associationValue.getId());
|
| 216 | 216 |
builder.add(TopiaSqlStatements.boxAssociationStatement(insertSql));
|
| 217 | 217 |
}
|
| 218 | 218 |
|
| 219 |
+ protected <DD extends ReferentialDto, RR extends ReferentialDtoReference<DD, RR>> void addReferentialReferenceParameter(String columnName, RR parameter, StringBuilder parameters, ImmutableList.Builder<String> result) {
|
|
| 220 |
+ addStringParameter(columnName, parameter.getId(), parameters);
|
|
| 221 |
+ }
|
|
| 222 |
+ |
|
| 223 |
+ protected <DD extends ReferentialDto> void addReferentialDtoParameter(String columnName, DD parameter, StringBuilder parameters, ImmutableList.Builder<String> result) {
|
|
| 224 |
+ addStringParameter(columnName, parameter.getId(), parameters);
|
|
| 225 |
+ }
|
|
| 226 |
+ |
|
| 219 | 227 |
private Map<String, String> computeColumnNames(TopiaMetadataEntity metadataEntity, String[] simplePropertyNames, String[] compositionPropertyNames) {
|
| 220 | 228 |
Map<String, String> columnNames = new TreeMap<>();
|
| 221 | 229 |
|
| ... | ... | @@ -252,14 +260,6 @@ public class UpdateSqlStatementGenerator implements UpdateSqlGenerator { |
| 252 | 260 |
addParameter0(columnName, "" + parameter, parameters);
|
| 253 | 261 |
}
|
| 254 | 262 |
|
| 255 |
- protected <DD extends ReferentialDto, RR extends ReferentialDtoReference<DD, RR>> void addReferentialReferenceParameter(String columnName, RR parameter, StringBuilder parameters, ImmutableList.Builder<String> result) {
|
|
| 256 |
- addStringParameter(columnName, parameter.getId(), parameters);
|
|
| 257 |
- }
|
|
| 258 |
- |
|
| 259 |
- protected <DD extends ReferentialDto> void addReferentialDtoParameter(String columnName, DD parameter, StringBuilder parameters, ImmutableList.Builder<String> result) {
|
|
| 260 |
- addStringParameter(columnName, parameter.getId(), parameters);
|
|
| 261 |
- }
|
|
| 262 |
- |
|
| 263 | 263 |
private void addParameter0(String columnName, String value, StringBuilder parameters) {
|
| 264 | 264 |
parameters.append(", ").append(columnName).append(" = ").append(value);
|
| 265 | 265 |
}
|
| ... | ... | @@ -27,6 +27,7 @@ import com.google.common.collect.ImmutableSet; |
| 27 | 27 |
import com.google.common.collect.Multimap;
|
| 28 | 28 |
import fr.ird.observe.dto.reference.ReferentialDtoReference;
|
| 29 | 29 |
import fr.ird.observe.dto.referential.ReferentialDto;
|
| 30 |
+import fr.ird.observe.services.local.service.actions.synchro.referential.ng.ReferentialSynchronizeServiceLocal;
|
|
| 30 | 31 |
import org.nuiton.topia.persistence.metadata.TopiaMetadataAssociation;
|
| 31 | 32 |
import org.nuiton.topia.persistence.metadata.TopiaMetadataEntity;
|
| 32 | 33 |
import org.nuiton.topia.persistence.metadata.TopiaMetadataModel;
|
| ... | ... | @@ -41,58 +42,41 @@ import java.util.Date; |
| 41 | 42 |
* @author Tony Chemit - dev@tchemit.fr
|
| 42 | 43 |
* @since 5.0
|
| 43 | 44 |
*/
|
| 44 |
-public abstract class UpdateSqlWithCascadeStatementGenerator<D extends ReferentialDto> implements UpdateSqlGenerator {
|
|
| 45 |
+public class UpdateSqlWithCascadeStatementGenerator extends WithCascadeStatementGenerator implements UpdateSqlGenerator {
|
|
| 45 | 46 |
|
| 46 | 47 |
private final UpdateSqlStatementGenerator delegateGenerator;
|
| 47 |
- private final Multimap<Class<? extends ReferentialDto>, String> idsOnlyExistingOnThisSide;
|
|
| 48 | 48 |
|
| 49 |
- protected UpdateSqlWithCascadeStatementGenerator(TopiaMetadataModel topiaMetadataModel,
|
|
| 50 |
- TopiaMetadataEntity metadataEntity,
|
|
| 51 |
- Multimap<Class<? extends ReferentialDto>, String> idsOnlyExistingOnThisSide) {
|
|
| 52 |
- this.idsOnlyExistingOnThisSide = idsOnlyExistingOnThisSide;
|
|
| 49 |
+ public UpdateSqlWithCascadeStatementGenerator(ReferentialSynchronizeServiceLocal service,
|
|
| 50 |
+ TopiaMetadataModel topiaMetadataModel,
|
|
| 51 |
+ TopiaMetadataEntity metadataEntity,
|
|
| 52 |
+ Multimap<Class<? extends ReferentialDto>, String> idsOnlyExistingOnThisSide) {
|
|
| 53 |
+ super(service, topiaMetadataModel);
|
|
| 53 | 54 |
this.delegateGenerator = new UpdateSqlStatementGenerator(topiaMetadataModel, metadataEntity) {
|
| 54 |
- |
|
| 55 |
- |
|
| 56 |
- <DD extends ReferentialDto, RR extends ReferentialDtoReference<DD, RR>> void addAssociation(TopiaMetadataAssociation association,
|
|
| 57 |
- String sourceId,
|
|
| 58 |
- RR associationValue,
|
|
| 59 |
- ImmutableList.Builder<String> builder) {
|
|
| 55 |
+ @Override
|
|
| 56 |
+ protected <DD extends ReferentialDto, RR extends ReferentialDtoReference<DD, RR>> void addAssociation(TopiaMetadataAssociation association,
|
|
| 57 |
+ String sourceId,
|
|
| 58 |
+ RR associationValue,
|
|
| 59 |
+ ImmutableList.Builder<String> builder) {
|
|
| 60 | 60 |
super.addAssociation(association, sourceId, associationValue, builder);
|
| 61 |
- addMissingReferentialIfNecessary(associationValue.getDtoType(), associationValue.getId(), builder);
|
|
| 61 |
+ addMissingReferentialIfNecessary(idsOnlyExistingOnThisSide, associationValue.getDtoType(), associationValue.getId(), builder);
|
|
| 62 | 62 |
}
|
| 63 | 63 |
|
| 64 | 64 |
@Override
|
| 65 |
- protected <DD extends ReferentialDto, RR extends ReferentialDtoReference<DD, RR>> void addReferentialReferenceParameter(String columnName, RR parameter, StringBuilder parameters, ImmutableList.Builder<String> result) {
|
|
| 66 |
- super.addReferentialReferenceParameter(columnName, parameter, parameters, result);
|
|
| 67 |
- addMissingReferentialIfNecessary(parameter.getDtoType(), parameter.getId(), result);
|
|
| 65 |
+ protected <DD extends ReferentialDto, RR extends ReferentialDtoReference<DD, RR>> void addReferentialReferenceParameter(String columnName, RR parameter, StringBuilder parameters, ImmutableList.Builder<String> builder) {
|
|
| 66 |
+ super.addReferentialReferenceParameter(columnName, parameter, parameters, builder);
|
|
| 67 |
+ addMissingReferentialIfNecessary(idsOnlyExistingOnThisSide, parameter.getDtoType(), parameter.getId(), builder);
|
|
| 68 | 68 |
}
|
| 69 | 69 |
|
| 70 | 70 |
@Override
|
| 71 |
- protected <DD extends ReferentialDto> void addReferentialDtoParameter(String columnName, DD parameter, StringBuilder parameters, ImmutableList.Builder<String> result) {
|
|
| 72 |
- super.addReferentialDtoParameter(columnName, parameter, parameters, result);
|
|
| 73 |
- addMissingReferentialIfNecessary(parameter.getClass(), parameter.getId(), result);
|
|
| 71 |
+ protected <DD extends ReferentialDto> void addReferentialDtoParameter(String columnName, DD parameter, StringBuilder parameters, ImmutableList.Builder<String> builder) {
|
|
| 72 |
+ super.addReferentialDtoParameter(columnName, parameter, parameters, builder);
|
|
| 73 |
+ addMissingReferentialIfNecessary(idsOnlyExistingOnThisSide, parameter.getClass(), parameter.getId(), builder);
|
|
| 74 | 74 |
}
|
| 75 | 75 |
};
|
| 76 | 76 |
}
|
| 77 | 77 |
|
| 78 |
- protected abstract <DD extends ReferentialDto> ImmutableList<String> insertMissingReferential(Class<DD> referentialType, String id);
|
|
| 79 |
- |
|
| 80 | 78 |
@Override
|
| 81 | 79 |
public ImmutableList<String> generateSql(ReferentialDto referentialDto, ImmutableSet<String> properties, Date lastUpdateDate) {
|
| 82 | 80 |
return delegateGenerator.generateSql(referentialDto, properties, lastUpdateDate);
|
| 83 | 81 |
}
|
| 84 |
- |
|
| 85 |
- private <DD extends ReferentialDto> void addMissingReferentialIfNecessary(Class<DD> associationType, String associationId, ImmutableList.Builder<String> result) {
|
|
| 86 |
- |
|
| 87 |
- if (idsOnlyExistingOnThisSide.containsEntry(associationType, associationId)) {
|
|
| 88 |
- |
|
| 89 |
- // il faut insérer aussi ce référentiel
|
|
| 90 |
- ImmutableList<String> sqlList = insertMissingReferential(associationType, associationId);
|
|
| 91 |
- result.addAll(sqlList);
|
|
| 92 |
- // ce référentiel est désormais présent dans les deux sources
|
|
| 93 |
- idsOnlyExistingOnThisSide.remove(associationType, associationId);
|
|
| 94 |
- |
|
| 95 |
- }
|
|
| 96 |
- }
|
|
| 97 |
- |
|
| 98 | 82 |
}
|
| 1 |
+package fr.ird.observe.services.local.service.actions.synchro.referential.sql;
|
|
| 2 |
+ |
|
| 3 |
+/*-
|
|
| 4 |
+ * #%L
|
|
| 5 |
+ * ObServe :: Services local
|
|
| 6 |
+ * %%
|
|
| 7 |
+ * Copyright (C) 2008 - 2020 IRD, Code Lutin, Ultreia.io
|
|
| 8 |
+ * %%
|
|
| 9 |
+ * This program is free software: you can redistribute it and/or modify
|
|
| 10 |
+ * it under the terms of the GNU General Public License as
|
|
| 11 |
+ * published by the Free Software Foundation, either version 3 of the
|
|
| 12 |
+ * License, or (at your option) any later version.
|
|
| 13 |
+ *
|
|
| 14 |
+ * This program is distributed in the hope that it will be useful,
|
|
| 15 |
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
| 16 |
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
| 17 |
+ * GNU General Public License for more details.
|
|
| 18 |
+ *
|
|
| 19 |
+ * You should have received a copy of the GNU General Public
|
|
| 20 |
+ * License along with this program. If not, see
|
|
| 21 |
+ * <http://www.gnu.org/licenses/gpl-3.0.html>.
|
|
| 22 |
+ * #L%
|
|
| 23 |
+ */
|
|
| 24 |
+ |
|
| 25 |
+import com.google.common.collect.ImmutableList;
|
|
| 26 |
+import com.google.common.collect.Multimap;
|
|
| 27 |
+import fr.ird.observe.dto.reference.ReferentialDtoReference;
|
|
| 28 |
+import fr.ird.observe.dto.referential.ReferentialDto;
|
|
| 29 |
+import fr.ird.observe.entities.ObserveEntityEnum;
|
|
| 30 |
+import fr.ird.observe.entities.referential.ReferentialEntity;
|
|
| 31 |
+import fr.ird.observe.services.local.service.actions.synchro.referential.ng.ReferentialSynchronizeServiceLocal;
|
|
| 32 |
+import fr.ird.observe.spi.DbModelHelper;
|
|
| 33 |
+import fr.ird.observe.spi.context.ReferentialDtoEntityContext;
|
|
| 34 |
+import org.nuiton.topia.persistence.metadata.TopiaMetadataEntity;
|
|
| 35 |
+import org.nuiton.topia.persistence.metadata.TopiaMetadataModel;
|
|
| 36 |
+ |
|
| 37 |
+/**
|
|
| 38 |
+ * Support statement generator when a cascade can be done on adding new referential.
|
|
| 39 |
+ *
|
|
| 40 |
+ * @author Tony Chemit - dev@tchemit.fr
|
|
| 41 |
+ * @since 8.0
|
|
| 42 |
+ */
|
|
| 43 |
+public abstract class WithCascadeStatementGenerator {
|
|
| 44 |
+ |
|
| 45 |
+ private final ReferentialSynchronizeServiceLocal service;
|
|
| 46 |
+ private final TopiaMetadataModel metadataModel;
|
|
| 47 |
+ |
|
| 48 |
+ protected WithCascadeStatementGenerator(ReferentialSynchronizeServiceLocal service, TopiaMetadataModel metadataModel) {
|
|
| 49 |
+ this.service = service;
|
|
| 50 |
+ this.metadataModel = metadataModel;
|
|
| 51 |
+ }
|
|
| 52 |
+ |
|
| 53 |
+ public <D extends ReferentialDto> void addMissingReferentialIfNecessary(Multimap<Class<? extends ReferentialDto>, String> idsOnlyExistingOnThisSide, Class<D> associationType, String associationId, ImmutableList.Builder<String> builder) {
|
|
| 54 |
+ |
|
| 55 |
+ if (idsOnlyExistingOnThisSide.containsEntry(associationType, associationId)) {
|
|
| 56 |
+ // need to add this referential on this other side
|
|
| 57 |
+ ImmutableList<String> sqlList = insertMissingReferential(associationType, associationId);
|
|
| 58 |
+ builder.addAll(sqlList);
|
|
| 59 |
+ // now this referential is on both side
|
|
| 60 |
+ idsOnlyExistingOnThisSide.remove(associationType, associationId);
|
|
| 61 |
+ }
|
|
| 62 |
+ }
|
|
| 63 |
+ |
|
| 64 |
+ protected <D extends ReferentialDto, R extends ReferentialDtoReference<D, R>, E extends ReferentialEntity<D, R>> ImmutableList<String> insertMissingReferential(Class<D> referentialType, String id) {
|
|
| 65 |
+ ReferentialDtoEntityContext<D, R, E, ?> modelContext = DbModelHelper.fromReferentialDto(referentialType);
|
|
| 66 |
+ |
|
| 67 |
+ Class<E> entityType = modelContext.toEntityType();
|
|
| 68 |
+ String referentialName = ObserveEntityEnum.valueOf(entityType).name();
|
|
| 69 |
+ TopiaMetadataEntity metadata = metadataModel.getEntity(referentialName);
|
|
| 70 |
+ |
|
| 71 |
+ InsertSqlStatementGenerator insertGenerator = new InsertSqlStatementGenerator(metadataModel, metadata);
|
|
| 72 |
+ D referential = service.loadEntityToReferentialDto(modelContext, id);
|
|
| 73 |
+ return insertGenerator.generateSql(referential);
|
|
| 74 |
+ }
|
|
| 75 |
+ |
|
| 76 |
+ |
|
| 77 |
+}
|