Tony CHEMIT pushed to branch develop at ultreiaio / ird-observe
Commits:
-
45db1344
by Tony Chemit at 2021-02-22T20:14:50+01:00
-
1e7bb086
by Tony Chemit at 2021-02-22T21:24:18+01:00
6 changed files:
- .gitlab-ci.yml
- client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/actions/move/MoveRequest.java
- client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/actions/move/MoveRequestBuilder.java
- client/datasource/editor/ll/src/main/java/fr/ird/observe/client/datasource/editor/ll/data/logbook/ActivitySampleUIModel.java
- client/datasource/editor/spi/src/main/java/fr/ird/observe/client/datasource/editor/spi/content/helper/ContentUIModelHelper.java
- services/api-test/src/main/java/fr/ird/observe/services/service/data/OpenableDataServiceFixtures.java
Changes:
| ... | ... | @@ -101,7 +101,7 @@ trigger-make-stage: |
| 101 | 101 |
.automatic: &automatic
|
| 102 | 102 |
only:
|
| 103 | 103 |
- /^develop.*$/i
|
| 104 |
- - /^features/.+$/i
|
|
| 104 |
+ - /^feature/.+$/i
|
|
| 105 | 105 |
except:
|
| 106 | 106 |
- triggers
|
| 107 | 107 |
|
| ... | ... | @@ -155,7 +155,7 @@ release-deploy-demo: |
| 155 | 155 |
.manual: &manual
|
| 156 | 156 |
only:
|
| 157 | 157 |
- /^develop.*$/i
|
| 158 |
- - /^features/.+$/i
|
|
| 158 |
+ - /^feature/.+$/i
|
|
| 159 | 159 |
when: manual
|
| 160 | 160 |
|
| 161 | 161 |
create-docker:
|
| ... | ... | @@ -35,20 +35,13 @@ import java.util.StringJoiner; |
| 35 | 35 |
* @author Tony Chemit - dev@tchemit.fr
|
| 36 | 36 |
* @since 8.0.1
|
| 37 | 37 |
*/
|
| 38 |
+@SuppressWarnings("unchecked")
|
|
| 38 | 39 |
public class MoveRequest {
|
| 39 | 40 |
|
| 40 | 41 |
/**
|
| 41 | 42 |
* Reference type of data to move.
|
| 42 | 43 |
*/
|
| 43 | 44 |
private final Class<? extends DataDtoReference> referenceType;
|
| 44 |
- /**
|
|
| 45 |
- * Reference type of parent data to move.
|
|
| 46 |
- */
|
|
| 47 |
- private final Class<? extends DtoReference> parentReferenceType;
|
|
| 48 |
- /**
|
|
| 49 |
- * Reference type of parent target.
|
|
| 50 |
- */
|
|
| 51 |
- private final Class<? extends DtoReference> parentTargetReferenceType;
|
|
| 52 | 45 |
/**
|
| 53 | 46 |
* Id of parent data to move.
|
| 54 | 47 |
*/
|
| ... | ... | @@ -66,13 +59,11 @@ public class MoveRequest { |
| 66 | 59 |
*/
|
| 67 | 60 |
private final boolean selectTarget;
|
| 68 | 61 |
|
| 69 |
- public MoveRequest(Class<? extends DataDtoReference> referenceType, Class<? extends DtoReference> parentReferenceType, Class<? extends DtoReference> parentTargetReferenceType, String oldParentId, ImmutableSet<String> ids, String newParentId, boolean selectTarget) {
|
|
| 62 |
+ public MoveRequest(Class<? extends DataDtoReference> referenceType, ShortIdDto oldParentId, ImmutableSet<String> ids, ShortIdDto newParentId, boolean selectTarget) {
|
|
| 70 | 63 |
this.referenceType = referenceType;
|
| 71 |
- this.parentReferenceType = parentReferenceType;
|
|
| 72 |
- this.parentTargetReferenceType = parentTargetReferenceType;
|
|
| 73 |
- this.oldParentId = ShortIdDto.of(parentReferenceType, oldParentId);
|
|
| 64 |
+ this.oldParentId = oldParentId;
|
|
| 74 | 65 |
this.ids = ids;
|
| 75 |
- this.newParentId = ShortIdDto.of(parentTargetReferenceType, newParentId);
|
|
| 66 |
+ this.newParentId = newParentId;
|
|
| 76 | 67 |
this.selectTarget = selectTarget;
|
| 77 | 68 |
}
|
| 78 | 69 |
|
| ... | ... | @@ -81,11 +72,11 @@ public class MoveRequest { |
| 81 | 72 |
}
|
| 82 | 73 |
|
| 83 | 74 |
public Class<? extends DtoReference> getParentReferenceType() {
|
| 84 |
- return parentReferenceType;
|
|
| 75 |
+ return (Class<? extends DtoReference>) oldParentId.getType();
|
|
| 85 | 76 |
}
|
| 86 | 77 |
|
| 87 | 78 |
public Class<? extends DtoReference> getParentTargetReferenceType() {
|
| 88 |
- return parentTargetReferenceType;
|
|
| 79 |
+ return (Class<? extends DtoReference>) newParentId.getType();
|
|
| 89 | 80 |
}
|
| 90 | 81 |
|
| 91 | 82 |
public ShortIdDto getOldParentId() {
|
| ... | ... | @@ -30,6 +30,7 @@ import fr.ird.observe.client.datasource.editor.api.content.actions.mode.ChangeMo |
| 30 | 30 |
import fr.ird.observe.client.datasource.editor.api.content.data.open.ContentOpenableUII18nHelper;
|
| 31 | 31 |
import fr.ird.observe.client.datasource.editor.api.content.referential.usage.UsageUIHandlerSupport;
|
| 32 | 32 |
import fr.ird.observe.client.util.UIHelper;
|
| 33 |
+import fr.ird.observe.dto.ShortIdDto;
|
|
| 33 | 34 |
import fr.ird.observe.dto.reference.DataDtoReference;
|
| 34 | 35 |
import fr.ird.observe.dto.reference.DtoReference;
|
| 35 | 36 |
import fr.ird.observe.dto.reference.DtoReferenceCollection;
|
| ... | ... | @@ -85,14 +86,10 @@ public class MoveRequestBuilder { |
| 85 | 86 |
* Reference type of data to move.
|
| 86 | 87 |
*/
|
| 87 | 88 |
private final Class<? extends DataDtoReference> referenceType;
|
| 88 |
- /**
|
|
| 89 |
- * Reference type of parent data to move.
|
|
| 90 |
- */
|
|
| 91 |
- private final Class<? extends DtoReference> parentReferenceType;
|
|
| 92 | 89 |
/**
|
| 93 | 90 |
* Id of parent data to move.
|
| 94 | 91 |
*/
|
| 95 |
- private final String oldParentId;
|
|
| 92 |
+ private final ShortIdDto oldParentId;
|
|
| 96 | 93 |
/**
|
| 97 | 94 |
* Data to delete.
|
| 98 | 95 |
*/
|
| ... | ... | @@ -181,18 +178,17 @@ public class MoveRequestBuilder { |
| 181 | 178 |
}
|
| 182 | 179 |
}
|
| 183 | 180 |
|
| 184 |
- public static StepSetParentCandidates create(Class<? extends DataDtoReference> referenceType, Class<? extends DtoReference> parentReferenceType, String oldParentId, DtoReference id) {
|
|
| 185 |
- return create(referenceType, parentReferenceType, oldParentId, ImmutableSet.of(id));
|
|
| 181 |
+ public static StepSetParentCandidates create(Class<? extends DataDtoReference> referenceType, ShortIdDto oldParentId, DtoReference id) {
|
|
| 182 |
+ return create(referenceType, oldParentId, ImmutableSet.of(id));
|
|
| 186 | 183 |
}
|
| 187 | 184 |
|
| 188 |
- public static StepSetParentCandidates create(Class<? extends DataDtoReference> referenceType, Class<? extends DtoReference> parentReferenceType, String oldParentId, Collection<? extends DtoReference> data) {
|
|
| 189 |
- MoveRequestBuilder builder = new MoveRequestBuilder(referenceType, parentReferenceType, oldParentId, data);
|
|
| 185 |
+ public static StepSetParentCandidates create(Class<? extends DataDtoReference> referenceType, ShortIdDto oldParentId, Collection<? extends DtoReference> data) {
|
|
| 186 |
+ MoveRequestBuilder builder = new MoveRequestBuilder(referenceType, oldParentId, data);
|
|
| 190 | 187 |
return new BuilderImpl(builder);
|
| 191 | 188 |
}
|
| 192 | 189 |
|
| 193 |
- private MoveRequestBuilder(Class<? extends DataDtoReference> referenceType, Class<? extends DtoReference> parentReferenceType, String oldParentId, Collection<? extends DtoReference> data) {
|
|
| 190 |
+ private MoveRequestBuilder(Class<? extends DataDtoReference> referenceType, ShortIdDto oldParentId, Collection<? extends DtoReference> data) {
|
|
| 194 | 191 |
this.referenceType = Objects.requireNonNull(referenceType);
|
| 195 |
- this.parentReferenceType = Objects.requireNonNull(parentReferenceType);
|
|
| 196 | 192 |
this.oldParentId = Objects.requireNonNull(oldParentId);
|
| 197 | 193 |
this.data = Objects.requireNonNull(data);
|
| 198 | 194 |
KeyStroke keyStroke = ObserveKeyStrokesEditorApi.KEY_STROKE_SELECT_TARGET;
|
| ... | ... | @@ -247,9 +243,10 @@ public class MoveRequestBuilder { |
| 247 | 243 |
return this;
|
| 248 | 244 |
}
|
| 249 | 245 |
|
| 246 |
+ @SuppressWarnings("unchecked")
|
|
| 250 | 247 |
public Optional<MoveRequest> build(DataSourceEditor dataSourceEditor) {
|
| 251 | 248 |
if (parentTargetReferenceType == null) {
|
| 252 |
- parentTargetReferenceType = parentReferenceType;
|
|
| 249 |
+ parentTargetReferenceType = (Class<? extends DtoReference>) oldParentId.getType();
|
|
| 253 | 250 |
}
|
| 254 | 251 |
if (askNewParentTitle == null) {
|
| 255 | 252 |
askNewParentTitle = ContentOpenableUII18nHelper.getActionMoveChooseParentTitle(referenceType);
|
| ... | ... | @@ -258,7 +255,7 @@ public class MoveRequestBuilder { |
| 258 | 255 |
askNewParentMessage = ContentOpenableUII18nHelper.getActionMoveChooseParentMessage(referenceType);
|
| 259 | 256 |
}
|
| 260 | 257 |
|
| 261 |
- DtoReferenceCollection<?> parentCandidates = Objects.requireNonNull(this.parentCandidates, "No parent candidates set.").apply(oldParentId);
|
|
| 258 |
+ DtoReferenceCollection<?> parentCandidates = Objects.requireNonNull(this.parentCandidates, "No parent candidates set.").apply(oldParentId.getId());
|
|
| 262 | 259 |
String newParentId = askNewParent(parentCandidates.toList(), askNewParentTitle, askNewParentMessage).orElse(null);
|
| 263 | 260 |
if (newParentId == null) {
|
| 264 | 261 |
return Optional.empty();
|
| ... | ... | @@ -275,7 +272,7 @@ public class MoveRequestBuilder { |
| 275 | 272 |
}
|
| 276 | 273 |
}
|
| 277 | 274 |
}
|
| 278 |
- return Optional.of(new MoveRequest(referenceType, parentReferenceType, parentTargetReferenceType, oldParentId, ids, newParentId, selectTarget.isSelected()));
|
|
| 275 |
+ return Optional.of(new MoveRequest(referenceType, oldParentId, ids, ShortIdDto.of(parentTargetReferenceType, newParentId), selectTarget.isSelected()));
|
|
| 279 | 276 |
}
|
| 280 | 277 |
|
| 281 | 278 |
private <R extends DtoReference> Optional<String> askNewParent(List<R> parentCandidates, String dialogTitle, String dialogMessage) {
|
| ... | ... | @@ -24,7 +24,6 @@ package fr.ird.observe.client.datasource.editor.ll.data.logbook; |
| 24 | 24 |
|
| 25 | 25 |
|
| 26 | 26 |
import fr.ird.observe.client.datasource.editor.api.content.actions.move.MoveRequestBuilder;
|
| 27 |
-import fr.ird.observe.dto.data.ll.logbook.ActivityReference;
|
|
| 28 | 27 |
import fr.ird.observe.dto.data.ll.logbook.ActivitySampleReference;
|
| 29 | 28 |
|
| 30 | 29 |
public class ActivitySampleUIModel extends GeneratedActivitySampleUIModel {
|
| ... | ... | @@ -34,6 +33,6 @@ public class ActivitySampleUIModel extends GeneratedActivitySampleUIModel { |
| 34 | 33 |
}
|
| 35 | 34 |
|
| 36 | 35 |
public MoveRequestBuilder.StepSetParentCandidates toMoveRequest() {
|
| 37 |
- return MoveRequestBuilder.create(ActivitySampleReference.class, ActivityReference.class, getStates().getSelectedParentId(), toReference(getStates().getBean()));
|
|
| 36 |
+ return MoveRequestBuilder.create(ActivitySampleReference.class, getSource().getParentReference().toShortReference(), toReference(getStates().getBean()));
|
|
| 38 | 37 |
}
|
| 39 | 38 |
}
|
| ... | ... | @@ -120,14 +120,14 @@ public class ContentUIModelHelper extends ContentUIHelperSupport { |
| 120 | 120 |
" @Override\n" +
|
| 121 | 121 |
" public MoveRequestBuilder.StepSetParentCandidates toMoveRequest() {\n" +
|
| 122 | 122 |
" return MoveRequestBuilder\n" +
|
| 123 |
- " .create(%1$s.class, %2$s.class, getStates().getSelectedParentId(), toReference(getStates().getBean()))\n" +
|
|
| 123 |
+ " .create(%1$s.class, getSource().getParentReference().toShortReference(), toReference(getStates().getBean()))\n" +
|
|
| 124 | 124 |
" .setEditNode(getSource().getInitializer().getEditNode());\n" +
|
| 125 | 125 |
" }\n\n";
|
| 126 | 126 |
public static final String TO_MOVE_REQUEST_MULTIPLE = "" +
|
| 127 | 127 |
" @Override\n" +
|
| 128 | 128 |
" public MoveRequestBuilder.StepSetParentCandidates toMoveRequest() {\n" +
|
| 129 | 129 |
" return MoveRequestBuilder\n" +
|
| 130 |
- " .create(%1$s.class, %2$s.class, getStates().getSelectedParentId(), getStates().getSelectedDatas())\n" +
|
|
| 130 |
+ " .create(%1$s.class, getSource().getParentReference().toShortReference(), getStates().getSelectedDatas())\n" +
|
|
| 131 | 131 |
" .setEditNode(getSource().getInitializer().getEditNode());\n" +
|
| 132 | 132 |
" }\n\n";
|
| 133 | 133 |
public static final String CREATE_FORM = "" +
|
| ... | ... | @@ -193,14 +193,14 @@ public class ContentUIModelHelper extends ContentUIHelperSupport { |
| 193 | 193 |
extraMethods += String.format(TO_DELETE_REQUEST_MULTIPLE, referenceType.getSimpleName());
|
| 194 | 194 |
imports.add(MoveRequestBuilder.class.getName());
|
| 195 | 195 |
imports.add(generator.scopeBuilder.parentDtoReferenceType.getName());
|
| 196 |
- extraMethods += String.format(TO_MOVE_REQUEST_MULTIPLE, referenceType.getSimpleName(), generator.scopeBuilder.parentDtoReferenceType.getSimpleName());
|
|
| 196 |
+ extraMethods += String.format(TO_MOVE_REQUEST_MULTIPLE, referenceType.getSimpleName());
|
|
| 197 | 197 |
} else if (uiModel == ContentEditUIModel.class) {
|
| 198 | 198 |
extraMethods += String.format(TO_DELETE_REQUEST, referenceType.getSimpleName());
|
| 199 | 199 |
} else if (uiModel == ContentOpenableUIModel.class) {
|
| 200 | 200 |
imports.add(MoveRequestBuilder.class.getName());
|
| 201 | 201 |
extraMethods += String.format(TO_DELETE_REQUEST_WITH_EDIT, referenceType.getSimpleName());
|
| 202 | 202 |
imports.add(generator.scopeBuilder.parentDtoReferenceType.getName());
|
| 203 |
- extraMethods += String.format(TO_MOVE_REQUEST, referenceType.getSimpleName(), generator.scopeBuilder.parentDtoReferenceType.getSimpleName());
|
|
| 203 |
+ extraMethods += String.format(TO_MOVE_REQUEST, referenceType.getSimpleName());
|
|
| 204 | 204 |
}
|
| 205 | 205 |
}
|
| 206 | 206 |
return generate(UI_MODEL_GENERATED, imports, generator.cleanClassName, uiModel, generics, extraMethods);
|
| ... | ... | @@ -87,6 +87,38 @@ public class OpenableDataServiceFixtures { |
| 87 | 87 |
ShortIdDto oldParentId = getIdReference(fixtures, "move.oldParentId");
|
| 88 | 88 |
ShortIdDto newParentId = getIdReference(fixtures, "move.newParentId");
|
| 89 | 89 |
service.move(oldParentId, newParentId, ImmutableSet.of(id));
|
| 90 |
+ |
|
| 91 |
+ // move back to original
|
|
| 92 |
+ service.move(newParentId, oldParentId, ImmutableSet.of(id));
|
|
| 93 |
+ |
|
| 94 |
+ {// try to move them back using bad timestamp (will fail)
|
|
| 95 |
+ ShortIdDto oldParentId2 = oldParentId.of(new Date(0));
|
|
| 96 |
+ try {
|
|
| 97 |
+ service.move(oldParentId2, newParentId, ImmutableSet.of(id));
|
|
| 98 |
+ Assert.fail(String.format("Should got a concurrent modification on move %s", id));
|
|
| 99 |
+ } catch (ConcurrentModificationException e) {
|
|
| 100 |
+ Assert.assertTrue(true);
|
|
| 101 |
+ }
|
|
| 102 |
+ }
|
|
| 103 |
+ {// try to move them back using bad timestamp (will fail)
|
|
| 104 |
+ ShortIdDto newParentId2 = newParentId.of(new Date(0));
|
|
| 105 |
+ try {
|
|
| 106 |
+ service.move(oldParentId, newParentId2, ImmutableSet.of(id));
|
|
| 107 |
+ Assert.fail(String.format("Should got a concurrent modification on move %s", id));
|
|
| 108 |
+ } catch (ConcurrentModificationException e) {
|
|
| 109 |
+ Assert.assertTrue(true);
|
|
| 110 |
+ }
|
|
| 111 |
+ }
|
|
| 112 |
+ {// try to move them back using bad timestamp (will fail)
|
|
| 113 |
+ ShortIdDto oldParentId2 = oldParentId.of(new Date(0));
|
|
| 114 |
+ ShortIdDto newParentId2 = newParentId.of(new Date(0));
|
|
| 115 |
+ try {
|
|
| 116 |
+ service.move(oldParentId2, newParentId2, ImmutableSet.of(id));
|
|
| 117 |
+ Assert.fail(String.format("Should got a concurrent modification on move %s", id));
|
|
| 118 |
+ } catch (ConcurrentModificationException e) {
|
|
| 119 |
+ Assert.assertTrue(true);
|
|
| 120 |
+ }
|
|
| 121 |
+ }
|
|
| 90 | 122 |
}
|
| 91 | 123 |
|
| 92 | 124 |
public static ShortIdDto getIdReference(ObserveServiceFixtures<?> fixtures, String property) {
|
| ... | ... | @@ -97,7 +129,7 @@ public class OpenableDataServiceFixtures { |
| 97 | 129 |
return ObserveBusinessProject.get().toShortDto(id);
|
| 98 | 130 |
} else {
|
| 99 | 131 |
type = Objects2.forName(id.substring(0, index));
|
| 100 |
- id = id.substring(index+1);
|
|
| 132 |
+ id = id.substring(index + 1);
|
|
| 101 | 133 |
return ShortIdDto.of(type, id);
|
| 102 | 134 |
}
|
| 103 | 135 |
}
|