Skip to content

Commit

Permalink
Fix issue in metadata JSON when solution contains multiple files (#107)
Browse files Browse the repository at this point in the history
  • Loading branch information
sanderploegsma authored Jan 23, 2024
1 parent 2e62760 commit 9e77026
Show file tree
Hide file tree
Showing 23 changed files with 308 additions and 322 deletions.
2 changes: 2 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,11 @@ repositories {
}

dependencies {
implementation "org.json:json:20231013"
implementation "com.github.javaparser:javaparser-symbol-solver-core:3.25.7"
implementation "org.apache.logging.log4j:log4j-api:2.22.1"
implementation "org.apache.logging.log4j:log4j-core:2.22.1"

testImplementation "junit:junit:4.13.2"
testImplementation "org.assertj:assertj-core:3.25.0"
testImplementation "org.hamcrest:hamcrest-all:1.3"
Expand Down
8 changes: 0 additions & 8 deletions src/main/java/representer/MappingSerializator.java

This file was deleted.

61 changes: 0 additions & 61 deletions src/main/java/representer/MappingSerializatorImpl.java

This file was deleted.

14 changes: 14 additions & 0 deletions src/main/java/representer/ParserConfigurationFactory.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package representer;

import com.github.javaparser.ParserConfiguration;
import com.github.javaparser.symbolsolver.JavaSymbolSolver;
import com.github.javaparser.symbolsolver.resolution.typesolvers.CombinedTypeSolver;
import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;

class ParserConfigurationFactory {
static ParserConfiguration getParserConfiguration() {
CombinedTypeSolver comb = new CombinedTypeSolver(new ReflectionTypeSolver());
JavaSymbolSolver solver = new JavaSymbolSolver(comb);
return new ParserConfiguration().setSymbolResolver(solver);
}
}
6 changes: 0 additions & 6 deletions src/main/java/representer/RepresentationSerializator.java

This file was deleted.

46 changes: 0 additions & 46 deletions src/main/java/representer/RepresentationSerializatorImpl.java

This file was deleted.

22 changes: 2 additions & 20 deletions src/main/java/representer/Representer.java
Original file line number Diff line number Diff line change
@@ -1,15 +1,10 @@
package representer;

import com.github.javaparser.JavaParser;
import com.github.javaparser.ParserConfiguration;
import com.github.javaparser.ast.CompilationUnit;
import com.github.javaparser.ast.visitor.ModifierVisitor;
import com.github.javaparser.ast.visitor.VoidVisitor;
import com.github.javaparser.printer.DefaultPrettyPrinterVisitor;
import com.github.javaparser.printer.configuration.DefaultPrinterConfiguration;
import com.github.javaparser.symbolsolver.JavaSymbolSolver;
import com.github.javaparser.symbolsolver.resolution.typesolvers.CombinedTypeSolver;
import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import representer.normalizer.PlaceholderNormalizer;
Expand Down Expand Up @@ -41,25 +36,12 @@ public Representer(List<ModifierVisitor<String>> genericNormalizers,
}
}

public String generate(String sourceContent,
RepresentationSerializator representationSerializator,
MappingSerializator mappingSerializator) {
CompilationUnit unit = parser().parse(sourceContent).getResult().get();
public String generate(CompilationUnit unit) {
voidNormalizers.forEach(n -> unit.accept(n, null));
genericNormalizers.forEach(n -> unit.accept(n, null));
DefaultPrettyPrinterVisitor visitor = new DefaultPrettyPrinterVisitor(new DefaultPrinterConfiguration());
unit.accept(visitor, null);
String representation = visitor.toString();
representationSerializator.serialize(representation);
return representation;
}

private JavaParser parser() {
CombinedTypeSolver comb = new CombinedTypeSolver(new ReflectionTypeSolver());
JavaSymbolSolver solver = new JavaSymbolSolver(comb);
ParserConfiguration parserConfiguration =
new ParserConfiguration().setSymbolResolver(solver);
return new JavaParser(parserConfiguration);
return visitor.toString();
}

public Optional<PlaceholderNormalizer> placeholderNormalizer() {
Expand Down
84 changes: 47 additions & 37 deletions src/main/java/representer/RepresenterCli.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,19 @@

import com.github.javaparser.ast.visitor.ModifierVisitor;
import com.github.javaparser.ast.visitor.VoidVisitor;
import com.github.javaparser.utils.SourceRoot;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.json.JSONObject;
import representer.normalizer.*;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Stream;
import java.util.Map;

public class RepresenterCli {

Expand All @@ -28,7 +29,7 @@ public class RepresenterCli {

private static final String JAVA_PROJECT_STRUCTURE = "src/main/java";

public static void main(String[] args) {
public static void main(String[] args) throws IOException {
OptionsValidator validator = new OptionsValidator();
if (!validator.isValid(args)) {
throw new IllegalArgumentException(
Expand All @@ -43,44 +44,53 @@ public static void main(String[] args) {
"exercise-context-path requires the ending trailing slash");
}


Representer representer = new Representer(modifierNormalizers, voidNormalizers);
final String sourceFolder = contextPath + JAVA_PROJECT_STRUCTURE;
logger.info("Search for source file into folder {}", sourceFolder);
String[] sources = new File(sourceFolder).list();
if (sources == null) {
logger.error("Problems reading the folder");
System.exit(-1);
}
Stream<String> javaSource = Stream.of(sources).filter(s -> s.endsWith(".java")).sorted();
var representer = new Representer(modifierNormalizers, voidNormalizers);
var sourceRoot = new SourceRoot(Path.of(contextPath, JAVA_PROJECT_STRUCTURE))
.setParserConfiguration(ParserConfigurationFactory.getParserConfiguration());
var representations = new ArrayList<String>();

final RepresentationSerializatorImpl representationSerializator =
new RepresentationSerializatorImpl(contextPath);
final MappingSerializatorImpl mappingSerializator =
new MappingSerializatorImpl(contextPath);

javaSource.forEach(s -> {
try {
final String source = sourceFolder + "/" + s;
String sourceFileContent = new String(Files.readAllBytes(Paths.get(source)));
logger.info("Found source file {}", source);
representer.generate(sourceFileContent, representationSerializator,
mappingSerializator);
logger.info("Generated representation");
} catch (IOException e) {
logger.error("Problems reading the source file", e);
try {
for (var parseResult : sourceRoot.tryToParse()) {
var compilationUnit = parseResult.getResult().get();
var representation = representer.generate(compilationUnit);
representations.add(representation);
}
});
Optional<PlaceholderNormalizer> placeholderNormalizer =
representer.placeholderNormalizer();
if (placeholderNormalizer.isPresent()) {
mappingSerializator.serialize(placeholderNormalizer.get().mapping());
} catch (IOException e) {
logger.error("Problems reading the source files", e);
}

writeRepresentations(representations, contextPath);
writeMetadata(contextPath);
logger.info("Generated representation");

if (representer.placeholderNormalizer().isPresent()) {
var mapping = representer.placeholderNormalizer().get().mapping();
writeMapping(mapping, contextPath);
logger.info("Generated mapping");
} else {
logger.warn("PlacelholderNormalizer not loaded, mapping file will not be created");
logger.warn("PlaceholderNormalizer not loaded, mapping file will not be created");
}
}

private static void writeRepresentations(List<String> representations, String outputDirectory) throws IOException {
writeFile(String.join("\n", representations), outputDirectory + "representation.txt");
}

private static void writeMapping(Map<String, String> mapping, String outputDirectory) throws IOException {
var json = new JSONObject();
mapping.forEach(json::put);
writeFile(json.toString(2), outputDirectory + "mapping.json");
}

private static void writeMetadata(String outputDirectory) throws IOException {
var json = new JSONObject()
.put("version", 1);
writeFile(json.toString(2), outputDirectory + "representation.json");
}

private static void writeFile(String contents, String filePath) throws IOException {
try (var writer = new FileWriter(filePath)) {
writer.write(contents);
}
}
}
Loading

0 comments on commit 9e77026

Please sign in to comment.