001    /*
002     * Copyright 2011 The Kuali Foundation
003     *
004     * Licensed under the Educational Community License, Version 1.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     * http://www.opensource.org/licenses/ecl1.php
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    package org.kuali.student.datadictionary.mojo;
017    
018    import java.io.File;
019    import java.io.FileNotFoundException;
020    import java.io.FileOutputStream;
021    import java.io.OutputStream;
022    import java.io.PrintStream;
023    import java.net.MalformedURLException;
024    import java.net.URL;
025    import java.net.URLClassLoader;
026    import java.util.ArrayList;
027    import java.util.LinkedHashSet;
028    import java.util.List;
029    import java.util.Map;
030    import java.util.Set;
031    import org.apache.maven.artifact.DependencyResolutionRequiredException;
032    import org.apache.maven.plugin.AbstractMojo;
033    import org.apache.maven.plugin.MojoExecutionException;
034    import org.apache.maven.project.MavenProject;
035    import org.kuali.rice.krad.datadictionary.DataObjectEntry;
036    import org.kuali.student.datadictionary.util.DictionaryFormatter;
037    import org.kuali.student.datadictionary.util.DictionaryTesterHelper;
038    
039    /**
040     * Mojo for generating a formatted view of the data dictionary
041     * @goal ksdictionarydoc
042     * @phase site
043     * @requiresDependencyResolution test
044     */
045    public class KSDictionaryDocMojo extends AbstractMojo {
046    
047        /**
048         * @parameter expression="${project}"
049         * @required
050         * @readonly
051         */
052        private MavenProject project;
053        /**
054         * @parameter
055         **/
056        private List<String> inputFiles;
057        /**
058         * @parameter
059         **/
060        private List<String> supportFiles = new ArrayList();
061        /**
062         * @parameter expression="${htmlDirectory}" default-value="${project.build.directory}/site/services/dictionarydocs"
063         */
064        private File htmlDirectory;
065    
066        public void setHtmlDirectory(File htmlDirectory) {
067            this.htmlDirectory = htmlDirectory;
068        }
069    
070        public File getHtmlDirectory() {
071            return htmlDirectory;
072        }
073    
074        public List<String> getInputFiles() {
075            return inputFiles;
076        }
077    
078        public MavenProject getProject() {
079            return project;
080        }
081    
082        public void setInputFiles(List<String> inputFiles) {
083            this.inputFiles = inputFiles;
084        }
085    
086        public List<String> getSupportFiles() {
087            return supportFiles;
088        }
089    
090        public void setSupportFiles(List<String> supportFiles) {
091            this.supportFiles = supportFiles;
092        }
093    
094        @Override
095        public void execute()
096                throws MojoExecutionException {
097            this.getLog().info("generating dictionary documentation");
098            // add the current projects classpath to the plugin so the springbean
099            // 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    }