Repository navigation
Expand file tree
/
Copy pathSequenceContext.java
More file actions
132 lines (104 loc) · 3.74 KB
/
Copy pathSequenceContext.java
File metadata and controls
132 lines (104 loc) · 3.74 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
package com.abilityapi.sequenceapi;
import com.google.common.collect.ImmutableMap;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
public class SequenceContext {
public static String ID = "id";
public static String ROOT = "root";
public static String SOURCE = "source";
public static String OWNER = "owner";
public static String STATE = "state";
public static Builder builder() {
return new Builder();
}
public static Builder from(final SequenceContext sequenceContext) {
return new Builder(sequenceContext);
}
private final ImmutableMap<String, Object> context;
private SequenceContext(final Map<String, Object> context) {
this.context = ImmutableMap.copyOf(context);
}
@SuppressWarnings("unchecked")
public final <T> T getId() {
return (T) this.context.get(ID);
}
@SuppressWarnings("unchecked")
public final <T> T getRoot() {
return (T) this.context.get(ROOT);
}
@SuppressWarnings("unchecked")
public final <T> T getSource() {
return (T) this.context.get(SOURCE);
}
@SuppressWarnings("unchecked")
public final <T> T getOwner() {
return (T) this.context.get(OWNER);
}
@SuppressWarnings("unchecked")
public final <T> T getState() {
return (T) this.context.get(STATE);
}
@SuppressWarnings("unchecked")
public final <T> T get(final String key) {
return (T) this.context.get(key);
}
public static class Builder {
Map<String, Object> context = new HashMap<>();
Set<String> keysUsed = new HashSet<>();
private Builder() {}
private Builder(final SequenceContext sequenceContext) {
merge(sequenceContext);
}
public final Builder merge(final SequenceContext sequenceContext) {
sequenceContext.context.forEach(this::custom);
return this;
}
public final Builder id(final Object value) {
if (!this.keysUsed.contains(SequenceContext.ID)) {
this.context.put(SequenceContext.ID, value);
this.keysUsed.add(SequenceContext.ID);
}
return this;
}
public final Builder root(final Object value) {
if (!this.keysUsed.contains(SequenceContext.ROOT)) {
this.context.put(SequenceContext.ROOT, value);
this.keysUsed.add(SequenceContext.ROOT);
}
return this;
}
public final Builder source(final Object value) {
if (!this.keysUsed.contains(SequenceContext.SOURCE)) {
this.context.put(SequenceContext.SOURCE, value);
this.keysUsed.add(SequenceContext.SOURCE);
}
return this;
}
public final Builder owner(final Object value) {
if (!this.keysUsed.contains(SequenceContext.OWNER)) {
this.context.put(SequenceContext.OWNER, value);
this.keysUsed.add(SequenceContext.OWNER);
}
return this;
}
public final Builder state(final Object value) {
if (!this.keysUsed.contains(SequenceContext.STATE)) {
this.context.put(SequenceContext.STATE, value);
this.keysUsed.add(SequenceContext.STATE);
}
return this;
}
public final Builder custom(final String key, final Object value) {
if (!this.keysUsed.contains(key)) {
this.context.put(key, value);
this.keysUsed.add(key);
}
return this;
}
public final SequenceContext build() {
return new SequenceContext(this.context);
}
}
}