001    /**
002     * Copyright 2004-2014 The Kuali Foundation
003     *
004     * Licensed under the Educational Community License, Version 2.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/ecl2.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.util.ArrayList;
020    import java.util.Collection;
021    import java.util.HashSet;
022    import java.util.List;
023    import java.util.Map;
024    import java.util.Set;
025    
026    import org.apache.maven.plugin.AbstractMojo;
027    import org.apache.maven.plugin.MojoExecutionException;
028    
029    import org.kuali.student.common.mojo.AbstractKSMojo;
030    import org.kuali.student.contract.model.ServiceContractModel;
031    import org.kuali.student.contract.model.XmlType;
032    import org.kuali.student.contract.model.impl.ServiceContractModelCache;
033    import org.kuali.student.contract.model.impl.ServiceContractModelQDoxLoader;
034    import org.kuali.student.datadictionary.util.KradDictionaryCreator;
035    import org.kuali.student.contract.model.validation.ServiceContractModelValidator;
036    import org.slf4j.Logger;
037    import org.slf4j.LoggerFactory;
038    
039    /**
040     * The plugin entrypoint which is used to generate dictionary files based on the contract
041     * @phase generate-sources
042     * @goal ksdictionarycreator
043     */
044    public class KSDictionaryCreatorMojo extends AbstractKSMojo {
045    
046            private static final Logger log = LoggerFactory.getLogger(KSDictionaryCreatorMojo.class);
047            
048        /**
049         * @parameter default-value=true
050         **/
051        private boolean throwExceptionIfNotAllFilesProcessed;
052       
053        /**
054         * @parameter property="outputDirectory" default-value="${project.build.directory}/generated-sources/datadictionary"
055         */
056        private File outputDirectory;
057        /**
058         * @parameter default-value=false
059         */
060        private boolean writeManual;
061        /**
062         * @parameter default-value=true
063         */
064        private boolean writeGenerated;
065        
066        /**
067         * @parameter 
068         */
069        private Map<String, String>typeOverrides;
070        
071        public boolean isThrowExceptionIfNotAllFilesProcessed() {
072            return throwExceptionIfNotAllFilesProcessed;
073        }
074    
075        public void setThrowExceptionIfNotAllFilesProcessed(boolean throwExceptionIfNotAllFilesProcessed) {
076            this.throwExceptionIfNotAllFilesProcessed = throwExceptionIfNotAllFilesProcessed;
077        }
078    
079        public File getOutputDirectory() {
080            return outputDirectory;
081        }
082    
083    
084        public boolean isWriteManual() {
085            return writeManual;
086        }
087    
088        public boolean isWriteGenerated() {
089            return writeGenerated;
090        }
091    
092        public void setWriteManual(boolean writeManual) {
093            this.writeManual = writeManual;
094        }
095    
096        public void setWriteGenerated(boolean writeGenerated) {
097            this.writeGenerated = writeGenerated;
098        }
099    
100        public void setOutputDirectory(File htmlDirectory) {
101            this.outputDirectory = htmlDirectory;
102        }
103    
104        @Override
105        public void execute() throws MojoExecutionException {
106            getLog().info("generating ks-XXX-dictionary.xml files=" + this.writeManual);
107            getLog().info("generating ks-XXX-dictionary-generated.xml files=" + this.writeGenerated);
108            ServiceContractModel model = this.getModel();
109            this.validate(model);
110    
111            // build the list of expected files types to generate the dictionary files for.
112            Set<String> lowerClasses = new HashSet<String>();
113            
114            for (XmlType type : model.getXmlTypes()) {
115                    
116                    String className = type.getName().toLowerCase();
117                    
118                    // skip non Info classes and r1 services
119                    if (!className.endsWith("info") || className.matches("\\.r1\\."))
120                            continue;
121                    
122                    // exclude things in packages that are not local
123                    if (this.localPackages.contains(type.getJavaPackage())) {
124                            lowerClasses.add(className);
125                    }
126                    }
127    
128            String dictionaryDirectory = this.outputDirectory.toString();
129            
130            
131            for (XmlType xmlType : model.getXmlTypes()) {
132                if (lowerClasses.contains(xmlType.getName().toLowerCase())) {
133                    lowerClasses.remove(xmlType.getName().toLowerCase());
134                    String xmlObject = xmlType.getName();
135                    KradDictionaryCreator writer =
136                                            new KradDictionaryCreator(dictionaryDirectory,
137                                            model,
138                                            xmlObject,
139                                            writeManual,
140                                            writeGenerated, 
141                                            typeOverrides);
142                    try {
143                                            
144                                            writer.write();
145                                    } catch (Exception e) {
146                                            log.warn("Generate Failed for: " + xmlObject, e);
147                                            writer.delete();
148                                            
149                                    }
150                    
151                }
152            }
153            if (!lowerClasses.isEmpty()) {
154                StringBuilder buf = new StringBuilder();
155                buf.append(lowerClasses.size());
156                buf.append(" classes were not processed: ");
157                String comma = "";
158                for (String className : lowerClasses) {
159                    buf.append(comma);
160                    buf.append(className);
161                    comma = ", ";
162                }
163                if (throwExceptionIfNotAllFilesProcessed) {
164                    throw new MojoExecutionException(buf.toString());
165                }
166                else
167                {
168                   log.info(buf.toString());
169                }
170            }
171        }
172    }