View Javadoc

1   /*
2    * Copyright 2011 The Kuali Foundation
3    *
4    * Licensed under the Educational Community License, Version 1.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    * http://www.opensource.org/licenses/ecl1.php
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  package org.kuali.student.datadictionary.mojo;
17  
18  import java.io.File;
19  import java.io.FileNotFoundException;
20  import java.io.FileOutputStream;
21  import java.io.OutputStream;
22  import java.io.PrintStream;
23  import java.net.MalformedURLException;
24  import java.net.URL;
25  import java.net.URLClassLoader;
26  import java.util.ArrayList;
27  import java.util.LinkedHashSet;
28  import java.util.List;
29  import java.util.Map;
30  import java.util.Set;
31  import org.apache.maven.artifact.DependencyResolutionRequiredException;
32  import org.apache.maven.plugin.AbstractMojo;
33  import org.apache.maven.plugin.MojoExecutionException;
34  import org.apache.maven.project.MavenProject;
35  import org.kuali.rice.krad.datadictionary.DataObjectEntry;
36  import org.kuali.student.datadictionary.util.DictionaryFormatter;
37  import org.kuali.student.datadictionary.util.DictionaryTesterHelper;
38  
39  /**
40   * Mojo for generating a formatted view of the data dictionary
41   * @goal ksdictionarydoc
42   * @phase site
43   * @requiresDependencyResolution test
44   */
45  public class KSDictionaryDocMojo extends AbstractMojo {
46  
47      /**
48       * @parameter expression="${project}"
49       * @required
50       * @readonly
51       */
52      private MavenProject project;
53      /**
54       * @parameter
55       **/
56      private List<String> inputFiles;
57      /**
58       * @parameter
59       **/
60      private List<String> supportFiles = new ArrayList();
61      /**
62       * @parameter expression="${htmlDirectory}" default-value="${project.build.directory}/site/services/dictionarydocs"
63       */
64      private File htmlDirectory;
65  
66      public void setHtmlDirectory(File htmlDirectory) {
67          this.htmlDirectory = htmlDirectory;
68      }
69  
70      public File getHtmlDirectory() {
71          return htmlDirectory;
72      }
73  
74      public List<String> getInputFiles() {
75          return inputFiles;
76      }
77  
78      public MavenProject getProject() {
79          return project;
80      }
81  
82      public void setInputFiles(List<String> inputFiles) {
83          this.inputFiles = inputFiles;
84      }
85  
86      public List<String> getSupportFiles() {
87          return supportFiles;
88      }
89  
90      public void setSupportFiles(List<String> supportFiles) {
91          this.supportFiles = supportFiles;
92      }
93  
94      @Override
95      public void execute()
96              throws MojoExecutionException {
97          this.getLog().info("generating dictionary documentation");
98          // add the current projects classpath to the plugin so the springbean
99          // loader can find the xml files and lasses that it needs to can be run
100         // against the current project's files
101         if (project != null) {
102             this.getLog().info("adding current project's classpath to plugin class loader");
103             List runtimeClasspathElements;
104             try {
105                 runtimeClasspathElements = project.getRuntimeClasspathElements();
106             } catch (DependencyResolutionRequiredException ex) {
107                 throw new MojoExecutionException("got error", ex);
108             }
109             URL[] runtimeUrls = new URL[runtimeClasspathElements.size()];
110             for (int i = 0; i < runtimeClasspathElements.size(); i++) {
111                 String element = (String) runtimeClasspathElements.get(i);
112                 try {
113                     runtimeUrls[i] = new File(element).toURI().toURL();
114                 } catch (MalformedURLException ex) {
115                     throw new MojoExecutionException(element, ex);
116                 }
117             }
118             URLClassLoader newLoader = new URLClassLoader(runtimeUrls,
119                     Thread.currentThread().getContextClassLoader());
120             Thread.currentThread().setContextClassLoader(newLoader);
121         }
122 
123 
124         //System.out.println ("Writing java class: " + fileName + " to " + dir.getAbsolutePath ());
125         if (!htmlDirectory.exists()) {
126             if (!htmlDirectory.mkdirs()) {
127 //                throw new MojoExecutionException("Could not create directory "
128                 throw new IllegalArgumentException("Could not create directory "
129                         + this.htmlDirectory.getPath());
130             }
131         }
132 
133         Set<String> inpFiles = new LinkedHashSet(this.inputFiles.size());
134         for (String dictFileName : this.inputFiles) {
135             if (dictFileName.endsWith(".xml")) {
136                 inpFiles.add(dictFileName);
137             }
138         }
139 
140         Set<String> configFiles = new LinkedHashSet(this.inputFiles.size() + supportFiles.size());
141         configFiles.addAll(inpFiles);
142         configFiles.addAll(this.supportFiles);
143 
144         String outputDir = this.htmlDirectory.getAbsolutePath();
145         DictionaryTesterHelper tester = new DictionaryTesterHelper(outputDir, configFiles);
146         List<String> outputFileNames = tester.doTest();
147 
148         // write out the index file
149         String indexFileName = this.htmlDirectory.getPath() + "/" + "index.html";
150         File indexFile = new File(indexFileName);
151         OutputStream outputStream;
152         try {
153             outputStream = new FileOutputStream(indexFile, false);
154         } catch (FileNotFoundException ex) {
155 //            throw new MojoExecutionException(indexFileName, ex);
156             throw new IllegalArgumentException(indexFileName, ex);
157         }
158         PrintStream out = new PrintStream(outputStream);
159         DictionaryFormatter.writeHeader(out, "Data Dictionary Index");
160         out.println("<h1>Data Dictionary Index</h1>");
161         String endUL = "";
162         Map<String, DataObjectEntry> beansOfType = tester.getDataObjectEntryBeans();
163         for (String beanId : beansOfType.keySet()) {
164             String outputFileName = beanId + ".html";
165             out.println("<li><a href=\"" + outputFileName + "\">" + beanId + "</a>");
166         }
167         out.println("</ul>");
168         DictionaryFormatter.writeFooter(out);
169         this.getLog().info("finished generating dictionary documentation");
170     }
171 }