1   
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  package org.apache.maven.model.interpolation.reflection;
20  
21  
22  
23  
24  
25  
26  
27  
28  
29  
30  
31  
32  
33  
34  
35  
36  
37  import java.util.ArrayList;
38  import java.util.HashMap;
39  import java.util.List;
40  import java.util.Map;
41  
42  import org.junit.jupiter.api.BeforeEach;
43  import org.junit.jupiter.api.Test;
44  
45  import static org.junit.jupiter.api.Assertions.assertEquals;
46  import static org.junit.jupiter.api.Assertions.assertNotNull;
47  import static org.junit.jupiter.api.Assertions.assertNull;
48  
49  
50  
51  
52  public class ReflectionValueExtractorTest {
53      private Project project;
54  
55      
56  
57  
58      @BeforeEach
59      void setUp() {
60          Dependency dependency1 = new Dependency();
61          dependency1.setArtifactId("dep1");
62          Dependency dependency2 = new Dependency();
63          dependency2.setArtifactId("dep2");
64  
65          project = new Project();
66          project.setModelVersion("4.0.0");
67          project.setGroupId("org.apache.maven");
68          project.setArtifactId("maven-core");
69          project.setName("Maven");
70          project.setVersion("2.0-SNAPSHOT");
71          project.setScm(new Scm());
72          project.getScm().setConnection("scm-connection");
73          project.addDependency(dependency1);
74          project.addDependency(dependency2);
75          project.setBuild(new Build());
76  
77          
78          project.addArtifact(new Artifact("g0", "a0", "v0", "e0", "c0"));
79          project.addArtifact(new Artifact("g1", "a1", "v1", "e1", "c1"));
80          project.addArtifact(new Artifact("g2", "a2", "v2", "e2", "c2"));
81      }
82  
83      
84  
85  
86  
87  
88      @Test
89      void testValueExtraction() throws Exception {
90          
91          
92          
93  
94          assertEquals("4.0.0", ReflectionValueExtractor.evaluate("project.modelVersion", project));
95  
96          assertEquals("org.apache.maven", ReflectionValueExtractor.evaluate("project.groupId", project));
97  
98          assertEquals("maven-core", ReflectionValueExtractor.evaluate("project.artifactId", project));
99  
100         assertEquals("Maven", ReflectionValueExtractor.evaluate("project.name", project));
101 
102         assertEquals("2.0-SNAPSHOT", ReflectionValueExtractor.evaluate("project.version", project));
103 
104         
105         
106         
107 
108         assertEquals("scm-connection", ReflectionValueExtractor.evaluate("project.scm.connection", project));
109 
110         
111         
112         
113 
114         List<?> dependencies = (List) ReflectionValueExtractor.evaluate("project.dependencies", project);
115 
116         assertNotNull(dependencies);
117 
118         assertEquals(2, dependencies.size());
119 
120         
121         
122         
123 
124         
125         Dependency dependency = (Dependency) ReflectionValueExtractor.evaluate("project.dependencies[0]", project);
126 
127         assertNotNull(dependency);
128 
129         assertEquals("dep1", dependency.getArtifactId());
130 
131         String artifactId = (String) ReflectionValueExtractor.evaluate("project.dependencies[1].artifactId", project);
132 
133         assertEquals("dep2", artifactId);
134 
135         
136 
137         dependency = (Dependency) ReflectionValueExtractor.evaluate("project.dependenciesAsArray[0]", project);
138 
139         assertNotNull(dependency);
140 
141         assertEquals("dep1", dependency.getArtifactId());
142 
143         artifactId = (String) ReflectionValueExtractor.evaluate("project.dependenciesAsArray[1].artifactId", project);
144 
145         assertEquals("dep2", artifactId);
146 
147         
148 
149         dependency = (Dependency) ReflectionValueExtractor.evaluate("project.dependenciesAsMap(dep1)", project);
150 
151         assertNotNull(dependency);
152 
153         assertEquals("dep1", dependency.getArtifactId());
154 
155         artifactId = (String) ReflectionValueExtractor.evaluate("project.dependenciesAsMap(dep2).artifactId", project);
156 
157         assertEquals("dep2", artifactId);
158 
159         
160         
161         
162 
163         Build build = (Build) ReflectionValueExtractor.evaluate("project.build", project);
164 
165         assertNotNull(build);
166     }
167 
168     
169 
170 
171 
172 
173     @Test
174     public void testValueExtractorWithAInvalidExpression() throws Exception {
175         assertNull(ReflectionValueExtractor.evaluate("project.foo", project));
176         assertNull(ReflectionValueExtractor.evaluate("project.dependencies[10]", project));
177         assertNull(ReflectionValueExtractor.evaluate("project.dependencies[0].foo", project));
178     }
179 
180     
181 
182 
183 
184 
185     @Test
186     public void testMappedDottedKey() throws Exception {
187         Map<String, String> map = new HashMap<String, String>();
188         map.put("a.b", "a.b-value");
189 
190         assertEquals("a.b-value", ReflectionValueExtractor.evaluate("h.value(a.b)", new ValueHolder(map)));
191     }
192 
193     
194 
195 
196 
197 
198     @Test
199     public void testIndexedMapped() throws Exception {
200         Map<Object, Object> map = new HashMap<Object, Object>();
201         map.put("a", "a-value");
202         List<Object> list = new ArrayList<Object>();
203         list.add(map);
204 
205         assertEquals("a-value", ReflectionValueExtractor.evaluate("h.value[0](a)", new ValueHolder(list)));
206     }
207 
208     
209 
210 
211 
212 
213     @Test
214     public void testMappedIndexed() throws Exception {
215         List<Object> list = new ArrayList<Object>();
216         list.add("a-value");
217         Map<Object, Object> map = new HashMap<Object, Object>();
218         map.put("a", list);
219         assertEquals("a-value", ReflectionValueExtractor.evaluate("h.value(a)[0]", new ValueHolder(map)));
220     }
221 
222     
223 
224 
225 
226 
227     @Test
228     public void testMappedMissingDot() throws Exception {
229         Map<Object, Object> map = new HashMap<Object, Object>();
230         map.put("a", new ValueHolder("a-value"));
231         assertNull(ReflectionValueExtractor.evaluate("h.value(a)value", new ValueHolder(map)));
232     }
233 
234     
235 
236 
237 
238 
239     @Test
240     public void testIndexedMissingDot() throws Exception {
241         List<Object> list = new ArrayList<Object>();
242         list.add(new ValueHolder("a-value"));
243         assertNull(ReflectionValueExtractor.evaluate("h.value[0]value", new ValueHolder(list)));
244     }
245 
246     
247 
248 
249 
250 
251     @Test
252     public void testDotDot() throws Exception {
253         assertNull(ReflectionValueExtractor.evaluate("h..value", new ValueHolder("value")));
254     }
255 
256     
257 
258 
259 
260 
261     @Test
262     public void testBadIndexedSyntax() throws Exception {
263         List<Object> list = new ArrayList<Object>();
264         list.add("a-value");
265         Object value = new ValueHolder(list);
266 
267         assertNull(ReflectionValueExtractor.evaluate("h.value[", value));
268         assertNull(ReflectionValueExtractor.evaluate("h.value[]", value));
269         assertNull(ReflectionValueExtractor.evaluate("h.value[a]", value));
270         assertNull(ReflectionValueExtractor.evaluate("h.value[0", value));
271         assertNull(ReflectionValueExtractor.evaluate("h.value[0)", value));
272         assertNull(ReflectionValueExtractor.evaluate("h.value[-1]", value));
273     }
274 
275     
276 
277 
278 
279 
280     @Test
281     public void testBadMappedSyntax() throws Exception {
282         Map<Object, Object> map = new HashMap<Object, Object>();
283         map.put("a", "a-value");
284         Object value = new ValueHolder(map);
285 
286         assertNull(ReflectionValueExtractor.evaluate("h.value(", value));
287         assertNull(ReflectionValueExtractor.evaluate("h.value()", value));
288         assertNull(ReflectionValueExtractor.evaluate("h.value(a", value));
289         assertNull(ReflectionValueExtractor.evaluate("h.value(a]", value));
290     }
291 
292     
293 
294 
295 
296 
297     @Test
298     public void testIllegalIndexedType() throws Exception {
299         try {
300             ReflectionValueExtractor.evaluate("h.value[1]", new ValueHolder("string"));
301         } catch (Exception e) {
302             
303         }
304     }
305 
306     
307 
308 
309 
310 
311     @Test
312     public void testIllegalMappedType() throws Exception {
313         try {
314             ReflectionValueExtractor.evaluate("h.value(key)", new ValueHolder("string"));
315         } catch (Exception e) {
316             
317         }
318     }
319 
320     
321 
322 
323 
324 
325     @Test
326     public void testTrimRootToken() throws Exception {
327         assertNull(ReflectionValueExtractor.evaluate("project", project, true));
328     }
329 
330     
331 
332 
333 
334 
335     @Test
336     public void testArtifactMap() throws Exception {
337         assertEquals(
338                 "g0",
339                 ((Artifact) ReflectionValueExtractor.evaluate("project.artifactMap(g0:a0:c0)", project)).getGroupId());
340         assertEquals(
341                 "a1",
342                 ((Artifact) ReflectionValueExtractor.evaluate("project.artifactMap(g1:a1:c1)", project))
343                         .getArtifactId());
344         assertEquals(
345                 "c2",
346                 ((Artifact) ReflectionValueExtractor.evaluate("project.artifactMap(g2:a2:c2)", project))
347                         .getClassifier());
348     }
349 
350     public static class Artifact {
351         private String groupId;
352 
353         private String artifactId;
354 
355         private String version;
356 
357         private String extension;
358 
359         private String classifier;
360 
361         public Artifact(String groupId, String artifactId, String version, String extension, String classifier) {
362             this.groupId = groupId;
363             this.artifactId = artifactId;
364             this.version = version;
365             this.extension = extension;
366             this.classifier = classifier;
367         }
368 
369         public String getGroupId() {
370             return groupId;
371         }
372 
373         public void setGroupId(String groupId) {
374             this.groupId = groupId;
375         }
376 
377         public String getArtifactId() {
378             return artifactId;
379         }
380 
381         public void setArtifactId(String artifactId) {
382             this.artifactId = artifactId;
383         }
384 
385         public String getVersion() {
386             return version;
387         }
388 
389         public void setVersion(String version) {
390             this.version = version;
391         }
392 
393         public String getExtension() {
394             return extension;
395         }
396 
397         public void setExtension(String extension) {
398             this.extension = extension;
399         }
400 
401         public String getClassifier() {
402             return classifier;
403         }
404 
405         public void setClassifier(String classifier) {
406             this.classifier = classifier;
407         }
408     }
409 
410     public static class Project {
411         private String modelVersion;
412 
413         private String groupId;
414 
415         private Scm scm;
416 
417         private List<Dependency> dependencies = new ArrayList<>();
418 
419         private Build build;
420 
421         private String artifactId;
422 
423         private String name;
424 
425         private String version;
426 
427         private Map<String, Artifact> artifactMap = new HashMap<>();
428         private String description;
429 
430         public void setModelVersion(String modelVersion) {
431             this.modelVersion = modelVersion;
432         }
433 
434         public void setGroupId(String groupId) {
435             this.groupId = groupId;
436         }
437 
438         public void setScm(Scm scm) {
439             this.scm = scm;
440         }
441 
442         public void addDependency(Dependency dependency) {
443             this.dependencies.add(dependency);
444         }
445 
446         public void setBuild(Build build) {
447             this.build = build;
448         }
449 
450         public void setArtifactId(String artifactId) {
451             this.artifactId = artifactId;
452         }
453 
454         public void setName(String name) {
455             this.name = name;
456         }
457 
458         public void setVersion(String version) {
459             this.version = version;
460         }
461 
462         public Scm getScm() {
463             return scm;
464         }
465 
466         public String getModelVersion() {
467             return modelVersion;
468         }
469 
470         public String getGroupId() {
471             return groupId;
472         }
473 
474         public List<Dependency> getDependencies() {
475             return dependencies;
476         }
477 
478         public Build getBuild() {
479             return build;
480         }
481 
482         public String getArtifactId() {
483             return artifactId;
484         }
485 
486         public String getName() {
487             return name;
488         }
489 
490         public String getVersion() {
491             return version;
492         }
493 
494         public Dependency[] getDependenciesAsArray() {
495             return getDependencies().toArray(new Dependency[0]);
496         }
497 
498         public Map<String, Dependency> getDependenciesAsMap() {
499             Map<String, Dependency> ret = new HashMap<>();
500             for (Dependency dep : getDependencies()) {
501                 ret.put(dep.getArtifactId(), dep);
502             }
503             return ret;
504         }
505 
506         
507         public void addArtifact(Artifact a) {
508             artifactMap.put(a.getGroupId() + ":" + a.getArtifactId() + ":" + a.getClassifier(), a);
509         }
510 
511         public Map<String, Artifact> getArtifactMap() {
512             return artifactMap;
513         }
514 
515         public void setDescription(String description) {
516             this.description = description;
517         }
518 
519         public String getDescription() {
520             return description;
521         }
522     }
523 
524     public static class Build {}
525 
526     public static class Dependency {
527         private String artifactId;
528 
529         public String getArtifactId() {
530             return artifactId;
531         }
532 
533         public void setArtifactId(String id) {
534             artifactId = id;
535         }
536     }
537 
538     public static class Scm {
539         private String connection;
540 
541         public void setConnection(String connection) {
542             this.connection = connection;
543         }
544 
545         public String getConnection() {
546             return connection;
547         }
548     }
549 
550     public static class ValueHolder {
551         private final Object value;
552 
553         public ValueHolder(Object value) {
554             this.value = value;
555         }
556 
557         public Object getValue() {
558             return value;
559         }
560     }
561 
562     
563 
564 
565 
566 
567     @Test
568     public void testRootPropertyRegression() throws Exception {
569         Project project = new Project();
570         project.setDescription("c:\\\\org\\apache\\test");
571         Object evalued = ReflectionValueExtractor.evaluate("description", project);
572         assertNotNull(evalued);
573     }
574 }