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