Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix SonarCloud issues #57

Open
wants to merge 27 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
aec78f5
Do not print downloads messages in the GitHub action
mackdk May 8, 2024
7bc3924
Fix issue with equals instance check
mackdk May 8, 2024
21aa7f6
Correctly close LoggerContext in test
mackdk May 8, 2024
4b5b428
Removed unneeded constructor (java:S1186)
mackdk May 8, 2024
63819dc
Removed usage of generic wildcard (java:S1452)
mackdk May 8, 2024
f1af3c0
Removed double curly brace initializations (java:S3599, java:S1171)
mackdk May 8, 2024
1f9d243
Handle empty optionals (java:S3655)
mackdk May 8, 2024
878fed9
Fix formatting issues (java:S3457)
mackdk May 8, 2024
c205d5f
Prevent instantiation for static classes (java:S1118)
mackdk May 8, 2024
f2cf2b7
Simplify map usage (java:S3824)
mackdk May 8, 2024
73b8720
Use more specific exception (java:S112)
mackdk May 8, 2024
90ce211
Fixed wrong comparison (java:S4973)
mackdk May 8, 2024
abadf80
Specified parametrized type (java:S3740)
mackdk May 8, 2024
e5a82f9
Simplified stream chains (java:S4034)
mackdk May 8, 2024
ac91dd5
Handled null boolean (java:S5411)
mackdk May 8, 2024
0a05223
Removed empty statements (java:S1116)
mackdk May 8, 2024
4d0399a
Removed unneeded import (java:S1128)
mackdk May 8, 2024
67d5e7d
Used lambda (java:S1604)
mackdk May 8, 2024
5b6719e
Used diamond operator (java:S2293)
mackdk May 8, 2024
564923c
Removed static imports for consistency
mackdk May 8, 2024
773b8df
Use String.valueOf() instead of .toString() for null safety
mackdk May 8, 2024
2bf279f
Made loggers static final
mackdk May 8, 2024
7dea55a
Made fields final when possible
mackdk May 8, 2024
35c8e42
Removed redundant initializers
mackdk May 8, 2024
29cb197
Fixed Javadoc issues
mackdk May 8, 2024
0b70dce
Minor code improvement
mackdk May 8, 2024
3f40da8
Improved exception handling
mackdk May 8, 2024
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
2 changes: 1 addition & 1 deletion .github/workflows/maven.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,4 @@ jobs:
with:
java-version: '11'
- name: Build with Maven
run: mvn -B package --file pom.xml
run: mvn -B --no-transfer-progress clean verify --file pom.xml
14 changes: 4 additions & 10 deletions src/main/java/com/suse/matcher/ConflictMatchMoveFilter.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,19 +13,13 @@
/**
* Filters ChangeMoves by only accepting those that do not lead to conflicts.
*/
public class ConflictMatchMoveFilter implements SelectionFilter<Assignment, ChangeMove> {

/**
* Default constructor.
*/
public ConflictMatchMoveFilter() {
}
public class ConflictMatchMoveFilter implements SelectionFilter<Assignment, ChangeMove<Assignment>> {

/**
* {@inheritDoc}
*/
@Override
public boolean accept(ScoreDirector<Assignment> director, ChangeMove move) {
public boolean accept(ScoreDirector<Assignment> director, ChangeMove<Assignment> move) {
boolean confirmed = (Boolean) move.getPlanningValues().iterator().next();

// we are confirming a Match
Expand All @@ -36,8 +30,8 @@ public boolean accept(ScoreDirector<Assignment> director, ChangeMove move) {
.collect(Collectors.toSet());

// accept this Move only if no conflicting Match has been confirmed already
return !solution.getMatches().stream()
.anyMatch(m -> m.confirmed == Boolean.TRUE && conflictingIds.contains(m.id));
return solution.getMatches().stream()
.noneMatch(m -> m.confirmed == Boolean.TRUE && conflictingIds.contains(m.id));
}
else {
// leaving a Match unconfirmed is always OK
Expand Down
27 changes: 12 additions & 15 deletions src/main/java/com/suse/matcher/Drools.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import org.kie.api.runtime.KieSession;
import org.kie.api.runtime.rule.Agenda;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
Expand All @@ -25,6 +26,9 @@
* Deduces facts based on some base facts and rules defined ksession-rules.xml.
*/
public class Drools {
/** Logger instance. */
private static final Logger LOGGER = LogManager.getLogger(Drools.class);

/** Rule groups corresponding to filenames and agenda group names. */
private static final String[] RULE_GROUPS = {
"PartNumbers",
Expand All @@ -36,13 +40,10 @@ public class Drools {
};

/** Map to fact ids, see generateId(). */
private static Map<List<Object>, Integer> idMap = new HashMap<>();

/** Logger instance. */
private final Logger logger = LogManager.getLogger(Drools.class);
private static final Map<List<Object>, Integer> ID_MAP = new HashMap<>();

/** Deduction resulting fact objects. */
private Collection<? extends Object> result;
private final Collection<Object> result;

/**
* Instantiates a Drools instance with the specified base facts.
Expand Down Expand Up @@ -88,18 +89,18 @@ public Drools(Collection<Object> baseFacts) {
// start deduction engine
long start = System.currentTimeMillis();
session.fireAllRules();
logger.info("Deduction phase took {}ms", System.currentTimeMillis() - start);
LOGGER.info("Deduction phase took {}ms", System.currentTimeMillis() - start);

// collect results
result = session.getObjects();
result = new ArrayList<>(session.getObjects());

// log deducted messages
result.stream()
.filter(o -> o instanceof Message)
.map(m -> (Message) m)
.filter(m -> m.severity.equals(Message.Level.DEBUG))
.sorted()
.forEach(m -> logger.debug("{}: {}", m.type, m.data.toString()))
.forEach(m -> LOGGER.debug("{}: {}", m.type, m.data))
;

// cleanup
Expand All @@ -111,15 +112,15 @@ public Drools(Collection<Object> baseFacts) {
* Returns all facts deduced by Drools.
* @return the deduced facts
*/
public Collection<? extends Object> getResult() {
public Collection<Object> getResult() {
return result;
}

/**
* reset the idMap
*/
public static void resetIdMap() {
idMap.clear();
ID_MAP.clear();
}

/**
Expand All @@ -131,10 +132,6 @@ public static void resetIdMap() {
* @return a new id
*/
public static int generateId(Object... objects) {
List<Object> listOfData = Arrays.asList(objects);
if (!idMap.containsKey(listOfData)) {
idMap.put(listOfData, idMap.size());
}
return idMap.get(listOfData);
return ID_MAP.computeIfAbsent(Arrays.asList(objects), k -> ID_MAP.size());
}
}
27 changes: 15 additions & 12 deletions src/main/java/com/suse/matcher/FactConverter.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,5 @@
package com.suse.matcher;

import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.mapping;
import static java.util.stream.Collectors.toList;
import static java.util.stream.Collectors.toSet;

import com.suse.matcher.facts.CentGroup;
import com.suse.matcher.facts.HostGuest;
import com.suse.matcher.facts.InstalledProduct;
Expand Down Expand Up @@ -47,14 +42,18 @@
*/
public class FactConverter {

private FactConverter() {
// Prevent instantiation
}

/**
* Converts JSON objects to facts (inputs to the rule engine).
*
* @param input a JSON input data blob
* @return a collection of facts
*/
public static Collection<Object> convertToFacts(JsonInput input) {
Collection<Object> result = new LinkedList<Object>();
Collection<Object> result = new LinkedList<>();

result.add(new Timestamp(input.getTimestamp()));

Expand Down Expand Up @@ -114,8 +113,9 @@ public static Collection<Object> convertToFacts(JsonInput input) {
* @return the output
*/
public static JsonOutput convertToOutput(Assignment assignment) {
Date timestamp = assignment.getProblemFactStream(Timestamp.class)
.findFirst().get().timestamp;
Date timestamp = assignment.getProblemFactStream(Timestamp.class).findFirst()
.map(Timestamp::getTimestamp)
.orElse(new Date());

List<JsonMatch> matches = getMatches(assignment);

Expand Down Expand Up @@ -155,7 +155,7 @@ public static List<JsonMatch> getMatches(Assignment assignment) {
Set<Integer> confirmedGroupIds = assignment.getMatches().stream()
.filter(m -> m.confirmed)
.map(m -> m.id)
.collect(toSet());
.collect(Collectors.toSet());

// map of cent group id -> cent group cents
Map<Number, Integer> centGroupsCents = assignment.getProblemFactStream(CentGroup.class)
Expand Down Expand Up @@ -188,7 +188,7 @@ public static List<JsonMatch> getMatches(Assignment assignment) {
.append(a.getCents(), b.getCents())
.toComparison()
)
.collect(toList());
.collect(Collectors.toList());
}

/**
Expand All @@ -199,11 +199,14 @@ public static List<JsonMatch> getMatches(Assignment assignment) {
*/
private static List<JsonSubscription> getSubscriptions(Assignment assignment) {
Map<Long, Set<Long>> subProducts = assignment.getProblemFactStream(SubscriptionProduct.class)
.collect(groupingBy(sp -> sp.subscriptionId, mapping(sp -> sp.productId, Collectors.toCollection(() -> new TreeSet<>()))));
.collect(Collectors.groupingBy(
sp -> sp.subscriptionId,
Collectors.mapping(sp -> sp.productId, Collectors.toCollection(() -> new TreeSet<>()))
));
return assignment.getProblemFactStream(Subscription.class)
.sorted(Comparator.comparing(Subscription::getId))
.map(s -> new JsonSubscription(s.id, s.partNumber, s.name, s.quantity, s.startDate, s.endDate,
s.sccUsername, subProducts.get(s.id)))
.collect(toList());
.collect(Collectors.toList());
}
}
10 changes: 5 additions & 5 deletions src/main/java/com/suse/matcher/JsonIO.java
Original file line number Diff line number Diff line change
@@ -1,28 +1,28 @@
package com.suse.matcher;

import static com.google.gson.FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES;
import com.suse.matcher.json.JsonInput;
import com.suse.matcher.json.JsonOutput;

import com.google.gson.FieldNamingPolicy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonIOException;
import com.google.gson.JsonSyntaxException;
import com.google.gson.reflect.TypeToken;
import com.suse.matcher.json.JsonInput;
import com.suse.matcher.json.JsonOutput;

/**
* Serializes and deserializes objects from and to JSON.
*/
public class JsonIO {

/** Deserializer instance. */
private Gson gson;
private final Gson gson;

/** Default constructor. */
public JsonIO() {
gson = new GsonBuilder()
.setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX")
.setFieldNamingPolicy(LOWER_CASE_WITH_UNDERSCORES)
.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
.setPrettyPrinting()
.create();
}
Expand Down
30 changes: 16 additions & 14 deletions src/main/java/com/suse/matcher/Main.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,5 @@
package com.suse.matcher;

import static java.util.Optional.empty;
import static java.util.Optional.of;
import static java.util.Optional.ofNullable;

import com.suse.matcher.json.JsonInput;
import com.suse.matcher.solver.Assignment;

Expand All @@ -18,6 +14,8 @@
import org.apache.logging.log4j.core.LoggerContext;

import java.io.File;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;
Expand All @@ -32,27 +30,26 @@ public class Main {
* The main method.
*
* @param args command line arguments
* @throws Exception if anything unexpected happens
*/
public static final void main(String[] args) throws Exception {
public static void main(String[] args) {
long start = System.currentTimeMillis();
CommandLine commandLine = parseCommandLine(args);

// First initialize the logging system
Optional<Level> logLevel = commandLine.hasOption('v') ?
of(Level.toLevel(commandLine.getOptionValue('v'))) :
empty();
Optional.of(Level.toLevel(commandLine.getOptionValue('v'))) :
Optional.empty();

try (LoggerContext context = Log4J.initialize(logLevel, ofNullable(commandLine.getOptionValue('l')))) {
try (LoggerContext context = Log4J.initialize(logLevel, Optional.ofNullable(commandLine.getOptionValue('l')))) {
Logger logger = context.getLogger(Main.class);
logger.info("Starting subscription-matcher process");

try {
// create output writing objects
Optional<Character> delimiter = commandLine.hasOption('d') ?
of(commandLine.getOptionValue('d').charAt(0)) :
empty();
Optional<String> outdir = ofNullable(commandLine.getOptionValue('o'));
Optional.of(commandLine.getOptionValue('d').charAt(0)) :
Optional.empty();
Optional<String> outdir = Optional.ofNullable(commandLine.getOptionValue('o'));
OutputWriter writer = new OutputWriter(outdir, delimiter);

// load input data
Expand All @@ -72,8 +69,13 @@ public static final void main(String[] args) throws Exception {

logger.info("Whole execution took {}ms", System.currentTimeMillis() - start);
}
catch (Exception ex) {
logger.error("Unexpected exception: ", ex);
catch (IOException ex) {
logger.error("Unexpected I/O error", ex);
throw new UncheckedIOException(ex);
}
catch (RuntimeException ex) {
logger.error("Unexpected error", ex);
throw ex;
}
}
}
Expand Down
Loading
Loading