Skip to content
This repository was archived by the owner on Jun 3, 2025. It is now read-only.

Commit 3aa5403

Browse files
authored
Merge branch 'master' into feedback-jclc
2 parents 41c5298 + 21c020b commit 3aa5403

6 files changed

Lines changed: 324 additions & 90 deletions

File tree

HACKING.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,6 @@ public class ExampleCommand extends AbstractCommand {
3131

3232
## Architecture
3333
...
34+
35+
## Debugging
36+
### Logging

src/main/java/fi/helsinki/cs/tmc/cli/command/CourseInfoCommand.java

Lines changed: 61 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -26,69 +26,94 @@
2626
public class CourseInfoCommand extends AbstractCommand {
2727
private Course course;
2828
private Exercise exercise;
29+
private CourseInfo info;
30+
private WorkDir workDir;
2931
private Io io;
3032

3133
@Override
3234
public void getOptions(Options options) {
33-
options.addOption("a", false, "Show all info for a specific course");
35+
options.addOption("a", false, "Show all information for a specific course");
36+
options.addOption("i", false, "Get the information from the server");
3437
}
3538

3639
@Override
3740
public void run(CommandLine args, Io io) {
3841
this.io = io;
39-
TmcCore core = getApp().getTmcCore();
40-
if (core == null) {
42+
workDir = getApp().getWorkDir();
43+
44+
if (!args.hasOption("i")) {
45+
printLocalCourseOrExercise(args);
4146
return;
4247
}
4348

44-
WorkDir workDir = getApp().getWorkDir();
4549
String[] stringArgs = args.getArgs();
46-
if (stringArgs.length == 0 && workDir.getConfigFile() == null) {
47-
io.println("You must give the course name as a parameter.");
50+
if (stringArgs.length == 0) {
51+
io.println("You must give a course as a parameter.");
4852
return;
4953
}
5054

51-
// if in course directory
55+
TmcCore core = getApp().getTmcCore();
56+
if (core == null) {
57+
return;
58+
}
59+
course = TmcUtil.findCourse(core, stringArgs[0]);
60+
if (course == null) {
61+
io.println("The course " + stringArgs[0] + " doesn't exist on this server.");
62+
return;
63+
}
64+
printCourse(args.hasOption("a"));
65+
}
66+
67+
private void printLocalCourseOrExercise(CommandLine args) {
5268
if (workDir.getConfigFile() != null) {
53-
CourseInfo info = CourseInfoIo.load(workDir.getConfigFile());
69+
info = CourseInfoIo.load(workDir.getConfigFile());
5470
course = info.getCourse();
71+
printCourseOrExercise(args);
72+
} else {
73+
this.io.println("You have to be in a course directory"
74+
+ " or use the -i option with the course name "
75+
+ "to get the information from the server.");
76+
}
77+
}
5578

56-
// if in exercise directory and no parameters given, print info for that exercise.
57-
// else if exercise or course name given as a parameter, check which one it is and print info for that
58-
if (workDir.getExerciseNames().size() == 1 && stringArgs.length == 0) {
59-
String currentExercise = workDir.getExerciseNames().get(0);
60-
exercise = info.getExercise(currentExercise);
61-
printOneExercise(args.hasOption("a"));
62-
return;
63-
64-
} else if (stringArgs.length != 0) {
65-
if (info.getExercise(stringArgs[0]) != null) {
66-
exercise = info.getExercise(stringArgs[0]);
67-
printOneExercise(args.hasOption("a"));
68-
return;
69-
70-
} else {
71-
course = TmcUtil.findCourse(core, stringArgs[0]);
72-
if (course != null) {
73-
printCourse(args.hasOption("a"));
74-
} else {
75-
io.println("No such course or exercise.");
76-
}
77-
return;
78-
}
79-
}
80-
printCourse(args.hasOption("a"));
79+
private void printCourseOrExercise(CommandLine args) {
80+
String[] stringArgs = args.getArgs();
81+
82+
// if in exercise directory and no parameters given, print info for that exercise.
83+
if (workDir.getExerciseNames().size() == 1 && stringArgs.length == 0) {
84+
String currentExercise = workDir.getExerciseNames().get(0);
85+
exercise = info.getExercise(currentExercise);
86+
printOneExercise(args.hasOption("a"));
8187
return;
8288
}
8389

84-
course = TmcUtil.findCourse(core, stringArgs[0]);
85-
if (course == null) {
86-
io.println("The course " + stringArgs[0] + " doesn't exist on this server.");
90+
if (stringArgs.length != 0) {
91+
printCourseOrExerciseFromParameters(args);
8792
return;
8893
}
8994
printCourse(args.hasOption("a"));
9095
}
9196

97+
private void printCourseOrExerciseFromParameters(CommandLine args) {
98+
String[] stringArgs = args.getArgs();
99+
// if parameter is given, check if it is an exercise or a course. If neither, print an error message.
100+
if (info.getExercise(stringArgs[0]) != null) {
101+
exercise = info.getExercise(stringArgs[0]);
102+
printOneExercise(args.hasOption("a"));
103+
return;
104+
105+
}
106+
course = info.getCourse();
107+
if (course != null && course.getName().equals(stringArgs[0])) {
108+
printCourse(args.hasOption("a"));
109+
} else {
110+
this.io.println("Wrong course directory."
111+
+ " Navigate to the correct course directory or"
112+
+ " use the -i option with the course name"
113+
+ " to get the information from the server.");
114+
}
115+
}
116+
92117
private void printCourse(boolean showAll) {
93118
printCourseShort();
94119
if (showAll) {

src/main/java/fi/helsinki/cs/tmc/cli/command/core/CommandAnnotationProcessor.java

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -30,38 +30,32 @@ public class CommandAnnotationProcessor extends AbstractProcessor {
3030
private static final Logger logger = LoggerFactory.getLogger(CommandAnnotationProcessor.class);
3131

3232
private static final String CLASS_NAME = "CommandList";
33-
private static final String PACKAGE_NAME = "fi.helsinki.cs.tmc.cli.command";
33+
private static final String PACKAGE_NAME = "fi.helsinki.cs.tmc.cli.command.core";
3434
private static final String TAB = " ";
3535

36-
private ProcessingEnvironment processingEnv;
37-
38-
@Override
39-
public void init(ProcessingEnvironment processingEnv) {
40-
this.processingEnv = processingEnv;
41-
}
42-
4336
private void generateSourceFile(Map<String, String> map) throws IOException {
4437
JavaFileObject jfo = processingEnv.getFiler().createSourceFile(
45-
PACKAGE_NAME + ".core." + CLASS_NAME);
38+
PACKAGE_NAME + "." + CLASS_NAME);
4639

4740
try (Writer writer = jfo.openWriter()) {
4841
BufferedWriter bwriter = new BufferedWriter(writer);
49-
bwriter.append("package ");
50-
bwriter.append(PACKAGE_NAME);
51-
bwriter.append(".core;\n\n");
42+
bwriter.append("package " + PACKAGE_NAME + ";\n\n");
43+
44+
// import the command classes
5245
bwriter.append("//CHECKSTYLE:OFF\n");
53-
bwriter.append("import " + PACKAGE_NAME + ".core.CommandFactory;\n\n");
5446
for (Entry<String, String> entry : map.entrySet()) {
5547
bwriter.append("import " + entry.getValue() + ";\n");
5648
}
5749
bwriter.append("//CHECKSTYLE:ON\n");
50+
5851
bwriter.append("\npublic class " + CLASS_NAME + " {\n");
5952
bwriter.append(TAB + "static {\n");
6053
for (Entry<String, String> entry : map.entrySet()) {
6154
String[] parts = entry.getValue().split("\\.");
6255
if (parts.length == 0) {
6356
continue;
6457
}
58+
// print out the lines that add the commands to the command factory.
6559
String className = parts[parts.length - 1];
6660
bwriter.append(TAB + TAB + "CommandFactory.addCommand(\""
6761
+ entry.getKey() + "\", "
@@ -76,15 +70,15 @@ private void generateSourceFile(Map<String, String> map) throws IOException {
7670
@Override
7771
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
7872
Map<String, String> map = new HashMap<>();
79-
Messager messager = processingEnv.getMessager();
8073

8174
for (Element elem : roundEnv.getElementsAnnotatedWith(Command.class)) {
8275
if (elem.getKind() != ElementKind.CLASS) {
83-
continue;
76+
logger.warn("Element with command annotation is not class: " + elem.toString());
77+
return false;
8478
}
8579
Command command = elem.getAnnotation(Command.class);
86-
messager.printMessage(Diagnostic.Kind.NOTE, elem.toString());
87-
messager.printMessage(Diagnostic.Kind.NOTE, elem.getClass().getCanonicalName());
80+
logger.info("element with annotation: " + elem.toString());
81+
logger.info("element name with annotation: " + elem.getClass().getCanonicalName());
8882

8983
TypeElement classElement = (TypeElement) elem;
9084
map.put(command.name(), processingEnv.getElementUtils()
@@ -94,7 +88,7 @@ public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment
9488
try {
9589
generateSourceFile(map);
9690
} catch (IOException ex) {
97-
messager.printMessage(Diagnostic.Kind.NOTE, "Failed to create source file." + ex);
91+
logger.warn("Failed to create source file." + ex);
9892
}
9993
return true;
10094
}

src/main/java/fi/helsinki/cs/tmc/cli/io/ResultPrinter.java

Lines changed: 30 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,16 @@
55
import fi.helsinki.cs.tmc.langs.domain.SpecialLogs;
66
import fi.helsinki.cs.tmc.langs.domain.TestResult;
77

8+
import java.util.Arrays;
89
import java.util.List;
910

1011
public class ResultPrinter {
1112

1213
private static final String COMPILE_ERROR_MESSAGE
1314
= Color.colorString("Failed to compile project", Color.AnsiColor.ANSI_PURPLE);
14-
private static final String FAIL = Color.colorString("Failed: ", Color.AnsiColor.ANSI_RED);
15-
private static final String PASS = Color.colorString("Passed: ", Color.AnsiColor.ANSI_GREEN);
16-
private static final String TAB = " ";
17-
private static final char LF = '\n';
15+
private static final String FAIL_MESSAGE = "Failed: ";
16+
private static final String PASS_MESSAGE = "Passed: ";
17+
private final String tab;
1818

1919
private final Io io;
2020

@@ -27,6 +27,8 @@ public ResultPrinter(Io io, boolean showDetails, boolean showPassed) {
2727
this.io = io;
2828
this.showDetails = showDetails;
2929
this.showPassed = showPassed;
30+
31+
this.tab = createPaddingString(PASS_MESSAGE.length());
3032
}
3133

3234
public boolean isShowDetails() {
@@ -155,9 +157,9 @@ public static int passedTests(List<TestResult> testResults) {
155157
private void printTestResults(List<TestResult> testResults) {
156158
for (TestResult testResult : testResults) {
157159
if (!testResult.isSuccessful()) {
158-
io.println(createFailMessage(testResult));
160+
printFailMessage(testResult);
159161
} else if (showPassed) {
160-
io.println(createPassMessage(testResult));
162+
printPassMessage(testResult);
161163
}
162164
}
163165
io.println("Test results: "
@@ -166,37 +168,45 @@ private void printTestResults(List<TestResult> testResults) {
166168

167169
}
168170

169-
private String createFailMessage(TestResult testResult) {
170-
StringBuilder sb = new StringBuilder();
171-
sb.append(FAIL).append(testResult.getName()).append(LF);
172-
sb.append(TAB).append(testResult.getMessage()).append(LF);
171+
private void printFailMessage(TestResult testResult) {
172+
io.print(Color.colorString(FAIL_MESSAGE, Color.AnsiColor.ANSI_RED));
173+
io.println(testResult.getName());
174+
io.println(this.tab + testResult.getMessage());
173175

174176
if (showDetails) {
175-
String details = listToString(testResult.getDetailedMessage(), LF);
177+
String details = listToString(testResult.getDetailedMessage());
176178
if (details != null) {
177-
sb.append(LF).append("Detailed message:").append(LF).append(details);
179+
io.println("\nDetailed message:");
180+
io.println(details);
178181
}
179-
String exception = listToString(testResult.getException(), LF);
182+
183+
String exception = listToString(testResult.getException());
180184
if (exception != null) {
181-
sb.append(LF).append("Exception:").append(LF).append(exception);
185+
io.println("\nException:");
186+
io.println(exception);
182187
}
183188
}
184-
return sb.toString();
185189
}
186190

187-
private String createPassMessage(TestResult testResult) {
188-
return PASS + testResult.getName() + LF;
191+
private void printPassMessage(TestResult testResult) {
192+
io.print(Color.colorString(PASS_MESSAGE, Color.AnsiColor.ANSI_GREEN));
193+
io.println(testResult.getName());
189194
}
190195

191-
private String listToString(List<String> strings, char separator) {
196+
private String listToString(List<String> strings) {
192197
if (strings == null || strings.isEmpty()) {
193198
return null;
194199
}
195200
StringBuilder sb = new StringBuilder();
196201
for (String string : strings) {
197-
sb.append(string).append(separator);
202+
sb.append(string).append("\n");
198203
}
199204
return sb.toString();
200205
}
201206

202-
}
207+
private String createPaddingString(int size) {
208+
char[] charArray = new char[size];
209+
Arrays.fill(charArray, ' ');
210+
return new String(charArray);
211+
}
212+
}

0 commit comments

Comments
 (0)