1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.maven.usability.plugin;
20
21 import java.io.BufferedReader;
22 import java.io.File;
23 import java.io.IOException;
24 import java.io.InputStream;
25 import java.io.Reader;
26 import java.net.MalformedURLException;
27 import java.net.URL;
28 import java.net.URLClassLoader;
29 import java.util.HashMap;
30 import java.util.List;
31 import java.util.Map;
32
33 import org.apache.maven.usability.plugin.io.xpp3.ParamdocXpp3Reader;
34 import org.codehaus.plexus.util.ReaderFactory;
35 import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
36
37
38
39
40 public class ExpressionDocumenter {
41
42 private static final String[] EXPRESSION_ROOTS = {"project", "settings", "session", "plugin", "rootless"};
43
44 private static final String EXPRESSION_DOCO_ROOTPATH = "META-INF/maven/plugin-expressions/";
45
46 private static Map<String, Expression> expressionDocumentation;
47
48 public static Map<String, Expression> load() throws ExpressionDocumentationException {
49 if (expressionDocumentation == null) {
50 expressionDocumentation = new HashMap<>();
51
52 ClassLoader docLoader = initializeDocLoader();
53
54 for (String root : EXPRESSION_ROOTS) {
55 try (InputStream docStream =
56 docLoader.getResourceAsStream(EXPRESSION_DOCO_ROOTPATH + root + ".paramdoc.xml")) {
57 if (docStream != null) {
58 Map<String, Expression> doco = parseExpressionDocumentation(docStream);
59
60 expressionDocumentation.putAll(doco);
61 }
62 } catch (IOException e) {
63 throw new ExpressionDocumentationException(
64 "Failed to read documentation for expression root: " + root, e);
65 } catch (XmlPullParserException e) {
66 throw new ExpressionDocumentationException(
67 "Failed to parse documentation for expression root: " + root, e);
68 }
69 }
70 }
71
72 return expressionDocumentation;
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 private static Map<String, Expression> parseExpressionDocumentation(InputStream docStream)
102 throws IOException, XmlPullParserException {
103 Reader reader = new BufferedReader(ReaderFactory.newXmlReader(docStream));
104
105 ParamdocXpp3Reader paramdocReader = new ParamdocXpp3Reader();
106
107 ExpressionDocumentation documentation = paramdocReader.read(reader, true);
108
109 List<Expression> expressions = documentation.getExpressions();
110
111 Map<String, Expression> bySyntax = new HashMap<>();
112
113 if (expressions != null && !expressions.isEmpty()) {
114 for (Expression expression : expressions) {
115 bySyntax.put(expression.getSyntax(), expression);
116 }
117 }
118
119 return bySyntax;
120 }
121
122 private static ClassLoader initializeDocLoader() throws ExpressionDocumentationException {
123 String myResourcePath = ExpressionDocumenter.class.getName().replace('.', '/') + ".class";
124
125 URL myResource = ExpressionDocumenter.class.getClassLoader().getResource(myResourcePath);
126
127 assert myResource != null : "The resource is this class itself loaded by its own classloader and must exist";
128
129 String myClasspathEntry = myResource.getPath();
130
131 myClasspathEntry = myClasspathEntry.substring(0, myClasspathEntry.length() - (myResourcePath.length() + 2));
132
133 if (myClasspathEntry.startsWith("file:")) {
134 myClasspathEntry = myClasspathEntry.substring("file:".length());
135 }
136
137 URL docResource;
138 try {
139 docResource = new File(myClasspathEntry).toURL();
140 } catch (MalformedURLException e) {
141 throw new ExpressionDocumentationException(
142 "Cannot construct expression documentation classpath" + " resource base.", e);
143 }
144
145 return new URLClassLoader(new URL[] {docResource});
146 }
147 }