blob: abe4357e51ba9412ec48262587b0efcbb58f4fd5 [file] [log] [blame]
package com.intellij.codeInspection;
import com.intellij.codeInspection.ex.PlainTextFormatter;
import com.intellij.openapi.diagnostic.Logger;
import com.sampullara.cli.Args;
import org.jetbrains.annotations.Nullable;
import java.io.File;
import java.io.IOException;
/**
* @author Roman.Chernyatchik
*/
public abstract class AbstractInspectionCmdlineOptions implements InspectionToolCmdlineOptions {
private static final Logger LOG = Logger.getInstance(AbstractInspectionCmdlineOptions.class);
@Nullable
protected abstract String getProfileNameOrPathProperty();
@Nullable
protected abstract String getProjectPathProperty();
@Nullable
protected abstract String getOutputPathProperty();
@Nullable
protected abstract String getDirToInspectProperty();
@Nullable
protected abstract String getOutputFormatProperty();
@Nullable
protected abstract String getXSLTSchemePathProperty();
@Nullable
protected abstract Boolean getErrorCodeRequiredProperty();
@Nullable
protected abstract Boolean getRunWithEditorSettingsProperty();
protected abstract String[] optionsBanner();
@Override
public void initApplication(InspectionApplication app) {
app.myHelpProvider = this;
app.myProjectPath = determineProjectPath();
app.myProfileName = getProfileNameOrPathProperty();
app.myOutPath = determineOutputPath();
app.mySourceDirectory = determineDirectoryToInspect(app.myProjectPath);
app.setVerboseLevel(getVerboseLevelProperty());
final Boolean errorCodeRequired = getErrorCodeRequiredProperty();
if (errorCodeRequired != null) {
app.myErrorCodeRequired = errorCodeRequired;
}
final Boolean runWithEditorSettings = getRunWithEditorSettingsProperty();
if (runWithEditorSettings != null) {
app.myRunWithEditorSettings = runWithEditorSettings;
}
final String xsltSchemePath = getXSLTSchemePathProperty();
if (xsltSchemePath != null) {
app.myOutputFormat = xsltSchemePath;
} else {
final String outputFormat = getOutputFormatProperty();
if (outputFormat != null) {
app.myOutputFormat = outputFormat.toLowerCase();
}
}
}
@Override
public void validate() throws CmdlineArgsValidationException {
// project path
final String projectPath = determineProjectPath();
if (projectPath == null) {
throw new CmdlineArgsValidationException("Project not found.");
}
else if (!new File(projectPath).exists()) {
throw new CmdlineArgsValidationException("Project '" + projectPath + "' not found.");
}
// Dir to inspect: check only if set
if (getDirToInspectProperty() != null) {
final String dirToInspect = determineDirectoryToInspect(projectPath);
if (dirToInspect == null) {
throw new CmdlineArgsValidationException("Directory '" + dirToInspect + "' not found.");
}
}
final String xsltSchemePath = getXSLTSchemePathProperty();
if (xsltSchemePath != null) {
final File xsltScheme = new File(xsltSchemePath);
if (!xsltScheme.exists()) {
throw new CmdlineArgsValidationException("XSLT scheme '" + xsltSchemePath + "' not found.");
}
}
final String outputFormat = getOutputFormatProperty();
if (outputFormat != null) {
StringBuilder builder = new StringBuilder();
for (InspectionsReportConverter converter : InspectionsReportConverter.EP_NAME.getExtensions()) {
final String converterFormat = converter.getFormatName();
if (outputFormat == converterFormat) {
builder = null;
break;
} else {
if (builder.length() != 0) {
builder.append(", ");
}
builder.append(converterFormat);
}
}
// report error if converter isn't registered.
if (builder != null) {
throw new CmdlineArgsValidationException("Unsupported format option '" + outputFormat + "'. Please use one of: " + builder.toString());
}
}
}
@Nullable
protected String determineOutputPath() {
final String outputPathProperty = getOutputPathProperty();
// if plain formatter and output path not specified - use STDOUT
// otherwise specified output path or a default one
return outputPathProperty != null ? outputPathProperty
: getOutputFormatProperty() == PlainTextFormatter.NAME ? null
: getDefaultOutputPath();
}
@Override
public void printHelpAndExit() {
final String[] bannerLines = optionsBanner();
for (String line : bannerLines) {
System.out.println(line);
}
Args.usage(this);
System.exit(1);
}
@Nullable
protected String determineProjectPath() {
final String projectPath = getProjectPathProperty();
return projectPath != null ? projectPath : getDefaultProjectPath();
}
@Nullable
protected String determineDirectoryToInspect(@Nullable final String projectPath) {
final String dirToInspect = getDirToInspectProperty();
if (dirToInspect == null) {
return null;
}
try {
// 1. By relative path
final File relativePathFile = new File(projectPath + File.separatorChar + dirToInspect);
if (relativePathFile.exists()) {
return relativePathFile.getCanonicalPath();
}
// 2. try absolute path
final File absPathFile = new File(dirToInspect);
if (absPathFile.exists()) {
return absPathFile.getCanonicalPath();
}
}
catch (IOException e) {
LOG.warn(e);
}
return null;
}
protected String getDefaultOutputPath() {
return getOutputPathProperty() + "/results";
}
@Nullable
protected String getDefaultProjectPath() {
return null;
}
}