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