001 package org.kuali.student.contract.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.contract.model.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
028 **/
029 private List<String> sourceDirs;
030 /**
031 * @parameter expression="${outputDirectory}" default-value="${project.build.directory}/classes"
032 */
033 private File outputDirectory;
034 /**
035 * @parameter expression=false
036 */
037 private boolean writeManual;
038 /**
039 * @parameter expression=true
040 */
041 private boolean writeGenerated;
042 /**
043 * @parameter
044 */
045 private List<String> classNames;
046
047 public File getOutputDirectory() {
048 return outputDirectory;
049 }
050
051 public List<String> getSourceDirs() {
052 return sourceDirs;
053 }
054
055 public boolean isWriteManual() {
056 return writeManual;
057 }
058
059 public boolean isWriteGenerated() {
060 return writeGenerated;
061 }
062
063 public List<String> getClassNames() {
064 return classNames;
065 }
066
067 public void setClassNames(List<String> classNames) {
068 this.classNames = classNames;
069 }
070
071 public void setWriteManual(boolean writeManual) {
072 this.writeManual = writeManual;
073 }
074
075 public void setWriteGenerated(boolean writeGenerated) {
076 this.writeGenerated = writeGenerated;
077 }
078
079 public void setOutputDirectory(File htmlDirectory) {
080 this.outputDirectory = htmlDirectory;
081 }
082
083 public void setSourceDirs(List<String> sourceDirs) {
084 this.sourceDirs = sourceDirs;
085 }
086
087 private ServiceContractModel getModel() {
088 ServiceContractModel instance = new ServiceContractModelQDoxLoader(
089 sourceDirs);
090 return new ServiceContractModelCache(instance);
091 }
092
093 private boolean validate(ServiceContractModel model) {
094 Collection<String> errors = new ServiceContractModelValidator(model).validate();
095 if (errors.size() > 0) {
096 StringBuilder buf = new StringBuilder();
097 buf.append(errors.size()).append(" errors found while validating the data.");
098 return false;
099 }
100 return true;
101 }
102
103 @Override
104 public void execute() throws MojoExecutionException {
105 getLog().info("generating ks-XXX-dictionary.xml files=" + this.writeManual);
106 getLog().info("generating ks-XXX-dictionary-generated.xml files=" + this.writeGenerated);
107 ServiceContractModel model = this.getModel();
108 this.validate(model);
109
110 Set<String> lowerClasses = new HashSet();
111 for (String className : classNames) {
112 lowerClasses.add(className.toLowerCase());
113 }
114
115 String dictionaryDirectory = this.outputDirectory.toString();
116 for (XmlType xmlType : model.getXmlTypes()) {
117 if (lowerClasses.contains(xmlType.getName().toLowerCase())) {
118 lowerClasses.remove(xmlType.getName().toLowerCase());
119 String xmlObject = xmlType.getName();
120 KradDictionaryCreator writer =
121 new KradDictionaryCreator(dictionaryDirectory,
122 model,
123 xmlObject,
124 writeManual,
125 writeGenerated);
126 writer.write();
127 }
128 }
129 if (!lowerClasses.isEmpty()) {
130 StringBuilder buf = new StringBuilder();
131 buf.append(lowerClasses.size());
132 buf.append(" classes were not processed: ");
133 String comma = "";
134 for (String className : lowerClasses) {
135 buf.append(comma);
136 buf.append(className);
137 comma = ", ";
138 }
139 throw new MojoExecutionException(buf.toString());
140 }
141 }
142 }