1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.jexl3.examples;
18
19 import static java.lang.Boolean.TRUE;
20 import static org.junit.jupiter.api.Assertions.assertEquals;
21 import static org.junit.jupiter.api.Assertions.assertInstanceOf;
22 import static org.junit.jupiter.api.Assertions.assertTrue;
23
24 import java.net.URI;
25 import java.util.Arrays;
26 import java.util.Collection;
27 import java.util.Collections;
28 import java.util.List;
29 import java.util.Objects;
30 import java.util.stream.Collectors;
31 import java.util.stream.Stream;
32
33 import org.apache.commons.jexl3.JexlBuilder;
34 import org.apache.commons.jexl3.JexlContext;
35 import org.apache.commons.jexl3.JexlEngine;
36 import org.apache.commons.jexl3.JexlFeatures;
37 import org.apache.commons.jexl3.JexlScript;
38 import org.apache.commons.jexl3.MapContext;
39 import org.apache.commons.jexl3.introspection.JexlPermissions;
40 import org.apache.commons.jexl3.introspection.JexlPermissions.ClassPermissions;
41 import org.junit.jupiter.api.Test;
42
43
44
45
46 public class StreamTest {
47
48
49
50
51 public static class CollectionContext extends MapContext {
52
53
54
55
56
57
58 public List<?> filter(final Collection<?> collection, final JexlScript filter) {
59 return collection.stream()
60 .filter(x -> x != null && TRUE.equals(filter.execute(this, x)))
61 .collect(Collectors.toList());
62 }
63
64
65
66
67
68
69
70 public List<?> map(final Collection<?> collection, final JexlScript mapper) {
71 return collection.stream()
72 .map(x -> mapper.execute(this, x))
73 .filter(Objects::nonNull)
74 .collect(Collectors.toList());
75 }
76 }
77
78
79
80
81 public static class StreamContext extends MapContext {
82
83
84
85
86
87
88 public Stream<?> filter(final Stream<?> stream, final JexlScript filter) {
89 return stream.filter(x -> x != null && TRUE.equals(filter.execute(this, x)));
90 }
91
92
93
94
95
96
97
98 public Stream<?> map(final Stream<?> stream, final JexlScript mapper) {
99 return stream.map(x -> mapper.execute(this, x));
100 }
101 }
102
103
104 private final JexlEngine jexl;
105
106 public StreamTest() {
107
108 final JexlFeatures features = new JexlFeatures()
109 .loops(false)
110 .sideEffectGlobal(false)
111 .sideEffect(false);
112
113 final JexlPermissions permissions = new ClassPermissions(java.net.URI.class);
114
115 jexl = new JexlBuilder()
116 .features(features)
117 .permissions(permissions)
118 .namespaces(Collections.singletonMap("URI", java.net.URI.class))
119 .create();
120 }
121
122 @Test
123 public void testURICollection() {
124
125 final JexlContext sctxt = new CollectionContext();
126
127 final List<URI> uris = Arrays.asList(
128 URI.create("http://user@www.apache.org:8000?qry=true"),
129 URI.create("https://commons.apache.org/releases/prepare.html"),
130 URI.create("mailto:henrib@apache.org")
131 );
132
133
134 final JexlScript filter = jexl.createScript(
135 "list.filter(uri -> uri.scheme =^ 'http')",
136 "list");
137 final Object filtered = filter.execute(sctxt, uris);
138 assertInstanceOf(List.class, filtered);
139 List<URI> result = (List<URI>) filtered;
140 assertEquals(2, result.size());
141 for(final URI uri : result) {
142 assertTrue(uri.getScheme().startsWith("http"));
143 }
144
145
146 final JexlScript mapper = jexl.createScript(
147 "list.map(uri -> uri.scheme =^ 'http'? URI:create(`https://${uri.host}`) : null)",
148 "list");
149 final Object transformed = mapper.execute(sctxt, uris);
150 assertInstanceOf(List.class, transformed);
151 result = (List<URI>) transformed;
152 assertEquals(2, result.size());
153 for(final URI uri : result) {
154 assertEquals("https", uri.getScheme());
155 }
156 }
157
158 @Test
159 public void testURIStream() {
160
161
162 final List<URI> uris = Arrays.asList(
163 URI.create("http://user@www.apache.org:8000?qry=true"),
164 URI.create("https://commons.apache.org/releases/prepare.html"),
165 URI.create("mailto:henrib@apache.org")
166 );
167
168 final List<?> control = uris.stream()
169 .map(uri -> uri.getScheme().startsWith("http")? "https://" + uri.getHost() : null)
170 .filter(Objects::nonNull)
171 .collect(Collectors.toList());
172 assertEquals(2, control.size());
173
174
175
176
177 final JexlScript mapper = jexl.createScript("uri.scheme =^ 'http'? `https://${uri.host}` : null", "uri");
178
179 final JexlScript transform = jexl.createScript(
180 "list.stream().map(mapper).filter(x -> !!x).collect(Collectors.toList())", "list");
181
182
183 final JexlContext sctxt = new StreamContext();
184
185 sctxt.set("Collectors", Collectors.class);
186
187 sctxt.set("mapper", mapper);
188
189 final Object transformed = transform.execute(sctxt, uris);
190 assertInstanceOf(List.class, transformed);
191 assertEquals(control, transformed);
192 }
193 }