Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added .DS_Store
Binary file not shown.
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@
*/*/*.csv
csv/

/output
/.idea/

tempDesigniteDebugLog*.txt
tempDesigniteLog*.txt
designCodeSmells.txt
Expand All @@ -22,4 +25,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