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
019 /**
020 * The plugin entrypoint which is used to generate dictionary files based on the contract
021 * @phase generate-sources
022 * @goal ksdictionarycreator
023 */
024 public class KSDictionaryCreatorMojo extends AbstractMojo {
025
026 /**
027 * @parameter expression=true
028 **/
029 private boolean throwExceptionIfNotAllFilesProcessed;
030 /**
031 * @parameter
032 **/
033 private List<String> sourceDirs;
034 /**
035 * @parameter expression="${outputDirectory}" default-value="${project.build.directory}/generated-sources/datadictionary"
036 */
037 private File outputDirectory;
038 /**
039 * @parameter expression=false
040 */
041 private boolean writeManual;
042 /**
043 * @parameter expression=true
044 */
045 private boolean writeGenerated;
046 /**
047 * @parameter
048 */
049 private List<String> classNames;
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 List<String> getClassNames() {
076 return classNames;
077 }
078
079 public void setClassNames(List<String> classNames) {
080 this.classNames = classNames;
081 }
082
083 public void setWriteManual(boolean writeManual) {
084 this.writeManual = writeManual;
085 }
086
087 public void setWriteGenerated(boolean writeGenerated) {
088 this.writeGenerated = writeGenerated;
089 }
090
091 public void setOutputDirectory(File htmlDirectory) {
092 this.outputDirectory = htmlDirectory;
093 }
094
095 public void setSourceDirs(List<String> sourceDirs) {
096 this.sourceDirs = sourceDirs;
097 }
098
099 private ServiceContractModel getModel() {
100 ServiceContractModel instance = new ServiceContractModelQDoxLoader(
101 sourceDirs);
102 return new ServiceContractModelCache(instance);
103 }
104
105 private boolean validate(ServiceContractModel model) {
106 Collection<String> errors = new ServiceContractModelValidator(model).validate();
107 if (errors.size() > 0) {
108 StringBuilder buf = new StringBuilder();
109 buf.append(errors.size()).append(" errors found while validating the data.");
110 return false;
111 }
112 return true;
113 }
114
115 @Override
116 public void execute() throws MojoExecutionException {
117 getLog().info("generating ks-XXX-dictionary.xml files=" + this.writeManual);
118 getLog().info("generating ks-XXX-dictionary-generated.xml files=" + this.writeGenerated);
119 ServiceContractModel model = this.getModel();
120 this.validate(model);
121
122 Set<String> lowerClasses = new HashSet();
123 for (String className : classNames) {
124 lowerClasses.add(className.toLowerCase());
125 }
126
127 String dictionaryDirectory = this.outputDirectory.toString();
128 for (XmlType xmlType : model.getXmlTypes()) {
129 if (lowerClasses.contains(xmlType.getName().toLowerCase())) {
130 lowerClasses.remove(xmlType.getName().toLowerCase());
131 String xmlObject = xmlType.getName();
132 KradDictionaryCreator writer =
133 new KradDictionaryCreator(dictionaryDirectory,
134 model,
135 xmlObject,
136 writeManual,
137 writeGenerated);
138 writer.write();
139 }
140 }
141 if (!lowerClasses.isEmpty()) {
142 StringBuilder buf = new StringBuilder();
143 buf.append(lowerClasses.size());
144 buf.append(" classes were not processed: ");
145 String comma = "";
146 for (String className : lowerClasses) {
147 buf.append(comma);
148 buf.append(className);
149 comma = ", ";
150 }
151 if (throwExceptionIfNotAllFilesProcessed) {
152 throw new MojoExecutionException(buf.toString());
153 }
154 else
155 {
156 getLog ().info(buf);
157 }
158 }
159 }
160 }