1 package org.apache.maven.usability.plugin;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import org.apache.maven.usability.plugin.io.xpp3.ParamdocXpp3Reader;
23 import org.codehaus.plexus.util.IOUtil;
24 import org.codehaus.plexus.util.ReaderFactory;
25 import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
26
27 import java.io.BufferedReader;
28 import java.io.File;
29 import java.io.IOException;
30 import java.io.InputStream;
31 import java.io.Reader;
32 import java.net.MalformedURLException;
33 import java.net.URL;
34 import java.net.URLClassLoader;
35 import java.util.HashMap;
36 import java.util.Iterator;
37 import java.util.List;
38 import java.util.Map;
39
40 public class ExpressionDocumenter
41 {
42
43 private static final String[] EXPRESSION_ROOTS = { "project", "settings", "session", "plugin", "rootless" };
44
45 private static final String EXPRESSION_DOCO_ROOTPATH = "META-INF/maven/plugin-expressions/";
46
47 private static Map expressionDocumentation;
48
49 public static Map load()
50 throws ExpressionDocumentationException
51 {
52 if ( expressionDocumentation == null )
53 {
54 expressionDocumentation = new HashMap();
55
56 ClassLoader docLoader = initializeDocLoader();
57
58 for ( String EXPRESSION_ROOT : EXPRESSION_ROOTS )
59 {
60 InputStream docStream = null;
61 try
62 {
63 docStream =
64 docLoader.getResourceAsStream( EXPRESSION_DOCO_ROOTPATH + EXPRESSION_ROOT + ".paramdoc.xml" );
65
66 if ( docStream != null )
67 {
68 Map doco = parseExpressionDocumentation( docStream );
69
70 expressionDocumentation.putAll( doco );
71 }
72 }
73 catch ( IOException e )
74 {
75 throw new ExpressionDocumentationException(
76 "Failed to read documentation for expression root: " + EXPRESSION_ROOT, e );
77 }
78 catch ( XmlPullParserException e )
79 {
80 throw new ExpressionDocumentationException(
81 "Failed to parse documentation for expression root: " + EXPRESSION_ROOT, e );
82 }
83 finally
84 {
85 IOUtil.close( docStream );
86 }
87 }
88 }
89
90 return expressionDocumentation;
91 }
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118 private static Map parseExpressionDocumentation( InputStream docStream )
119 throws IOException, XmlPullParserException
120 {
121 Reader reader = new BufferedReader( ReaderFactory.newXmlReader( docStream ) );
122
123 ParamdocXpp3Reader paramdocReader = new ParamdocXpp3Reader();
124
125 ExpressionDocumentation documentation = paramdocReader.read( reader, true );
126
127 List expressions = documentation.getExpressions();
128
129 Map bySyntax = new HashMap();
130
131 if ( expressions != null && !expressions.isEmpty() )
132 {
133 for ( Object expression : expressions )
134 {
135 Expression expr = (Expression) expression;
136
137 bySyntax.put( expr.getSyntax(), expr );
138 }
139 }
140
141 return bySyntax;
142 }
143
144 private static ClassLoader initializeDocLoader()
145 throws ExpressionDocumentationException
146 {
147 String myResourcePath = ExpressionDocumenter.class.getName().replace( '.', '/' ) + ".class";
148
149 URL myResource = ExpressionDocumenter.class.getClassLoader().getResource( myResourcePath );
150
151 String myClasspathEntry = myResource.getPath();
152
153 myClasspathEntry = myClasspathEntry.substring( 0, myClasspathEntry.length() - ( myResourcePath.length() + 2 ) );
154
155 if ( myClasspathEntry.startsWith( "file:" ) )
156 {
157 myClasspathEntry = myClasspathEntry.substring( "file:".length() );
158 }
159
160 URL docResource;
161 try
162 {
163 docResource = new File( myClasspathEntry ).toURL();
164 }
165 catch ( MalformedURLException e )
166 {
167 throw new ExpressionDocumentationException(
168 "Cannot construct expression documentation classpath resource base.",
169 e );
170 }
171
172 return new URLClassLoader( new URL[] { docResource } );
173 }
174
175 }