/*
* Ada Sonar Plugin
* Copyright (C) 2010 Akram Ben Aissi
* dev@sonar.codehaus.org
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02
*/
/**
*
*/
package org.sonar.plugins.ada.gnat.metric;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.configuration.Configuration;
import org.apache.commons.lang.StringUtils;
import org.sonar.api.BatchExtension;
import org.sonar.api.resources.Project;
import org.sonar.plugins.ada.Ada;
/**
* @author Akram Ben Aissi
*
*/
public class GnatConfiguration implements BatchExtension {
private static final String GNAT_ANALYZE_ONLY_KEY = "sonar.dynamicAnalysis";
private static final Boolean GNAT_ANALYZE_ONLY_DEFAULT = Boolean.FALSE;
private static final String GNAT_EXECUTABLE_KEY = "sonar.ada.gnat.executable";
private static final String GNAT_DEFAULT_EXECUTABLE_NAME = "gnat";
private static final String GNAT_EXCLUDE_PACKAGE_KEY = "sonar.ada.gnat.exclude.modifier";
private static final String GNAT_DEFAULT_EXCLUDE_PACKAGE_MODIFIER = null;
private static final String GNAT_XML_OUTPUT_MODIFIER_KEY = "sonar.ada.xml.output.modifier";
private static final String GNAT_DEFAULT_XML_OUTPUT_MODIFIER = "-x";
private static final String GNAT_XML_OUTPUT_FILE_MODIFIER_KEY = "sonar.ada.xml.output.file.modifier";
private static final String GNAT_DEFAULT_XML_OUTPUT_FILE_MODIFIER = "-ox";
private static final String GNAT_DEFAULT_DO_NOT_GENERATE_TEXT_MODIFIER = "-nt";
private static final String GNAT_DO_NOT_GENERATE_TEXT_MODIFIER_KEY = "sonar.ada.do.not.generate.modifier";
private static final String GNAT_DIRECTORY_SEPARATOR = ",";
private static final String GNAT_SOURCE_DIRECTORIES = "";
private static final String GNAT_REPORT_FILE_RELATIVE_PATH_KEY = "sonar.ada.report.directory";
private static final String GNAT_DEFAULT_REPORT_FILE_RELATIVE_PATH = "/logs";
private static final String GNAT_XML_OUTPUT_FILE_KEY = "sonar.ada.report.file";
private static final String GNAT_DEFAULT_XML_OUTPUT_FILE = "metrics.xml";
private static final String GNAT_DEFAULT_DEFAULT_ARGUMENT = "metric";
private static final String GNAT_DEFAULT_ARGUMENT_KEY = "sonar.ada.default.argument";
private static final String GNAT_DEFAULT_IGNORE_DIRECTORY_MODIFIER = "";
private static final String GNAT_IGNORE_DIRECTORY_MODIFIER_KEY = "sonar.ada.ignore.directory.modifier";
private static final String GNAT_EXCLUDE_PACKAGES_MODIFIER_KEY = "sonar.ada.exclude.package.modifier";
private static final String GNAT_DEFAULT_EXCLUDE_PACKAGES_MODIFIER = null;
private static final String GNAT_DEFAULT_IGNORED_DIRECTORIES = null;
private static final String GNAT_IGNORED_DIRECTORIES_KEY = "sonar.ada.ignored.directories";
private static final String GNAT_AUTO_INCLUDE_SOURCE_DIRS_KEY = "sonar.ada.automaticaly.include.source.directories";
private static final Boolean GNAT_AUTO_INCLUDE_SOURCE_DIRS_DEFAULT = Boolean.TRUE;
private static final String GNAT_COMPILER_ARGUMENT_MODIFIER_KEY = "sonar.ada.compiler.argument.modifier";
private static final String GNAT_DEFAULT_COMPILER_ARGUMENT_MODIFIER = "-cargs";
private static final String GNAT_COMPILER_EXTRA_ARGUMENTS_KEY = "sonar.ada.compiler.extra.arguments";
private static final String GNAT_INCLUDE_DIRECTORIES_KEY = "sonar.ada.include.directories";
private static final String GNAT_INCLUDE_DIRECTORY_MODIFIER_KEY = "sonar.ada.include.directory.modifier";
private static final String GNAT_DEFAULT_INCLUDE_DIRECTORY_MODIFIER = "-I";
private static final String GNAT_INCLUDE_LIBRARIES_KEY = "sonar.ada.include.libraries";
private static final String GNAT_INCLUDE_LIBRARY_MODIFIER_KEY = "sonar.ada.include.library.modifier";
private static final String GNAT_DEFAULT_INCLUDE_LIBRARY_MODIFIER = "-L";
protected Project project;
protected Configuration configuration;
/**
* Default constructor.
*
* @param project
*/
public GnatConfiguration(Project project) {
this.project = project;
this.configuration = project.getConfiguration();
}
/**
* Gets the report file. The path is construct as followed : {PORJECT_BUILD_DIR}\{CONFIG_RELATIVE_REPORT_FILE}\{CONFIG_REPORT_FILE_NAME}
*
* @return the report file
*/
public File getReportFile() {
String reportFileRelativePath = getReportFileRelativePath();
StringBuilder fileName = new StringBuilder(reportFileRelativePath).append(File.separator);
File reportDirectory = new File(project.getFileSystem().getBuildDir().getAbsolutePath(), reportFileRelativePath);
if ( !reportDirectory.exists()) {
reportDirectory.mkdir();
}
String reportFileName = getXmlOutputFile();
fileName.append(reportFileName);
File reportFile = new File(project.getFileSystem().getBuildDir(), fileName.toString());
return reportFile;
}
public boolean isAnalyzeOnly() {
return project.getConfiguration().getBoolean(GNAT_ANALYZE_ONLY_KEY, GNAT_ANALYZE_ONLY_DEFAULT);
}
public boolean isIncludeSourceDirectories() {
return project.getConfiguration().getBoolean(GNAT_AUTO_INCLUDE_SOURCE_DIRS_KEY, GNAT_AUTO_INCLUDE_SOURCE_DIRS_DEFAULT);
}
@SuppressWarnings("unchecked")
public List<String> getExtraArguments() {
return configuration.getList(GNAT_COMPILER_EXTRA_ARGUMENTS_KEY);
}
public List<String> getAutomaticalyIncludedDirectories() {
List<String> automaticallyIncludedDirectories = new ArrayList<String>();
List<File> sourceDirectories = project.getFileSystem().getSourceDirs();
for (File dir : sourceDirectories) {
automaticallyIncludedDirectories.add(dir.getAbsolutePath());
automaticallyIncludedDirectories.addAll(getAutomaticalyIncludedDirectories(dir));
}
return automaticallyIncludedDirectories;
}
private List<String> getAutomaticalyIncludedDirectories(File dir) {
List<String> dirs = new ArrayList<String>();
if (dir.isDirectory()) {
File[] files = dir.listFiles();
for (File file : files) {
if (file.isDirectory()) {
dirs.add(file.getAbsolutePath());
dirs.addAll(getAutomaticalyIncludedDirectories(file));
}
}
}
return dirs;
}
/**
* @return
*/
public String getExecutable() {
return configuration.getString(GNAT_EXECUTABLE_KEY, GNAT_DEFAULT_EXECUTABLE_NAME);
}
public String getXmlOutputModifier() {
return configuration.getString(GNAT_XML_OUTPUT_MODIFIER_KEY, GNAT_DEFAULT_XML_OUTPUT_MODIFIER);
}
public String getXmlOutputFileModifier() {
return configuration.getString(GNAT_XML_OUTPUT_FILE_MODIFIER_KEY, GNAT_DEFAULT_XML_OUTPUT_FILE_MODIFIER);
}
public String getXmlOutputFile() {
return configuration.getString(GNAT_XML_OUTPUT_FILE_KEY, GNAT_DEFAULT_XML_OUTPUT_FILE);
}
/**
* @return
*/
public String getReportFileRelativePath() {
return configuration.getString(GNAT_REPORT_FILE_RELATIVE_PATH_KEY, GNAT_DEFAULT_REPORT_FILE_RELATIVE_PATH);
}
/**
* @return
*/
public String getExcludedPackages() {
return configuration.getString(GNAT_EXCLUDE_PACKAGE_KEY, GNAT_DEFAULT_EXCLUDE_PACKAGE_MODIFIER);
}
public String getSourceDirectories() {
return StringUtils.join(configuration.getStringArray(GNAT_SOURCE_DIRECTORIES), GNAT_DIRECTORY_SEPARATOR);
}
public List<String> getSourceFiles() {
List<File> files = project.getFileSystem().getSourceFiles(Ada.INSTANCE);
List<String> sourceFiles = new ArrayList<String>();
for (File file : files) {
sourceFiles.add(file.getAbsolutePath());
}
return sourceFiles;
}
/**
* @return
*/
public String getCompilerArgumentModifier() {
return configuration.getString(GNAT_COMPILER_ARGUMENT_MODIFIER_KEY, GNAT_DEFAULT_COMPILER_ARGUMENT_MODIFIER);
}
public String getIncludeDirectoryModifier() {
return configuration.getString(GNAT_INCLUDE_DIRECTORY_MODIFIER_KEY, GNAT_DEFAULT_INCLUDE_DIRECTORY_MODIFIER);
}
public String getIncludeLibraryModifier() {
return configuration.getString(GNAT_INCLUDE_LIBRARY_MODIFIER_KEY, GNAT_DEFAULT_INCLUDE_LIBRARY_MODIFIER);
}
@SuppressWarnings("unchecked")
public List<String> getIncludeDirectories() {
return project.getConfiguration().getList(GNAT_INCLUDE_DIRECTORIES_KEY);
}
@SuppressWarnings("unchecked")
public List<String> getIncludeLibraries() {
return project.getConfiguration().getList(GNAT_INCLUDE_LIBRARIES_KEY);
}
public String getIgnoredDirectories() {
return configuration.getString(GNAT_IGNORED_DIRECTORIES_KEY, GNAT_DEFAULT_IGNORED_DIRECTORIES);
}
public String getDoNoteGenerateTextModifier() {
return configuration.getString(GNAT_DO_NOT_GENERATE_TEXT_MODIFIER_KEY, GNAT_DEFAULT_DO_NOT_GENERATE_TEXT_MODIFIER);
}
public String getExcludePackagesModifier() {
return configuration.getString(GNAT_EXCLUDE_PACKAGES_MODIFIER_KEY, GNAT_DEFAULT_EXCLUDE_PACKAGES_MODIFIER);
}
public String getDefaultArgument() {
return configuration.getString(GNAT_DEFAULT_ARGUMENT_KEY, GNAT_DEFAULT_DEFAULT_ARGUMENT);
}
public String getIgnoreDirectoryModifier() {
return configuration.getString(GNAT_IGNORE_DIRECTORY_MODIFIER_KEY, GNAT_DEFAULT_IGNORE_DIRECTORY_MODIFIER);
}
}