Skip to content

Commit

Permalink
Add slf4j as logger and extracted CLI to own module
Browse files Browse the repository at this point in the history
  • Loading branch information
dfuchss committed May 5, 2022
1 parent b6c2660 commit ca28f10
Show file tree
Hide file tree
Showing 33 changed files with 201 additions and 143 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/maven.yml
Expand Up @@ -31,6 +31,6 @@ jobs:
uses: actions/upload-artifact@v3
with:
name: "JPlag"
path: "jplag/target/jplag-*-jar-with-dependencies.jar"
path: "jplag.cli/target/jplag-*-jar-with-dependencies.jar"


2 changes: 1 addition & 1 deletion README.md
Expand Up @@ -28,7 +28,7 @@ JPlag is released on [Maven Central](https://search.maven.org/search?q=de.jplag)
1. Download or clone the code from this repository.
2. Run `mvn clean package` from the root of the repository to compile and build all submodules.
Run `mvn clean package assembly:single` instead if you need the full jar which includes all dependencies.
5. You will find the generated JARs in the subdirectory `jplag/target`.
5. You will find the generated JARs in the subdirectory `jplag.cli/target`.

## Usage
JPlag can either be used via the CLI or directly via its Java API. For more information, see the [usage information in the wiki](https://github.com/jplag/JPlag/wiki/1.-How-to-Use-JPlag).
Expand Down
64 changes: 64 additions & 0 deletions jplag.cli/pom.xml
@@ -0,0 +1,64 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>de.jplag</groupId>
<artifactId>aggregator</artifactId>
<version>${revision}</version>
</parent>
<artifactId>cli</artifactId>
<dependencies>
<dependency>
<groupId>de.jplag</groupId>
<artifactId>jplag</artifactId>
</dependency>
<dependency>
<groupId>net.sourceforge.argparse4j</groupId>
<artifactId>argparse4j</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>de.jplag.CLI</mainClass>
<packageName>jplag</packageName>
</manifest>
</archive>
</configuration>
</plugin>

<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>de.jplag.CLI</mainClass>
<packageName>jplag</packageName>
</manifest>
</archive>
<finalName>jplag-${project.version}</finalName>
</configuration>
</plugin>

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<configuration>
<!-- Skip deployment of CLI to Maven Central -->
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>
</project>
@@ -1,34 +1,6 @@
package de.jplag;

import static de.jplag.CommandLineArgument.BASE_CODE;
import static de.jplag.CommandLineArgument.CLUSTER_AGGLOMERATIVE_INTER_CLUSTER_SIMILARITY;
import static de.jplag.CommandLineArgument.CLUSTER_AGGLOMERATIVE_THRESHOLD;
import static de.jplag.CommandLineArgument.CLUSTER_ALGORITHM;
import static de.jplag.CommandLineArgument.CLUSTER_ENABLE;
import static de.jplag.CommandLineArgument.CLUSTER_METRIC;
import static de.jplag.CommandLineArgument.CLUSTER_PREPROCESSING_CDF;
import static de.jplag.CommandLineArgument.CLUSTER_PREPROCESSING_NONE;
import static de.jplag.CommandLineArgument.CLUSTER_PREPROCESSING_PERCENTILE;
import static de.jplag.CommandLineArgument.CLUSTER_PREPROCESSING_THRESHOLD;
import static de.jplag.CommandLineArgument.CLUSTER_SPECTRAL_BANDWIDTH;
import static de.jplag.CommandLineArgument.CLUSTER_SPECTRAL_KMEANS_ITERATIONS;
import static de.jplag.CommandLineArgument.CLUSTER_SPECTRAL_MAX_RUNS;
import static de.jplag.CommandLineArgument.CLUSTER_SPECTRAL_MIN_RUNS;
import static de.jplag.CommandLineArgument.CLUSTER_SPECTRAL_NOISE;
import static de.jplag.CommandLineArgument.COMPARISON_MODE;
import static de.jplag.CommandLineArgument.DEBUG;
import static de.jplag.CommandLineArgument.EXCLUDE_FILE;
import static de.jplag.CommandLineArgument.LANGUAGE;
import static de.jplag.CommandLineArgument.MIN_TOKEN_MATCH;
import static de.jplag.CommandLineArgument.NEW_DIRECTORY;
import static de.jplag.CommandLineArgument.OLD_DIRECTORY;
import static de.jplag.CommandLineArgument.RESULT_FOLDER;
import static de.jplag.CommandLineArgument.ROOT_DIRECTORY;
import static de.jplag.CommandLineArgument.SHOWN_COMPARISONS;
import static de.jplag.CommandLineArgument.SIMILARITY_THRESHOLD;
import static de.jplag.CommandLineArgument.SUBDIRECTORY;
import static de.jplag.CommandLineArgument.SUFFIXES;
import static de.jplag.CommandLineArgument.VERBOSITY;
import static de.jplag.CommandLineArgument.*;

import java.util.ArrayList;
import java.util.List;
Expand All @@ -40,6 +12,9 @@
import net.sourceforge.argparse4j.inf.ArgumentParserException;
import net.sourceforge.argparse4j.inf.Namespace;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import de.jplag.clustering.ClusteringAlgorithm;
import de.jplag.clustering.ClusteringOptions;
import de.jplag.clustering.Preprocessing;
Expand All @@ -59,6 +34,8 @@
*/
public class CLI {

private static final Logger logger = LoggerFactory.getLogger(CLI.class);

private static final String CREDITS = "Created by IPD Tichy, Guido Malpohl, and others. JPlag logo designed by Sandro Koch. Currently maintained by Sebastian Hahner and Timur Saglam.";

private static final String[] DESCRIPTIONS = {"Detecting Software Plagiarism", "Software-Archaeological Playground", "Since 1996",
Expand All @@ -81,12 +58,12 @@ public static void main(String[] args) {
Namespace arguments = cli.parseArguments(args);
JPlagOptions options = cli.buildOptionsFromArguments(arguments);
JPlag program = new JPlag(options);
System.out.println("JPlag initialized");
logger.info("JPlag initialized");
JPlagResult result = program.run();
Report report = new JsonReport();
report.saveReport(result, arguments.getString(RESULT_FOLDER.flagWithoutDash()));
} catch (ExitException exception) {
System.out.println("Error: " + exception.getMessage());
logger.error(exception.getMessage(), exception);
System.exit(1);
}
}
Expand Down Expand Up @@ -148,7 +125,7 @@ public JPlagOptions buildOptionsFromArguments(Namespace namespace) {
options.setSimilarityThreshold(SIMILARITY_THRESHOLD.getFrom(namespace));
options.setMaximumNumberOfComparisons(SHOWN_COMPARISONS.getFrom(namespace));
ComparisonMode.fromName(COMPARISON_MODE.getFrom(namespace)).ifPresentOrElse(options::setComparisonMode,
() -> System.out.println("Unknown comparison mode, using default mode!"));
() -> logger.warn("Unknown comparison mode, using default mode!"));

ClusteringOptions.Builder clusteringBuilder = new ClusteringOptions.Builder();
Optional.ofNullable((Boolean) CLUSTER_ENABLE.getFrom(namespace)).ifPresent(clusteringBuilder::enabled);
Expand Down
Expand Up @@ -2,23 +2,27 @@

import static org.junit.jupiter.api.Assertions.fail;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import de.jplag.ErrorConsumer;

/**
* Mock error consumer that fails the test case on error occurrence.
* @author Timur Saglam
*/
public class TestErrorConsumer implements ErrorConsumer {
private final Logger logger = LoggerFactory.getLogger("JPlag-Test");

@Override
public void addError(String errorMessage) {
System.err.println(errorMessage);
logger.error(errorMessage);
fail(errorMessage);
}

@Override
public void print(String message, String longMessage) {
System.out.println(message);
logger.info(message);
}

}
8 changes: 5 additions & 3 deletions jplag.frontend-utils/src/main/java/de/jplag/TokenPrinter.java
Expand Up @@ -11,6 +11,9 @@
import java.util.List;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
* Utility class for printing JPlag tokens from a submission. Each line of code is printed starting with the line
* number. Under these lines the tokens are annotated in the format <code>|TOKEN|</code>. The first vertical line marks
Expand All @@ -20,7 +23,7 @@
* @author Timur Saglam
*/
public final class TokenPrinter {

private static final Logger logger = LoggerFactory.getLogger(TokenPrinter.class);
// Representation:
private static final String BAR = "|";
private static final String TAB = "\t";
Expand Down Expand Up @@ -145,8 +148,7 @@ private static List<String> linesFromFile(File file) {
try {
return Files.readAllLines(file.toPath());
} catch (IOException exception) {
System.err.println("Cannot read " + file.getAbsolutePath() + ":");
exception.printStackTrace();
logger.error("Cannot read " + file.getAbsolutePath() + ":", exception);
}
return Collections.emptyList();
}
Expand Down
Expand Up @@ -13,6 +13,8 @@

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import de.jplag.Token;
import de.jplag.TokenConstants;
Expand All @@ -21,6 +23,8 @@
import de.jplag.testutils.TestErrorConsumer;

class MinimalCSharpFrontendTest {
private final Logger logger = LoggerFactory.getLogger("JPlag-Test");

private static final int EXPEXTED_NUMBER_OF_TOKENS = 15;
private static final Path BASE_PATH = Path.of("src", "test", "resources", "de", "jplag", "csharp");
private static final String TEST_SUBJECT = "TestClass.cs";
Expand All @@ -44,7 +48,7 @@ void testParsingTestClass() {
// Parse test input
String[] input = new String[] {TEST_SUBJECT};
TokenList result = frontend.parse(baseDirectory, input);
System.out.println(TokenPrinter.printTokens(result, baseDirectory, Arrays.asList(input)));
logger.info(TokenPrinter.printTokens(result, baseDirectory, Arrays.asList(input)));

// Compare parsed tokens:
assertEquals(EXPEXTED_NUMBER_OF_TOKENS, result.size());
Expand Down
@@ -1,10 +1,15 @@
package de.jplag.java;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import de.jplag.Token;
import de.jplag.TokenConstants;

public class JavaToken extends Token implements JavaTokenConstants {

private final Logger logger = LoggerFactory.getLogger(JavaToken.class);

public JavaToken(int type, String file, int line, int column, int length) {
super(type, file, line, column, length);
}
Expand Down Expand Up @@ -154,7 +159,7 @@ protected String type2string() {
return "}RECORD";

default:
System.err.println("UNKNOWN: " + type);
logger.error("UNKNOWN: " + type);
return "<UNKNOWN" + type + ">";
}
}
Expand Down
@@ -1,9 +1,14 @@
package de.jplag.python3;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import de.jplag.Token;

public class Python3Token extends Token implements Python3TokenConstants {

private static final Logger logger = LoggerFactory.getLogger(Python3Token.class);

public Python3Token(int type, String file, int line, int column, int length) {
super(type, file, line, column, length);
}
Expand Down Expand Up @@ -76,7 +81,7 @@ protected String type2string() {
case WITH_END:
return "}WITH ";
default:
System.err.println("*UNKNOWN: " + type);
logger.error("*UNKNOWN: " + type);
return "*UNKNOWN" + type;
}
}
Expand Down
7 changes: 6 additions & 1 deletion jplag.frontend.text/src/main/java/de/jplag/text/Parser.java
Expand Up @@ -4,6 +4,9 @@
import java.io.FileInputStream;
import java.util.Hashtable;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import antlr.Token;

import de.jplag.AbstractParser;
Expand All @@ -13,6 +16,8 @@

public class Parser extends AbstractParser {

private static final Logger logger = LoggerFactory.getLogger(Parser.class);

protected Hashtable<String, Integer> table = new Hashtable<>();
protected int serial = 1; // 0 is FILE_END token

Expand Down Expand Up @@ -56,7 +61,7 @@ public void outOfSerials() {
runOut = true;
errors++;
errorConsumer.print("ERROR: Out of serials!", null);
System.out.println("de.jplag.text.Parser: ERROR: Out of serials!");
logger.error("de.jplag.text.Parser: ERROR: Out of serials!");
}

private boolean parseFile(File directory, String file) {
Expand Down
50 changes: 0 additions & 50 deletions jplag/pom.xml
Expand Up @@ -11,10 +11,6 @@
<artifactId>jplag</artifactId>

<dependencies>
<dependency>
<groupId>net.sourceforge.argparse4j</groupId>
<artifactId>argparse4j</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
Expand Down Expand Up @@ -58,50 +54,4 @@
<artifactId>chars</artifactId>
</dependency>
</dependencies>

<build>
<resources>
<resource>
<filtering>true</filtering>
<directory>src/main/resources</directory>
</resource>

<resource>
<filtering>false</filtering>
<directory>src/main/resources</directory>
<excludes>
<exclude>de/jplag/version.properties</exclude>
</excludes>
</resource>
</resources>

<plugins>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>de.jplag.CLI</mainClass>
<packageName>jplag</packageName>
</manifest>
</archive>
</configuration>
</plugin>

<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>de.jplag.CLI</mainClass>
<packageName>jplag</packageName>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
</project>

0 comments on commit ca28f10

Please sign in to comment.