Skip to content
9 changes: 8 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,13 @@
*/*/*.csv
csv/

# Ignore Mac DS_Store files
.DS_Store
**/.DS_Store

/output
/.idea/

tempDesigniteDebugLog*.txt
tempDesigniteLog*.txt
designCodeSmells.txt
Expand All @@ -22,4 +29,4 @@ designCodeSmells.txt
hs_err_pid*
/bin/
/target/
target/
target/
30 changes: 30 additions & 0 deletions src/Designite/ArgumentParser/ArgumentParser.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package Designite.ArgumentParser;

import org.apache.commons.cli.Option;


public abstract class ArgumentParser {
/**
* {@code createRequiredOption}. A method to initialise required {@link Option}.
* @param shortOpt
* @param longOpt
* @param description
* @return
*/
Option createRequiredOption(String shortOpt, String longOpt, String description) {
Option option = new Option(shortOpt, longOpt, true, description);
option.setRequired(true);
return option;
}

/**
* {@code parseArguments} converts the appropriate {@code args} parameter from the system.
* It extracts the data from system arguments.
* @param args
* @return
*/
public abstract InputArgs parseArguments(String[] args);



}
41 changes: 41 additions & 0 deletions src/Designite/ArgumentParser/CLIArgumentParser.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package Designite.ArgumentParser;

import Designite.utils.DJLogger;
import org.apache.commons.cli.*;

/**
* {@code CLIArgumentParser} is a subclass of {@code ArgumentParser} that requires arguments from
* the console application in order to process the given arguments.
*/
public class CLIArgumentParser extends ArgumentParser {

@Override
public InputArgs parseArguments(String[] args) {
Options argOptions = new Options();
argOptions.addOption(this.createRequiredOption("i", "Input", "Input source folder path"));
argOptions.addOption(this.createRequiredOption("o", "Output", "Path to the output folder"));
CommandLineParser parser = new DefaultParser();
HelpFormatter formatter = new HelpFormatter();
CommandLine cmd = null;
try {
cmd = parser.parse(argOptions, args);
} catch (ParseException e) {
System.out.println(e.getMessage());
formatter.printHelp("Designite", argOptions);
DJLogger.log("Quitting..");
System.exit(1);
}
String inputFolderPath = cmd.getOptionValue("Input");
String outputFolderPath = cmd.getOptionValue("Output");
try {
return new InputArgs(inputFolderPath, outputFolderPath);
} catch (IllegalArgumentException ex) {
DJLogger.log(ex.getMessage());
DJLogger.log("Quitting..");
System.err.printf("The specified input path does not exist: %s%n", inputFolderPath);
System.exit(3);
}
return null;
}

}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package Designite;
package Designite.ArgumentParser;

import java.io.File;

Expand Down
30 changes: 30 additions & 0 deletions src/Designite/ArgumentParser/RegularArgumentParser.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package Designite.ArgumentParser;

import Designite.utils.DJLogger;

import java.io.File;


/**
* {@code RegularArgumentParser} is a subclass of {@code ArgumentParser} that does not require any
* arguments. By default, it will use the current working directory (cwd) of the Java project
* to identify or analyze the smells in the current working project itself.
*/
public class RegularArgumentParser extends ArgumentParser {

@Override
public InputArgs parseArguments(String[] args) {
String cwd = System.getProperty("user.dir");
String inputFolderPath = String.join(File.separator, cwd, "src","Designite");
String outputFolderPath = String.join(File.separator, cwd, "output");
try {
return new InputArgs(inputFolderPath, outputFolderPath);
} catch (IllegalArgumentException ex) {
DJLogger.log(ex.getMessage());
DJLogger.log("Quitting..");
System.exit(3);
}
return null;
}

}
158 changes: 39 additions & 119 deletions src/Designite/Designite.java
Original file line number Diff line number Diff line change
@@ -1,134 +1,54 @@
package Designite;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import Designite.SourceModel.*;
import Designite.ArgumentParser.ArgumentParser;
import Designite.ArgumentParser.CLIArgumentParser;
import Designite.ArgumentParser.InputArgs;
import Designite.ArgumentParser.RegularArgumentParser;
import Designite.SourceModel.SM_Project;
import Designite.utils.Constants;
import Designite.utils.Logger;
import Designite.utils.DJLogger;

import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.nio.file.Files;
import java.nio.file.LinkOption;
import java.nio.file.Path;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import org.apache.commons.cli.*;

/**
*
* This is the start of the project
*/
public class Designite {
public static void main(String[] args) throws IOException {
InputArgs argsObj = parseArguments(args);
SM_Project project = new SM_Project(argsObj);
Logger.logFile = getlogFileName(argsObj);
//TODO: log the version number
project.parse();
project.resolve();
project.computeMetrics();
project.detectCodeSmells();
if (Constants.DEBUG)
writeDebugLog(argsObj, project);
Logger.log("Done.");
}

private static void writeDebugLog(InputArgs argsObj, SM_Project project) {
PrintWriter writer = getDebugLogStream(argsObj);
project.printDebugLog(writer);
if (writer != null)
writer.close();
}

private static InputArgs parseArguments(String[] args) {
Options argOptions = new Options();

Option input = new Option("i", "Input", true, "Input source folder path");
input.setRequired(true);
argOptions.addOption(input);

Option output = new Option("o", "Output", true, "Path to the output folder");
output.setRequired(true);
argOptions.addOption(output);

CommandLineParser parser = new DefaultParser();
HelpFormatter formatter = new HelpFormatter();
CommandLine cmd = null;

try {
cmd = parser.parse(argOptions, args);
} catch (ParseException e) {
System.out.println(e.getMessage());
formatter.printHelp("Designite", argOptions);
Logger.log("Quitting..");
System.exit(1);
}
if(cmd==null)
{
System.out.println("Couldn't parse the command line arguments.");
formatter.printHelp("Designite", argOptions);
Logger.log("Quitting..");
System.exit(2);
public static void main(String[] args) throws FileNotFoundException {
ArgumentParser argumentParser = (Constants.DEBUG) ? new RegularArgumentParser() : new CLIArgumentParser();
InputArgs argsObj = argumentParser.parseArguments(args);
DJLogger.getInstance().setOutputDirectory(argsObj.getOutputFolder());
SM_Project project = new SM_Project(argsObj);
project.parse();
project.resolve();
project.computeMetrics();
project.detectCodeSmells();
writeDebugLog(argsObj, project);
DJLogger.log("Done.");
}

private static void writeDebugLog(InputArgs argsObj, SM_Project project) {
if (Constants.DEBUG) {
PrintWriter writer = getDebugLogStream(argsObj);
project.printDebugLog(writer);
if (writer != null) writer.close();
}

String inputFolderPath = cmd.getOptionValue("Input");
String outputFolderPath = cmd.getOptionValue("Output");

InputArgs inputArgs= null;
try
{
inputArgs = new InputArgs(inputFolderPath, outputFolderPath);
}

private static PrintWriter getDebugLogStream(InputArgs argsObj) {
PrintWriter writer = null;
if (!argsObj.getOutputFolder().equals("")) {
String timeStamp = new SimpleDateFormat("ddMMyyyy_HHmm").format(Calendar.getInstance().getTime());
String filename = argsObj.getOutputFolder() + "DesigniteDebugLog" + timeStamp + ".txt";
try {
writer = new PrintWriter(filename);
} catch (FileNotFoundException ex) {
DJLogger.log(ex.getMessage());
}
}
catch(IllegalArgumentException ex)
{
Logger.log(ex.getMessage());
Logger.log("Quitting..");
System.exit(3);
}
return inputArgs;
}

private static String getlogFileName(InputArgs argsObj) {
String file = null;
String timeStamp = new SimpleDateFormat("ddMMyyyy_HHmm").format(Calendar.getInstance().getTime());
file = argsObj.getOutputFolder() + File.separator + "DesigniteLog" + timeStamp + ".txt";
ensureOutputFolderExists(argsObj.getOutputFolder());
return file;
}

private static void ensureOutputFolderExists(String outputFolder) {
if (outputFolder == null)
return;
File folder = new File(outputFolder);

if (folder.exists() && folder.isDirectory())
return;

try
{
boolean isCreated = folder.mkdirs();
if (!isCreated)
{
System.out.println("Couldn't create output folder.");
}
}
catch (Exception ex)
{
System.out.println("Couldn't create output folder. " + ex.getMessage());
}
}
private static PrintWriter getDebugLogStream(InputArgs argsObj) {
PrintWriter writer = null;
if (!argsObj.getOutputFolder().equals("")) {
String timeStamp = new SimpleDateFormat("ddMMyyyy_HHmm").format(Calendar.getInstance().getTime());
String filename = argsObj.getOutputFolder() + "DesigniteDebugLog" + timeStamp + ".txt";
try {
writer = new PrintWriter(filename);
} catch (FileNotFoundException ex) {
Logger.log(ex.getMessage());
}
}
return writer;
}
return writer;
}
}
6 changes: 3 additions & 3 deletions src/Designite/SourceModel/Resolver.java
Original file line number Diff line number Diff line change
Expand Up @@ -210,7 +210,7 @@ private void inferTypeInfo(SM_Project parentProject, TypeInfo typeInfo, Type typ
// ProblemReferenceBinding and consequently to MissingTypeBinding
if (iType == null) {
inferPrimitiveType(parentProject, typeInfo, iType);
infereParametrized(parentProject, typeInfo, iType);
inferParametrized(parentProject, typeInfo, iType);
} else if (iType.isRecovered()) {
// Search in the ast explicitly and assign
String unresolvedTypeName = typeOfVar.toString().replace("[]", ""); // cover the Array case
Expand All @@ -220,7 +220,7 @@ private void inferTypeInfo(SM_Project parentProject, TypeInfo typeInfo, Type typ
}
} else {
inferPrimitiveType(parentProject, typeInfo, iType);
infereParametrized(parentProject, typeInfo, iType);
inferParametrized(parentProject, typeInfo, iType);
}
}

Expand Down Expand Up @@ -297,7 +297,7 @@ private void inferPrimitiveType(SM_Project parentProject, TypeInfo typeInfo, ITy
}
}

private void infereParametrized(SM_Project parentProject, TypeInfo typeInfo, ITypeBinding iType) {
private void inferParametrized(SM_Project parentProject, TypeInfo typeInfo, ITypeBinding iType) {
if (iType != null && iType.isParameterizedType()) {
typeInfo.setParametrizedType(true);
addNonPrimitiveParameters(parentProject, typeInfo, iType);
Expand Down
2 changes: 1 addition & 1 deletion src/Designite/SourceModel/SM_Package.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
import Designite.metrics.TypeMetricsExtractor;
import org.eclipse.jdt.core.dom.CompilationUnit;

import Designite.InputArgs;
import Designite.ArgumentParser.InputArgs;
import Designite.metrics.TypeMetrics;
import Designite.smells.designSmells.DesignSmellFacade;
import Designite.smells.models.DesignCodeSmell;
Expand Down
Loading