Skip to content

Commit 199dfcb

Browse files
committed
[Fix #1738] Adding safeguard to avoid overriding keys set by user
Signed-off-by: Francisco Javier Tirado Sarti <ftirados@ibm.com>
1 parent de5f360 commit 199dfcb

1 file changed

Lines changed: 35 additions & 2 deletions

File tree

‎impl/persistence/api/src/main/java/io/serverlessworkflow/impl/persistence/WorkflowPersistenceInstance.java‎

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,17 @@
2424
import io.serverlessworkflow.impl.WorkflowMutableInstance;
2525
import io.serverlessworkflow.impl.WorkflowStatus;
2626
import io.serverlessworkflow.impl.executors.TransitionInfo;
27+
import java.util.HashSet;
2728
import java.util.Optional;
29+
import java.util.Set;
2830
import java.util.concurrent.CompletableFuture;
31+
import java.util.concurrent.ConcurrentHashMap;
32+
import java.util.function.Supplier;
2933

3034
public class WorkflowPersistenceInstance extends WorkflowMutableInstance {
3135

3236
private final PersistenceWorkflowInfo info;
37+
private Set<String> userMetaKeys = ConcurrentHashMap.newKeySet();
3338

3439
public static WorkflowInstance of(WorkflowDefinition definition, PersistenceWorkflowInfo info) {
3540
return definition
@@ -48,7 +53,7 @@ private WorkflowPersistenceInstance(WorkflowDefinition definition, PersistenceWo
4853
}
4954
});
5055
this.startedAt = info.startedAt();
51-
additionalObjects = info.metadata();
56+
additionalObjects.putAll(info.metadata());
5257
}
5358

5459
@Override
@@ -100,6 +105,34 @@ public void restoreContext(WorkflowContext workflow, TaskContext context) {
100105
searchContext = tryContext.parent();
101106
}
102107
}
103-
taskInfo.additionalObjects().forEach(additionalObjects::put);
108+
Set<String> retainKeys = new HashSet<>(userMetaKeys);
109+
taskInfo
110+
.additionalObjects()
111+
.forEach(
112+
(k, v) -> {
113+
if (!retainKeys.contains(k)) {
114+
additionalObjects.put(k, v);
115+
retainKeys.add(k);
116+
}
117+
});
118+
additionalObjects.keySet().retainAll(retainKeys);
119+
}
120+
121+
@Override
122+
public <T> T addMetadataIfAbsent(String key, Supplier<T> supplier) {
123+
userMetaKeys.add(key);
124+
return super.addMetadataIfAbsent(key, supplier);
125+
}
126+
127+
@Override
128+
public void removeMetadata(String key) {
129+
userMetaKeys.remove(key);
130+
super.removeMetadata(key);
131+
}
132+
133+
@Override
134+
public <T> Optional<T> removeMetadata(String key, Class<T> clazz) {
135+
userMetaKeys.remove(key);
136+
return super.removeMetadata(key, clazz);
104137
}
105138
}

0 commit comments

Comments
 (0)