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.List;
37  import java.util.Map;
38  
39  public class ExpressionDocumenter
40  {
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 expressionDocumentation;
47  
48      public static Map load()
49          throws ExpressionDocumentationException
50      {
51          if ( expressionDocumentation == null )
52          {
53              expressionDocumentation = new HashMap();
54  
55              ClassLoader docLoader = initializeDocLoader();
56  
57              for ( String EXPRESSION_ROOT : EXPRESSION_ROOTS )
58              {
59                  InputStream docStream = null;
60                  try
61                  {
62                      docStream =
63                          docLoader.getResourceAsStream( EXPRESSION_DOCO_ROOTPATH + EXPRESSION_ROOT + ".paramdoc.xml" );
64  
65                      if ( docStream != null )
66                      {
67                          Map doco = parseExpressionDocumentation( docStream );
68  
69                          expressionDocumentation.putAll( doco );
70                      }
71                  }
72                  catch ( IOException e )
73                  {
74                      throw new ExpressionDocumentationException(
75                          "Failed to read documentation for expression root: " + EXPRESSION_ROOT, e );
76                  }
77                  catch ( XmlPullParserException e )
78                  {
79                      throw new ExpressionDocumentationException(
80                          "Failed to parse documentation for expression root: " + EXPRESSION_ROOT, e );
81                  }
82                  finally
83                  {
84                      IOUtil.close( docStream );
85                  }
86              }
87          }
88  
89          return expressionDocumentation;
90      }
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     private static Map parseExpressionDocumentation( InputStream docStream )
118         throws IOException, XmlPullParserException
119     {
120         Reader reader = new BufferedReader( ReaderFactory.newXmlReader( docStream ) );
121 
122         ParamdocXpp3Reader paramdocReader = new ParamdocXpp3Reader();
123 
124         ExpressionDocumentation documentation = paramdocReader.read( reader, true );
125 
126         List expressions = documentation.getExpressions();
127 
128         Map bySyntax = new HashMap();
129 
130         if ( expressions != null && !expressions.isEmpty() )
131         {
132             for ( Object expression : expressions )
133             {
134                 Expression expr = (Expression) expression;
135 
136                 bySyntax.put( expr.getSyntax(), expr );
137             }
138         }
139 
140         return bySyntax;
141     }
142 
143     private static ClassLoader initializeDocLoader()
144         throws ExpressionDocumentationException
145     {
146         String myResourcePath = ExpressionDocumenter.class.getName().replace( '.', '/' ) + ".class";
147 
148         URL myResource = ExpressionDocumenter.class.getClassLoader().getResource( myResourcePath );
149 
150         assert myResource != null : "The resource is this class itself loaded by its own classloader and must exist";
151 
152         String myClasspathEntry = myResource.getPath();
153 
154         myClasspathEntry = myClasspathEntry.substring( 0, myClasspathEntry.length() - ( myResourcePath.length() + 2 ) );
155 
156         if ( myClasspathEntry.startsWith( "file:" ) )
157         {
158             myClasspathEntry = myClasspathEntry.substring( "file:".length() );
159         }
160 
161         URL docResource;
162         try
163         {
164             docResource = new File( myClasspathEntry ).toURL();
165         }
166         catch ( MalformedURLException e )
167         {
168             throw new ExpressionDocumentationException( "Cannot construct expression documentation classpath"
169                 + " resource base.", e );
170         }
171 
172         return new URLClassLoader( new URL[] { docResource } );
173     }
174 
175 }