Skip to content

Commit 3321c56

Browse files
authored
Merge pull request #85 from mohammedhashim790/master
Improved SRP and extract classes/methods for better modularity
2 parents 307ddf7 + be79a8f commit 3321c56

33 files changed

+834
-716
lines changed

.gitignore

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,13 @@
77
*/*/*.csv
88
csv/
99

10+
# Ignore Mac DS_Store files
11+
.DS_Store
12+
**/.DS_Store
13+
14+
/output
15+
/.idea/
16+
1017
tempDesigniteDebugLog*.txt
1118
tempDesigniteLog*.txt
1219
designCodeSmells.txt
@@ -22,4 +29,4 @@ designCodeSmells.txt
2229
hs_err_pid*
2330
/bin/
2431
/target/
25-
target/
32+
target/
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package Designite.ArgumentParser;
2+
3+
import org.apache.commons.cli.Option;
4+
5+
6+
public abstract class ArgumentParser {
7+
/**
8+
* {@code createRequiredOption}. A method to initialise required {@link Option}.
9+
* @param shortOpt
10+
* @param longOpt
11+
* @param description
12+
* @return
13+
*/
14+
Option createRequiredOption(String shortOpt, String longOpt, String description) {
15+
Option option = new Option(shortOpt, longOpt, true, description);
16+
option.setRequired(true);
17+
return option;
18+
}
19+
20+
/**
21+
* {@code parseArguments} converts the appropriate {@code args} parameter from the system.
22+
* It extracts the data from system arguments.
23+
* @param args
24+
* @return
25+
*/
26+
public abstract InputArgs parseArguments(String[] args);
27+
28+
29+
30+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package Designite.ArgumentParser;
2+
3+
import Designite.utils.DJLogger;
4+
import org.apache.commons.cli.*;
5+
6+
/**
7+
* {@code CLIArgumentParser} is a subclass of {@code ArgumentParser} that requires arguments from
8+
* the console application in order to process the given arguments.
9+
*/
10+
public class CLIArgumentParser extends ArgumentParser {
11+
12+
@Override
13+
public InputArgs parseArguments(String[] args) {
14+
Options argOptions = new Options();
15+
argOptions.addOption(this.createRequiredOption("i", "Input", "Input source folder path"));
16+
argOptions.addOption(this.createRequiredOption("o", "Output", "Path to the output folder"));
17+
CommandLineParser parser = new DefaultParser();
18+
HelpFormatter formatter = new HelpFormatter();
19+
CommandLine cmd = null;
20+
try {
21+
cmd = parser.parse(argOptions, args);
22+
} catch (ParseException e) {
23+
System.out.println(e.getMessage());
24+
formatter.printHelp("Designite", argOptions);
25+
DJLogger.log("Quitting..");
26+
System.exit(1);
27+
}
28+
String inputFolderPath = cmd.getOptionValue("Input");
29+
String outputFolderPath = cmd.getOptionValue("Output");
30+
try {
31+
return new InputArgs(inputFolderPath, outputFolderPath);
32+
} catch (IllegalArgumentException ex) {
33+
DJLogger.log(ex.getMessage());
34+
DJLogger.log("Quitting..");
35+
System.err.printf("The specified input path does not exist: %s%n", inputFolderPath);
36+
System.exit(3);
37+
}
38+
return null;
39+
}
40+
41+
}

src/Designite/InputArgs.java renamed to src/Designite/ArgumentParser/InputArgs.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package Designite;
1+
package Designite.ArgumentParser;
22

33
import java.io.File;
44

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package Designite.ArgumentParser;
2+
3+
import Designite.utils.DJLogger;
4+
5+
import java.io.File;
6+
7+
8+
/**
9+
* {@code RegularArgumentParser} is a subclass of {@code ArgumentParser} that does not require any
10+
* arguments. By default, it will use the current working directory (cwd) of the Java project
11+
* to identify or analyze the smells in the current working project itself.
12+
*/
13+
public class RegularArgumentParser extends ArgumentParser {
14+
15+
@Override
16+
public InputArgs parseArguments(String[] args) {
17+
String cwd = System.getProperty("user.dir");
18+
String inputFolderPath = String.join(File.separator, cwd, "src","Designite");
19+
String outputFolderPath = String.join(File.separator, cwd, "output");
20+
try {
21+
return new InputArgs(inputFolderPath, outputFolderPath);
22+
} catch (IllegalArgumentException ex) {
23+
DJLogger.log(ex.getMessage());
24+
DJLogger.log("Quitting..");
25+
System.exit(3);
26+
}
27+
return null;
28+
}
29+
30+
}

src/Designite/Designite.java

Lines changed: 39 additions & 119 deletions
Original file line numberDiff line numberDiff line change
@@ -1,134 +1,54 @@
11
package Designite;
22

3-
import java.io.File;
4-
import java.io.FileNotFoundException;
5-
import java.io.IOException;
6-
import Designite.SourceModel.*;
3+
import Designite.ArgumentParser.ArgumentParser;
4+
import Designite.ArgumentParser.CLIArgumentParser;
5+
import Designite.ArgumentParser.InputArgs;
6+
import Designite.ArgumentParser.RegularArgumentParser;
7+
import Designite.SourceModel.SM_Project;
78
import Designite.utils.Constants;
8-
import Designite.utils.Logger;
9+
import Designite.utils.DJLogger;
910

11+
import java.io.FileNotFoundException;
1012
import java.io.PrintWriter;
11-
import java.nio.file.Files;
12-
import java.nio.file.LinkOption;
13-
import java.nio.file.Path;
1413
import java.text.SimpleDateFormat;
1514
import java.util.Calendar;
16-
import org.apache.commons.cli.*;
1715

1816
/**
19-
*
2017
* This is the start of the project
2118
*/
2219
public class Designite {
23-
public static void main(String[] args) throws IOException {
24-
InputArgs argsObj = parseArguments(args);
25-
SM_Project project = new SM_Project(argsObj);
26-
Logger.logFile = getlogFileName(argsObj);
27-
//TODO: log the version number
28-
project.parse();
29-
project.resolve();
30-
project.computeMetrics();
31-
project.detectCodeSmells();
32-
if (Constants.DEBUG)
33-
writeDebugLog(argsObj, project);
34-
Logger.log("Done.");
35-
}
36-
37-
private static void writeDebugLog(InputArgs argsObj, SM_Project project) {
38-
PrintWriter writer = getDebugLogStream(argsObj);
39-
project.printDebugLog(writer);
40-
if (writer != null)
41-
writer.close();
42-
}
43-
44-
private static InputArgs parseArguments(String[] args) {
45-
Options argOptions = new Options();
46-
47-
Option input = new Option("i", "Input", true, "Input source folder path");
48-
input.setRequired(true);
49-
argOptions.addOption(input);
50-
51-
Option output = new Option("o", "Output", true, "Path to the output folder");
52-
output.setRequired(true);
53-
argOptions.addOption(output);
54-
55-
CommandLineParser parser = new DefaultParser();
56-
HelpFormatter formatter = new HelpFormatter();
57-
CommandLine cmd = null;
58-
59-
try {
60-
cmd = parser.parse(argOptions, args);
61-
} catch (ParseException e) {
62-
System.out.println(e.getMessage());
63-
formatter.printHelp("Designite", argOptions);
64-
Logger.log("Quitting..");
65-
System.exit(1);
66-
}
67-
if(cmd==null)
68-
{
69-
System.out.println("Couldn't parse the command line arguments.");
70-
formatter.printHelp("Designite", argOptions);
71-
Logger.log("Quitting..");
72-
System.exit(2);
20+
public static void main(String[] args) throws FileNotFoundException {
21+
ArgumentParser argumentParser = (Constants.DEBUG) ? new RegularArgumentParser() : new CLIArgumentParser();
22+
InputArgs argsObj = argumentParser.parseArguments(args);
23+
DJLogger.getInstance().setOutputDirectory(argsObj.getOutputFolder());
24+
SM_Project project = new SM_Project(argsObj);
25+
project.parse();
26+
project.resolve();
27+
project.computeMetrics();
28+
project.detectCodeSmells();
29+
writeDebugLog(argsObj, project);
30+
DJLogger.log("Done.");
31+
}
32+
33+
private static void writeDebugLog(InputArgs argsObj, SM_Project project) {
34+
if (Constants.DEBUG) {
35+
PrintWriter writer = getDebugLogStream(argsObj);
36+
project.printDebugLog(writer);
37+
if (writer != null) writer.close();
7338
}
74-
75-
String inputFolderPath = cmd.getOptionValue("Input");
76-
String outputFolderPath = cmd.getOptionValue("Output");
77-
78-
InputArgs inputArgs= null;
79-
try
80-
{
81-
inputArgs = new InputArgs(inputFolderPath, outputFolderPath);
39+
}
40+
41+
private static PrintWriter getDebugLogStream(InputArgs argsObj) {
42+
PrintWriter writer = null;
43+
if (!argsObj.getOutputFolder().equals("")) {
44+
String timeStamp = new SimpleDateFormat("ddMMyyyy_HHmm").format(Calendar.getInstance().getTime());
45+
String filename = argsObj.getOutputFolder() + "DesigniteDebugLog" + timeStamp + ".txt";
46+
try {
47+
writer = new PrintWriter(filename);
48+
} catch (FileNotFoundException ex) {
49+
DJLogger.log(ex.getMessage());
50+
}
8251
}
83-
catch(IllegalArgumentException ex)
84-
{
85-
Logger.log(ex.getMessage());
86-
Logger.log("Quitting..");
87-
System.exit(3);
88-
}
89-
return inputArgs;
90-
}
91-
92-
private static String getlogFileName(InputArgs argsObj) {
93-
String file = null;
94-
String timeStamp = new SimpleDateFormat("ddMMyyyy_HHmm").format(Calendar.getInstance().getTime());
95-
file = argsObj.getOutputFolder() + File.separator + "DesigniteLog" + timeStamp + ".txt";
96-
ensureOutputFolderExists(argsObj.getOutputFolder());
97-
return file;
98-
}
99-
100-
private static void ensureOutputFolderExists(String outputFolder) {
101-
if (outputFolder == null)
102-
return;
103-
File folder = new File(outputFolder);
104-
105-
if (folder.exists() && folder.isDirectory())
106-
return;
107-
108-
try
109-
{
110-
boolean isCreated = folder.mkdirs();
111-
if (!isCreated)
112-
{
113-
System.out.println("Couldn't create output folder.");
114-
}
115-
}
116-
catch (Exception ex)
117-
{
118-
System.out.println("Couldn't create output folder. " + ex.getMessage());
119-
}
120-
}
121-
private static PrintWriter getDebugLogStream(InputArgs argsObj) {
122-
PrintWriter writer = null;
123-
if (!argsObj.getOutputFolder().equals("")) {
124-
String timeStamp = new SimpleDateFormat("ddMMyyyy_HHmm").format(Calendar.getInstance().getTime());
125-
String filename = argsObj.getOutputFolder() + "DesigniteDebugLog" + timeStamp + ".txt";
126-
try {
127-
writer = new PrintWriter(filename);
128-
} catch (FileNotFoundException ex) {
129-
Logger.log(ex.getMessage());
130-
}
131-
}
132-
return writer;
133-
}
52+
return writer;
53+
}
13454
}

src/Designite/SourceModel/Resolver.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ private void inferTypeInfo(SM_Project parentProject, TypeInfo typeInfo, Type typ
210210
// ProblemReferenceBinding and consequently to MissingTypeBinding
211211
if (iType == null) {
212212
inferPrimitiveType(parentProject, typeInfo, iType);
213-
infereParametrized(parentProject, typeInfo, iType);
213+
inferParametrized(parentProject, typeInfo, iType);
214214
} else if (iType.isRecovered()) {
215215
// Search in the ast explicitly and assign
216216
String unresolvedTypeName = typeOfVar.toString().replace("[]", ""); // cover the Array case
@@ -220,7 +220,7 @@ private void inferTypeInfo(SM_Project parentProject, TypeInfo typeInfo, Type typ
220220
}
221221
} else {
222222
inferPrimitiveType(parentProject, typeInfo, iType);
223-
infereParametrized(parentProject, typeInfo, iType);
223+
inferParametrized(parentProject, typeInfo, iType);
224224
}
225225
}
226226

@@ -297,7 +297,7 @@ private void inferPrimitiveType(SM_Project parentProject, TypeInfo typeInfo, ITy
297297
}
298298
}
299299

300-
private void infereParametrized(SM_Project parentProject, TypeInfo typeInfo, ITypeBinding iType) {
300+
private void inferParametrized(SM_Project parentProject, TypeInfo typeInfo, ITypeBinding iType) {
301301
if (iType != null && iType.isParameterizedType()) {
302302
typeInfo.setParametrizedType(true);
303303
addNonPrimitiveParameters(parentProject, typeInfo, iType);

src/Designite/SourceModel/SM_Package.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
import Designite.metrics.TypeMetricsExtractor;
1111
import org.eclipse.jdt.core.dom.CompilationUnit;
1212

13-
import Designite.InputArgs;
13+
import Designite.ArgumentParser.InputArgs;
1414
import Designite.metrics.TypeMetrics;
1515
import Designite.smells.designSmells.DesignSmellFacade;
1616
import Designite.smells.models.DesignCodeSmell;

0 commit comments

Comments
 (0)