/*
* ModeShape (http://www.modeshape.org)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.modeshape.checkstyle;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.regex.Pattern;
/**
* @author Randall Hauch (rhauch@redhat.com)
*/
public class Header extends com.puppycrawl.tools.checkstyle.checks.header.HeaderCheck {
private Set<String> excludedFileSet;
private String excludedFilesRegex;
private Pattern excludedFilesPattern;
private final String workingDirPath = new File(".").getAbsoluteFile().getParentFile().getAbsolutePath();
private final int workingDirPathLength = workingDirPath.length();
public Header() {
}
public void setExcludedFilesRegex( String excludedFilePattern ) {
this.excludedFilesRegex = excludedFilePattern;
this.excludedFilesPattern = Pattern.compile(this.excludedFilesRegex);
}
public void setExcludedClasses( String excludedClasses ) {
this.excludedFileSet = new HashSet<>();
if (excludedClasses != null) {
for (String classname : excludedClasses.split(",")) {
if (classname != null && classname.trim().length() != 0) {
String path = classname.trim().replace('.', '/') + ".java"; // change package names to filenames ...
this.excludedFileSet.add(path.trim());
}
}
}
}
@Override
public void setHeaderFile( String aFileName ) {
// Load the file from the file ...
InputStream stream = this.getClass().getClassLoader().getResourceAsStream("modeshape.header");
if (stream == null) {
throw new RuntimeException("unable to load header file (using classloader) " + aFileName);
}
// Load the contents and place into the lines ...
try {
final LineNumberReader lnr = new LineNumberReader(new InputStreamReader(stream));
StringBuilder sb = new StringBuilder();
while (true) {
final String l = lnr.readLine();
if (l == null) {
break;
}
sb.append(l).append("\\n");
}
super.setHeader(sb.toString());
} catch (IOException e) {
throw new RuntimeException("problem reading header file (using classloader) " + aFileName, e);
}
}
protected boolean isExcluded( File file ) {
// See whether this file is excluded ...
String filename = file.getAbsolutePath().replace(File.separator, "/");
if (filename.startsWith(workingDirPath)) filename = filename.substring(workingDirPathLength);
filename = filename.replaceAll(".*/src/(main|test)/(java|resources)/", "");
// First try one of the explicit class names ...
for (String excludedFileName : excludedFileSet) {
if (filename.endsWith(excludedFileName)) return true;
}
// Next try to evaluate the pattern ...
if (excludedFilesPattern != null && excludedFilesPattern.matcher(filename).matches()) {
return true;
}
return false;
}
@Override
protected void processFiltered( File aFile,
List<String> aLines ) {
if (isExcluded(aFile)) return;
super.processFiltered(aFile, aLines);
}
}