View Javadoc
1   /**
2    * Copyright 2004-2014 The Kuali Foundation
3    *
4    * Licensed under the Educational Community License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    * http://www.opensource.org/licenses/ecl2.php
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  /**
17   * 
18   */
19  package org.kuali.student.common.mojo;
20  
21  import java.io.File;
22  import java.io.IOException;
23  import java.util.ArrayList;
24  import java.util.Collection;
25  import java.util.HashSet;
26  import java.util.LinkedHashSet;
27  import java.util.List;
28  import java.util.Set;
29  
30  import org.apache.commons.lang.StringEscapeUtils;
31  import org.apache.commons.lang.StringUtils;
32  import org.apache.maven.plugin.AbstractMojo;
33  import org.apache.maven.project.MavenProject;
34  import org.kuali.student.contract.model.ServiceContractModel;
35  import org.kuali.student.contract.model.impl.ServiceContractModelCache;
36  import org.kuali.student.contract.model.impl.ServiceContractModelQDoxLoader;
37  import org.kuali.student.contract.model.validation.ServiceContractModelValidator;
38  import org.slf4j.Logger;
39  import org.slf4j.LoggerFactory;
40  
41  import com.thoughtworks.qdox.directorywalker.DirectoryScanner;
42  import com.thoughtworks.qdox.directorywalker.FileVisitor;
43  import com.thoughtworks.qdox.directorywalker.SuffixFilter;
44  
45  /**
46   * 
47   * The basic Kuali Student Mojo that defines things like the source lookup path.
48   * 
49   * @author ocleirig
50   * 
51   */
52  public abstract class AbstractKSMojo extends AbstractMojo {
53  
54  	private static final Logger log = LoggerFactory.getLogger(AbstractKSMojo.class);
55  	
56  	/**
57  	 * @parameter
58  	 **/
59  	private List<String> sourceDirs;
60  	
61  	/**
62  	 * @parameter
63  	 */
64  	private List<String>contextSourceDirs;
65  
66  	public AbstractKSMojo() {
67  		super();
68  	}
69  
70  	public List<String> getSourceDirs() {
71  		return sourceDirs;
72  	}
73  
74  	public void setSourceDirs(List<String> sourceDirs) {
75  		this.sourceDirs = sourceDirs;
76  	}
77  	
78  	
79  	
80  	/**
81  	 * @return the contextSourceDirs
82  	 */
83  	public List<String> getContextSourceDirs() {
84  		return contextSourceDirs;
85  	}
86  
87  	/**
88  	 * @param contextSourceDirs the contextSourceDirs to set
89  	 */
90  	public void setContextSourceDirs(List<String> contextSourceDirs) {
91  		this.contextSourceDirs = contextSourceDirs;
92  	}
93  
94  
95  
96  	protected final Set<String>localPackages = new HashSet<String>();
97  	
98  
99  	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 }