001 /** 002 * Copyright 2004-2013 The Kuali Foundation 003 * 004 * Licensed under the Educational Community License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.opensource.org/licenses/ecl2.php 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 /** 017 * 018 */ 019 package org.kuali.student.common.mojo; 020 021 import java.io.File; 022 import java.io.IOException; 023 import java.util.ArrayList; 024 import java.util.Collection; 025 import java.util.HashSet; 026 import java.util.LinkedHashSet; 027 import java.util.List; 028 import java.util.Set; 029 030 import org.apache.commons.lang.StringEscapeUtils; 031 import org.apache.commons.lang.StringUtils; 032 import org.apache.maven.plugin.AbstractMojo; 033 import org.apache.maven.project.MavenProject; 034 import org.kuali.student.contract.model.ServiceContractModel; 035 import org.kuali.student.contract.model.impl.ServiceContractModelCache; 036 import org.kuali.student.contract.model.impl.ServiceContractModelQDoxLoader; 037 import org.kuali.student.contract.model.validation.ServiceContractModelValidator; 038 import org.slf4j.Logger; 039 import org.slf4j.LoggerFactory; 040 041 import com.thoughtworks.qdox.directorywalker.DirectoryScanner; 042 import com.thoughtworks.qdox.directorywalker.FileVisitor; 043 import com.thoughtworks.qdox.directorywalker.SuffixFilter; 044 045 /** 046 * 047 * The basic Kuali Student Mojo that defines things like the source lookup path. 048 * 049 * @author ocleirig 050 * 051 */ 052 public abstract class AbstractKSMojo extends AbstractMojo { 053 054 private static final Logger log = LoggerFactory.getLogger(AbstractKSMojo.class); 055 056 /** 057 * @parameter 058 **/ 059 private List<String> sourceDirs; 060 061 /** 062 * @parameter 063 */ 064 private List<String>contextSourceDirs; 065 066 public AbstractKSMojo() { 067 super(); 068 } 069 070 public List<String> getSourceDirs() { 071 return sourceDirs; 072 } 073 074 public void setSourceDirs(List<String> sourceDirs) { 075 this.sourceDirs = sourceDirs; 076 } 077 078 079 080 /** 081 * @return the contextSourceDirs 082 */ 083 public List<String> getContextSourceDirs() { 084 return contextSourceDirs; 085 } 086 087 /** 088 * @param contextSourceDirs the contextSourceDirs to set 089 */ 090 public void setContextSourceDirs(List<String> contextSourceDirs) { 091 this.contextSourceDirs = contextSourceDirs; 092 } 093 094 095 096 protected final Set<String>localPackages = new HashSet<String>(); 097 098 099 protected final ServiceContractModel getModel() { 100 101 Set<String> modelSourceDirectories = new LinkedHashSet<String>(); 102 103 MavenProject project = (MavenProject) getPluginContext().get("project"); 104 /* 105 * Default to the source directory that the plugin is run from. 106 */ 107 108 if (sourceDirs == null) { 109 modelSourceDirectories.add(project.getBuild().getSourceDirectory()); 110 111 } else { 112 modelSourceDirectories.addAll(sourceDirs); 113 } 114 if (modelSourceDirectories.size() == 0) 115 throw new RuntimeException("No Source Directories are defined"); 116 117 for (String directory : modelSourceDirectories) { 118 119 DirectoryScanner scanner = new DirectoryScanner(new File (directory)); 120 scanner.addFilter(new SuffixFilter(".java")); 121 scanner.scan(new FileVisitor() { 122 public void visitFile(File currentFile) { 123 124 String path = currentFile.getPath(); 125 126 int startIndex = path.indexOf("org" + File.separator + "kuali"); 127 128 if (startIndex != -1) { 129 130 String subPath = path.substring(startIndex); 131 132 String[] parts = subPath.split(StringEscapeUtils.escapeJava(File.separator)); 133 134 StringBuilder packageBuilder = new StringBuilder(); 135 136 for (int i = 0; i < parts.length-1; i++) { 137 if (i != 0) 138 packageBuilder.append("."); 139 140 packageBuilder.append(parts[i]); 141 } 142 143 String pkg = packageBuilder.toString(); 144 145 localPackages.add(pkg); 146 } 147 } 148 }); 149 } 150 151 if (contextSourceDirs != null) 152 modelSourceDirectories.addAll(contextSourceDirs); 153 154 ServiceContractModel instance = new ServiceContractModelQDoxLoader( 155 new ArrayList<String>(modelSourceDirectories)); 156 157 return new ServiceContractModelCache(instance); 158 } 159 160 protected final boolean validate(ServiceContractModel model) { 161 Collection<String> errors = new ServiceContractModelValidator(model) 162 .validate(); 163 if (errors.size() > 0) { 164 165 StringBuilder buf = new StringBuilder(); 166 buf.append(errors.size()).append( 167 " errors found while validating the data."); 168 int cnt = 0; 169 for (String msg : errors) { 170 cnt++; 171 buf.append("\n"); 172 buf.append("*error*").append(cnt).append(":").append(msg); 173 } 174 175 buf.append(errors.size()).append( 176 " errors found while validating the data."); 177 return false; 178 } 179 return true; 180 } 181 182 }