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 org.apache.commons.jexl3.JexlBuilder;
20 import org.apache.commons.jexl3.JexlContext;
21 import org.apache.commons.jexl3.JexlEngine;
22 import org.apache.commons.jexl3.JexlFeatures;
23 import org.apache.commons.jexl3.JexlScript;
24 import org.apache.commons.jexl3.MapContext;
25 import org.apache.commons.jexl3.introspection.JexlPermissions;
26 import org.apache.commons.jexl3.introspection.JexlPermissions.ClassPermissions;
27 import org.junit.Assert;
28 import org.junit.Test;
29
30 import java.net.URI;
31 import java.util.Arrays;
32 import java.util.List;
33 import java.util.stream.Collectors;
34 import java.util.stream.Stream;
35
36 import static java.lang.Boolean.TRUE;
37
38
39
40
41 public class StreamTest {
42
43 private final JexlEngine jexl;
44
45 public StreamTest() {
46
47 JexlFeatures features = new JexlFeatures()
48 .loops(false)
49 .sideEffectGlobal(false)
50 .sideEffect(false);
51
52 JexlPermissions permissions = new ClassPermissions(java.net.URI.class);
53
54 jexl = new JexlBuilder().permissions(permissions).create();
55 }
56
57
58
59
60 public static class StreamContext extends MapContext {
61
62
63
64
65
66
67 public Stream<?> map(Stream<?> stream, final JexlScript mapper) {
68 return stream.map( x -> mapper.execute(this, x));
69 }
70
71
72
73
74
75
76
77 public Stream<?> filter(Stream<?> stream, final JexlScript filter) {
78 return stream.filter(x -> x != null && TRUE.equals(filter.execute(this, x)));
79 }
80 }
81
82 @Test
83 public void testURIStream() throws Exception {
84
85
86 List<URI> uris = Arrays.asList(
87 URI.create("http://user@www.apache.org:8000?qry=true"),
88 URI.create("https://commons.apache.org/releases/prepare.html"),
89 URI.create("mailto:henrib@apache.org")
90 );
91
92 List<?> control = uris.stream()
93 .map(uri -> uri.getScheme().startsWith("http")? "https://" + uri.getHost() : null)
94 .filter(x -> x != null)
95 .collect(Collectors.toList());
96 Assert.assertEquals(2, control.size());
97
98
99
100
101 JexlScript mapper = jexl.createScript("uri.scheme =^ 'http'? `https://${uri.host}` : null", "uri");
102
103 JexlScript transform = jexl.createScript(
104 "list.stream().map(mapper).filter(x -> !!x).collect(Collectors.toList())", "list");
105
106
107 JexlContext sctxt = new StreamContext();
108
109 sctxt.set("Collectors", Collectors.class);
110
111 sctxt.set("mapper", mapper);
112
113 Object transformed = transform.execute(sctxt, uris);
114 Assert.assertTrue(transformed instanceof List<?>);
115 Assert.assertEquals(control, transformed);
116 }
117 }