Skip to content

Commit 5fe58c6

Browse files
committed
Add MapOverlay and MorphAdapter skeletons
1 parent e633e13 commit 5fe58c6

3 files changed

Lines changed: 257 additions & 1 deletion

File tree

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@
1212
- 🗂️ Multi-format support
1313
- 🔌 Works with Jackson, Gson, Jakarta, and other libraries
1414
- 🛠️ Extensible model for adding new formats and libraries
15-
- ⚙️ Unified traversal and transformation - apply visitors, filters, or mappers across heterogeneous trees
15+
- ⚙️ Unified traversal
16+
- Composable data transformations over an immutable source
1617

1718
## 🏗️ Use Cases
1819

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package com.apicatalog.tree.io.morph;
2+
3+
import java.util.Collection;
4+
import java.util.Map;
5+
import java.util.Map.Entry;
6+
import java.util.stream.Stream;
7+
8+
import com.apicatalog.tree.io.Tree;
9+
import com.apicatalog.tree.io.TreeAdapter;
10+
import com.apicatalog.tree.io.java.JavaAdapter;
11+
12+
public class MapOverlay {
13+
14+
private final Object base;
15+
private final TreeAdapter baseAdapter;
16+
17+
private Collection<Object> keys;
18+
private Map<Object, Object> overlay;
19+
20+
private MapOverlay(Object base, TreeAdapter baseAdapter) {
21+
this.base = base;
22+
this.baseAdapter = baseAdapter;
23+
}
24+
25+
public static MapOverlay with(Tree tree) {
26+
return with(tree.node(), tree.adapter());
27+
}
28+
29+
public static MapOverlay with(Map<Object, Object> map) {
30+
return with(map, JavaAdapter.instance());
31+
}
32+
33+
public static MapOverlay with(Object map, TreeAdapter adapter) {
34+
return null;
35+
}
36+
37+
public Collection<?> keys() {
38+
return keys;
39+
}
40+
41+
public Object property(Object key) {
42+
if (overlay.containsKey(key)) {
43+
return overlay.get(key);
44+
}
45+
return baseAdapter.property(key, base);
46+
}
47+
48+
public Object property(Object key, TreeAdapter keyAdapter) {
49+
if (overlay.containsKey(key)) {
50+
return overlay.get(key);
51+
}
52+
return baseAdapter.property(key, keyAdapter, base);
53+
}
54+
55+
public Iterable<Entry<?, ?>> entries() {
56+
return entryStream().toList();
57+
}
58+
59+
public Stream<Entry<?, ?>> entryStream() {
60+
return Stream.concat(
61+
baseAdapter.entryStream(base)
62+
.filter(entry -> !overlay.containsKey(entry.getKey()) && keys.contains(entry.getKey())),
63+
overlay.entrySet().stream());
64+
}
65+
66+
}
Lines changed: 189 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,189 @@
1+
package com.apicatalog.tree.io.morph;
2+
3+
import java.math.BigDecimal;
4+
import java.math.BigInteger;
5+
import java.util.Collection;
6+
import java.util.Map.Entry;
7+
import java.util.stream.Stream;
8+
9+
import com.apicatalog.tree.io.Tree.Features;
10+
import com.apicatalog.tree.io.Tree.NodeType;
11+
import com.apicatalog.tree.io.TreeAdapter;
12+
13+
class MorphAdapter implements TreeAdapter {
14+
15+
private TreeAdapter base;
16+
17+
@Override
18+
public boolean isEqualTo(TreeAdapter adapter) {
19+
return adapter instanceof MorphAdapter morph
20+
&& base.isEqualTo(morph.base);
21+
}
22+
23+
@Override
24+
public Features features() {
25+
return base.features();
26+
}
27+
28+
@Override
29+
public boolean isNode(Object node) {
30+
return node instanceof MapOverlay || base.isNode(node);
31+
}
32+
33+
@Override
34+
public NodeType type(Object node) {
35+
if (node instanceof MapOverlay) {
36+
return NodeType.MAP;
37+
}
38+
return base.type(node);
39+
}
40+
41+
@Override
42+
public boolean isBoolean(Object node) {
43+
return base.isBoolean(node);
44+
}
45+
46+
@Override
47+
public boolean isBinary(Object node) {
48+
return base.isBinary(node);
49+
}
50+
51+
@Override
52+
public int size(Object node) {
53+
if (node instanceof MapOverlay map) {
54+
return map.keys().size();
55+
}
56+
return base.size(node);
57+
}
58+
59+
@Override
60+
public boolean isMap(Object node) {
61+
return node instanceof MapOverlay || base.isMap(node);
62+
}
63+
64+
@Override
65+
public Collection<?> keys(Object node) {
66+
if (node instanceof MapOverlay map) {
67+
return map.keys();
68+
}
69+
return base.keys(node);
70+
}
71+
72+
@Override
73+
public Object property(Object key, Object node) {
74+
if (node instanceof MapOverlay map) {
75+
return map.property(key);
76+
}
77+
return base.property(key, node);
78+
}
79+
80+
@Override
81+
public Object property(Object key, TreeAdapter keyAdapter, Object node) {
82+
if (node instanceof MapOverlay map) {
83+
return map.property(key, keyAdapter);
84+
}
85+
return base.property(key, keyAdapter, node);
86+
}
87+
88+
@Override
89+
public Iterable<Entry<?, ?>> entries(Object node) {
90+
if (node instanceof MapOverlay map) {
91+
return map.entries();
92+
}
93+
return base.entries(node);
94+
}
95+
96+
@Override
97+
public Stream<Entry<?, ?>> entryStream(Object node) {
98+
if (node instanceof MapOverlay map) {
99+
return map.entryStream();
100+
}
101+
return base.entryStream(node);
102+
}
103+
104+
@Override
105+
public boolean isSequence(Object node) {
106+
return base.isSequence(node);
107+
}
108+
109+
@Override
110+
public Iterable<?> elements(Object node) {
111+
return base.elements(node);
112+
}
113+
114+
@Override
115+
public Stream<?> elementStream(Object node) {
116+
return base.elementStream(node);
117+
}
118+
119+
@Override
120+
public boolean isString(Object node) {
121+
return base.isString(node);
122+
}
123+
124+
@Override
125+
public String stringValue(Object node) {
126+
return base.stringValue(node);
127+
}
128+
129+
@Override
130+
public boolean isNumber(Object node) {
131+
return base.isNumber(node);
132+
}
133+
134+
@Override
135+
public boolean isIntegral(Object node) {
136+
return base.isIntegral(node);
137+
}
138+
139+
@Override
140+
public int intValue(Object node) {
141+
return base.intValue(node);
142+
}
143+
144+
@Override
145+
public long longValue(Object node) {
146+
return base.longValue(node);
147+
}
148+
149+
@Override
150+
public BigInteger integerValue(Object node) {
151+
return base.integerValue(node);
152+
}
153+
154+
@Override
155+
public double doubleValue(Object node) {
156+
return base.doubleValue(node);
157+
}
158+
159+
@Override
160+
public BigDecimal decimalValue(Object node) {
161+
return base.decimalValue(node);
162+
}
163+
164+
@Override
165+
public byte[] binaryValue(Object node) {
166+
return base.binaryValue(node);
167+
}
168+
169+
@Override
170+
public Iterable<?> asIterable(Object node) {
171+
return base.asIterable(node);
172+
}
173+
174+
@Override
175+
public Stream<?> asStream(Object node) {
176+
return base.asStream(node);
177+
}
178+
179+
@Override
180+
public String asString(Object node) {
181+
return base.asString(node);
182+
}
183+
184+
@Override
185+
public BigDecimal asDecimal(Object node) {
186+
return base.asDecimal(node);
187+
}
188+
189+
}

0 commit comments

Comments
 (0)