/* * Sonar Codesize Plugin * Copyright (C) 2010 Matthijs Galesloot * dev@sonar.codehaus.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.sonar.plugins.codesize; import java.io.File; import java.io.IOException; import java.nio.charset.Charset; import java.util.ArrayList; import java.util.List; import org.apache.commons.io.FileUtils; import org.apache.commons.io.LineIterator; import org.codehaus.plexus.util.DirectoryScanner; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Count lines of code in a file. * * @author Matthijs Galesloot * @since 1.0 * */ class LineCounter { private static final Logger LOG = LoggerFactory.getLogger(LineCounter.class); private Charset defaultCharset = Charset.defaultCharset(); public int calculateLinesOfCode(File baseDir, FileSetDefinition fileSetDefinition) { List<File> files = getFiles(baseDir, fileSetDefinition.getIncludes(), fileSetDefinition.getExcludes()); LOG.debug("Found " + files.size() + " files"); int lines = 0; for (File file : files) { lines += countFile(file); } return lines; } private int countFile(File file) { int lines = 0; LineIterator lineIterator = null; try { lineIterator = FileUtils.lineIterator(file, defaultCharset.name()); for (; lineIterator.hasNext(); lineIterator.next()) { lines++; } } catch (IOException e) { LOG.error("Could not open file", e); } finally { LineIterator.closeQuietly(lineIterator); } LOG.debug(file.getName() + ": " + lines); return lines; } private List<File> getFiles(File directory, List<String> includes, List<String> excludes) { List<File> fileList = new ArrayList<File>(); // set up scanner DirectoryScanner scanner = new DirectoryScanner(); scanner.setBasedir(directory); scanner.setIncludes(includes.toArray(new String[includes.size()])); scanner.setExcludes(excludes.toArray(new String[excludes.size()])); scanner.scan(); // start scan for (String fileName : scanner.getIncludedFiles()) { fileList.add(new File(directory, fileName)); } return fileList; } public void setDefaultCharset(Charset defaultCharset) { this.defaultCharset = defaultCharset; } }