001 package org.kuali.student.datadictionary.mojo;
002
003 import java.io.File;
004 import java.util.Collection;
005 import java.util.HashSet;
006 import java.util.List;
007 import java.util.Set;
008
009 import org.apache.maven.plugin.AbstractMojo;
010 import org.apache.maven.plugin.MojoExecutionException;
011
012 import org.kuali.student.contract.model.ServiceContractModel;
013 import org.kuali.student.contract.model.XmlType;
014 import org.kuali.student.contract.model.impl.ServiceContractModelCache;
015 import org.kuali.student.contract.model.impl.ServiceContractModelQDoxLoader;
016 import org.kuali.student.datadictionary.util.KradDictionaryCreator;
017 import org.kuali.student.contract.model.validation.ServiceContractModelValidator;
018 import org.slf4j.Logger;
019 import org.slf4j.LoggerFactory;
020
021 /**
022 * The plugin entrypoint which is used to generate dictionary files based on the contract
023 * @phase generate-sources
024 * @goal ksdictionarycreator
025 */
026 public class KSDictionaryCreatorMojo extends AbstractMojo {
027
028 private static final Logger log = LoggerFactory.getLogger(KSDictionaryCreatorMojo.class);
029
030 /**
031 * @parameter expression=true
032 **/
033 private boolean throwExceptionIfNotAllFilesProcessed;
034 /**
035 * @parameter
036 **/
037 private List<String> sourceDirs;
038 /**
039 * @parameter expression="${outputDirectory}" default-value="${project.build.directory}/generated-sources/datadictionary"
040 */
041 private File outputDirectory;
042 /**
043 * @parameter expression=false
044 */
045 private boolean writeManual;
046 /**
047 * @parameter expression=true
048 */
049 private boolean writeGenerated;
050
051 public boolean isThrowExceptionIfNotAllFilesProcessed() {
052 return throwExceptionIfNotAllFilesProcessed;
053 }
054
055 public void setThrowExceptionIfNotAllFilesProcessed(boolean throwExceptionIfNotAllFilesProcessed) {
056 this.throwExceptionIfNotAllFilesProcessed = throwExceptionIfNotAllFilesProcessed;
057 }
058
059 public File getOutputDirectory() {
060 return outputDirectory;
061 }
062
063 public List<String> getSourceDirs() {
064 return sourceDirs;
065 }
066
067 public boolean isWriteManual() {
068 return writeManual;
069 }
070
071 public boolean isWriteGenerated() {
072 return writeGenerated;
073 }
074
075 public void setWriteManual(boolean writeManual) {
076 this.writeManual = writeManual;
077 }
078
079 public void setWriteGenerated(boolean writeGenerated) {
080 this.writeGenerated = writeGenerated;
081 }
082
083 public void setOutputDirectory(File htmlDirectory) {
084 this.outputDirectory = htmlDirectory;
085 }
086
087 public void setSourceDirs(List<String> sourceDirs) {
088 this.sourceDirs = sourceDirs;
089 }
090
091 private ServiceContractModel getModel() {
092 ServiceContractModel instance = new ServiceContractModelQDoxLoader(
093 sourceDirs);
094 return new ServiceContractModelCache(instance);
095 }
096
097 private boolean validate(ServiceContractModel model) {
098 Collection<String> errors = new ServiceContractModelValidator(model).validate();
099 if (errors.size() > 0) {
100 StringBuilder buf = new StringBuilder();
101 buf.append(errors.size()).append(" errors found while validating the data.");
102 return false;
103 }
104 return true;
105 }
106
107 @Override
108 public void execute() throws MojoExecutionException {
109 getLog().info("generating ks-XXX-dictionary.xml files=" + this.writeManual);
110 getLog().info("generating ks-XXX-dictionary-generated.xml files=" + this.writeGenerated);
111 ServiceContractModel model = this.getModel();
112 this.validate(model);
113
114 // build the list of expected files types to generate the dictionary files for.
115 Set<String> lowerClasses = new HashSet<String>();
116
117 for (XmlType type : model.getXmlTypes()) {
118 lowerClasses.add(type.getName().toLowerCase());
119 }
120
121 String dictionaryDirectory = this.outputDirectory.toString();
122 for (XmlType xmlType : model.getXmlTypes()) {
123 if (lowerClasses.contains(xmlType.getName().toLowerCase())) {
124 lowerClasses.remove(xmlType.getName().toLowerCase());
125 String xmlObject = xmlType.getName();
126 KradDictionaryCreator writer =
127 new KradDictionaryCreator(dictionaryDirectory,
128 model,
129 xmlObject,
130 writeManual,
131 writeGenerated);
132 try {
133
134 writer.write();
135 } catch (Exception e) {
136 log.warn("Generate Failed for: " + xmlObject, e);
137 writer.delete();
138
139 }
140 }
141 }
142 if (!lowerClasses.isEmpty()) {
143 StringBuilder buf = new StringBuilder();
144 buf.append(lowerClasses.size());
145 buf.append(" classes were not processed: ");
146 String comma = "";
147 for (String className : lowerClasses) {
148 buf.append(comma);
149 buf.append(className);
150 comma = ", ";
151 }
152 if (throwExceptionIfNotAllFilesProcessed) {
153 throw new MojoExecutionException(buf.toString());
154 }
155 else
156 {
157 log.info(buf.toString());
158 }
159 }
160 }
161 }