diff --git a/api/src/main/java/org/itsallcode/openfasttrace/api/FilterSettings.java b/api/src/main/java/org/itsallcode/openfasttrace/api/FilterSettings.java index 8b50411a5..a79d1eda9 100644 --- a/api/src/main/java/org/itsallcode/openfasttrace/api/FilterSettings.java +++ b/api/src/main/java/org/itsallcode/openfasttrace/api/FilterSettings.java @@ -1,6 +1,7 @@ package org.itsallcode.openfasttrace.api; import java.util.Collections; +import java.util.Objects; import java.util.Set; /** @@ -34,6 +35,7 @@ public Set getArtifactTypes() * * @return artifact types that must be matched */ + public Set getTags() { return this.tags; @@ -82,58 +84,16 @@ public boolean isAnyCriteriaSet() @Override public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result - + ((this.artifactTypes == null) ? 0 : this.artifactTypes.hashCode()); - result = prime * result + (this.withoutTags ? 1231 : 1237); - result = prime * result + ((this.tags == null) ? 0 : this.tags.hashCode()); - return result; + return Objects.hash(this.artifactTypes, this.tags, this.withoutTags); } @Override - public boolean equals(final Object obj) - { - if (this == obj) - { - return true; - } - if (obj == null) - { - return false; - } - if (!(obj instanceof FilterSettings)) - { - return false; - } - final FilterSettings other = (FilterSettings) obj; - if (this.artifactTypes == null) - { - if (other.artifactTypes != null) - { - return false; - } - } - else if (!this.artifactTypes.equals(other.artifactTypes)) - { - return false; - } - if (this.withoutTags != other.withoutTags) - { - return false; - } - if (this.tags == null) - { - if (other.tags != null) - { - return false; - } - } - else if (!this.tags.equals(other.tags)) - { + public boolean equals(final Object other) { + if (!(other instanceof final FilterSettings that)) { return false; } - return true; + return withoutTags == that.withoutTags && Objects.equals(artifactTypes, that.artifactTypes) + && Objects.equals(tags, that.tags); } /** @@ -160,7 +120,7 @@ public static Builder builder() /** * Builder for {@link FilterSettings} */ - public static class Builder + public static final class Builder { private Set artifactTypes = Collections.emptySet(); private Set tags = Collections.emptySet(); @@ -180,7 +140,7 @@ private Builder() */ public Builder artifactTypes(final Set artifactTypes) { - this.artifactTypes = artifactTypes; + this.artifactTypes = Set.copyOf(artifactTypes); return this; } @@ -193,7 +153,7 @@ public Builder artifactTypes(final Set artifactTypes) */ public Builder tags(final Set tags) { - this.tags = tags; + this.tags = Set.copyOf(tags); return this; } @@ -220,4 +180,4 @@ public FilterSettings build() return new FilterSettings(this); } } -} \ No newline at end of file +} diff --git a/api/src/main/java/org/itsallcode/openfasttrace/api/ReportSettings.java b/api/src/main/java/org/itsallcode/openfasttrace/api/ReportSettings.java index b8af61b71..3fa87ab2b 100644 --- a/api/src/main/java/org/itsallcode/openfasttrace/api/ReportSettings.java +++ b/api/src/main/java/org/itsallcode/openfasttrace/api/ReportSettings.java @@ -10,7 +10,7 @@ * This class implements a parameter object to control the settings of OFT's * report mode. */ -public class ReportSettings +public final class ReportSettings { private final ReportVerbosity verbosity; private final boolean showOrigin; @@ -112,12 +112,12 @@ public static Builder builder() /** * Builder for {@link ReportSettings} */ - public static class Builder + public static final class Builder { private DetailsSectionDisplay detailsSectionDisplay = DetailsSectionDisplay.COLLAPSE; private Newline newline = Newline.UNIX; private String outputFormat = ReportConstants.DEFAULT_REPORT_FORMAT; - private boolean showOrigin = false; + private boolean showOrigin; private ReportVerbosity verbosity = ReportVerbosity.FAILURE_DETAILS; private ColorScheme colorScheme = ColorScheme.BLACK_AND_WHITE; diff --git a/api/src/main/java/org/itsallcode/openfasttrace/api/cli/DirectoryService.java b/api/src/main/java/org/itsallcode/openfasttrace/api/cli/DirectoryService.java index 20ad9a879..589001711 100644 --- a/api/src/main/java/org/itsallcode/openfasttrace/api/cli/DirectoryService.java +++ b/api/src/main/java/org/itsallcode/openfasttrace/api/cli/DirectoryService.java @@ -12,4 +12,4 @@ public interface DirectoryService * @return current directory */ String getCurrent(); -} \ No newline at end of file +} diff --git a/api/src/main/java/org/itsallcode/openfasttrace/api/core/DeepCoverageStatus.java b/api/src/main/java/org/itsallcode/openfasttrace/api/core/DeepCoverageStatus.java index 470c6dae7..818ed3c45 100644 --- a/api/src/main/java/org/itsallcode/openfasttrace/api/core/DeepCoverageStatus.java +++ b/api/src/main/java/org/itsallcode/openfasttrace/api/core/DeepCoverageStatus.java @@ -21,23 +21,23 @@ public enum DeepCoverageStatus private final int badness; - private DeepCoverageStatus(final int badness) + DeepCoverageStatus(final int badness) { this.badness = badness; } /** - * Get the worse of two coverage status + * Get the worst of two coverage statuses * * @param a * left status to compare * @param b * right status to compare - * @return worse of both provided status + * @return worse of both provided statuses */ public static DeepCoverageStatus getWorst(final DeepCoverageStatus a, final DeepCoverageStatus b) { return (b.badness > a.badness) ? b : a; } -} \ No newline at end of file +} diff --git a/api/src/main/java/org/itsallcode/openfasttrace/api/core/ItemStatus.java b/api/src/main/java/org/itsallcode/openfasttrace/api/core/ItemStatus.java index 9ea98593c..9a0c73a91 100644 --- a/api/src/main/java/org/itsallcode/openfasttrace/api/core/ItemStatus.java +++ b/api/src/main/java/org/itsallcode/openfasttrace/api/core/ItemStatus.java @@ -1,5 +1,7 @@ package org.itsallcode.openfasttrace.api.core; +import java.util.Locale; + /** * This enumeration represents the different statuses of an item. */ @@ -47,6 +49,6 @@ public static ItemStatus parseString(final String text) @Override public String toString() { - return this.name().toLowerCase(); + return this.name().toLowerCase(Locale.ENGLISH); } } diff --git a/api/src/main/java/org/itsallcode/openfasttrace/api/core/LinkStatus.java b/api/src/main/java/org/itsallcode/openfasttrace/api/core/LinkStatus.java index 669003859..25954eda0 100644 --- a/api/src/main/java/org/itsallcode/openfasttrace/api/core/LinkStatus.java +++ b/api/src/main/java/org/itsallcode/openfasttrace/api/core/LinkStatus.java @@ -58,7 +58,7 @@ public enum LinkStatus private final String shortTag; private final String text; - private LinkStatus(final String shortTag, final String text) + LinkStatus(final String shortTag, final String text) { this.shortTag = shortTag; this.text = text; @@ -92,8 +92,10 @@ public boolean isOutgoing() */ public boolean isBadOutgoing() { - return (this == PREDATED) || (this == OUTDATED) || (this == AMBIGUOUS) || (this == UNWANTED) - || (this == ORPHANED); + return switch (this) { + case PREDATED, OUTDATED, AMBIGUOUS, UNWANTED, ORPHANED -> true; + default -> false; + }; } /** @@ -148,4 +150,4 @@ public String toString() { return this.text; } -} \ No newline at end of file +} diff --git a/api/src/main/java/org/itsallcode/openfasttrace/api/core/LinkedSpecificationItem.java b/api/src/main/java/org/itsallcode/openfasttrace/api/core/LinkedSpecificationItem.java index 23bb7ed5a..b163b6efb 100644 --- a/api/src/main/java/org/itsallcode/openfasttrace/api/core/LinkedSpecificationItem.java +++ b/api/src/main/java/org/itsallcode/openfasttrace/api/core/LinkedSpecificationItem.java @@ -187,7 +187,7 @@ private void cacheOverCoveredArtifactType(final LinkedSpecificationItem overcove */ public Map> getLinks() { - return this.links; + return new EnumMap<>(this.links); } /** @@ -249,7 +249,7 @@ public List getNeedsArtifactTypes() */ public Set getCoveredArtifactTypes() { - return this.coveredArtifactTypes; + return Collections.unmodifiableSet(this.coveredArtifactTypes); } /** @@ -259,7 +259,7 @@ public Set getCoveredArtifactTypes() */ public Set getCoveredApprovedArtifactTypes() { - return this.coveredArtifactTypesFromApprovedItems; + return Collections.unmodifiableSet(this.coveredArtifactTypesFromApprovedItems); } /** @@ -270,7 +270,7 @@ public Set getCoveredApprovedArtifactTypes() public Set getOverCoveredArtifactTypes() { - return this.overCoveredArtifactTypes; + return Collections.unmodifiableSet(this.overCoveredArtifactTypes); } /** @@ -416,9 +416,9 @@ private List getIncomingItems() public boolean isDefect() { return hasDuplicates() // - || (getStatus() != ItemStatus.REJECTED) // + || ((getStatus() != ItemStatus.REJECTED) // && (hasBadLinks() - || (getDeepCoverageStatus() != DeepCoverageStatus.COVERED)); + || (getDeepCoverageStatus() != DeepCoverageStatus.COVERED))); } /** diff --git a/api/src/main/java/org/itsallcode/openfasttrace/api/core/Location.java b/api/src/main/java/org/itsallcode/openfasttrace/api/core/Location.java index 5aa697ce0..3103c1e70 100644 --- a/api/src/main/java/org/itsallcode/openfasttrace/api/core/Location.java +++ b/api/src/main/java/org/itsallcode/openfasttrace/api/core/Location.java @@ -1,5 +1,7 @@ package org.itsallcode.openfasttrace.api.core; +import java.util.Objects; + /** * The location of a coverage item. */ @@ -112,58 +114,23 @@ public int getColumn() @Override public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + this.column; - result = prime * result + this.line; - result = prime * result + ((this.path == null) ? 0 : this.path.hashCode()); - return result; + return Objects.hash(this.column, this.line, this.path); } @Override - public boolean equals(final Object obj) - { - if (this == obj) - { - return true; - } - if (obj == null) - { - return false; - } - if (getClass() != obj.getClass()) - { - return false; - } - final Location other = (Location) obj; - if (this.column != other.column) - { - return false; - } - if (this.line != other.line) - { - return false; - } - if (this.path == null) - { - if (other.path != null) - { - return false; - } - } - else if (!this.path.equals(other.path)) - { + public boolean equals(final Object other) { + if (!(other instanceof final Location location)) { return false; } - return true; + return line == location.line && column == location.column && Objects.equals(path, location.path); } @Override public String toString() { return this.path // - + (this.line != NO_LINE ? ":" + this.line : "") // - + (this.column != NO_COLUMN ? ":" + this.column : ""); + + ((this.line != NO_LINE) ? (":" + this.line) : "") // + + ((this.column != NO_COLUMN) ? (":" + this.column) : ""); } /** @@ -180,7 +147,7 @@ public static Builder builder() * A builder for {@link Location}. Use {@link Location#builder()} to create * a new builder and call {@link #build()} to build a {@link Location}. */ - public static class Builder + public static final class Builder { private String path; private int line = NO_LINE; @@ -250,4 +217,4 @@ public boolean isCompleteEnough() return this.path != null && !this.path.isEmpty(); } } -} \ No newline at end of file +} diff --git a/api/src/main/java/org/itsallcode/openfasttrace/api/core/Newline.java b/api/src/main/java/org/itsallcode/openfasttrace/api/core/Newline.java index e08d45195..51139011e 100644 --- a/api/src/main/java/org/itsallcode/openfasttrace/api/core/Newline.java +++ b/api/src/main/java/org/itsallcode/openfasttrace/api/core/Newline.java @@ -18,7 +18,7 @@ public enum Newline private static final Pattern ANY_NEWLINE_PATTERN = Pattern.compile(ANY_NEWLINE_REG_EX); private final String representation; - private Newline(final String representation) + Newline(final String representation) { this.representation = representation; } @@ -38,18 +38,14 @@ public String toString() */ public static Newline fromRepresentation(final String representation) { - switch (representation) + return switch (representation) { - case "\n": - return UNIX; - case "\r\n": - return WINDOWS; - case "\r": - return OLDMAC; - default: - throw new IllegalArgumentException( + case "\n" -> UNIX; + case "\r\n" -> WINDOWS; + case "\r" -> OLDMAC; + default -> throw new IllegalArgumentException( "Line separator not supported: '" + representation + "'"); - } + }; } /** diff --git a/api/src/main/java/org/itsallcode/openfasttrace/api/core/SpecificationItem.java b/api/src/main/java/org/itsallcode/openfasttrace/api/core/SpecificationItem.java index 92ca7a774..9561bb78a 100644 --- a/api/src/main/java/org/itsallcode/openfasttrace/api/core/SpecificationItem.java +++ b/api/src/main/java/org/itsallcode/openfasttrace/api/core/SpecificationItem.java @@ -7,7 +7,7 @@ * coverage for other items. */ // [impl->dsn~specification-item~3] -public class SpecificationItem +public final class SpecificationItem { private final SpecificationItemId id; private final String title; @@ -31,10 +31,10 @@ private SpecificationItem(final Builder builder) this.comment = builder.comment; this.location = builder.location; this.status = builder.status; - this.coveredIds = builder.coveredIds; - this.dependOnIds = builder.dependOnIds; - this.needsArtifactTypes = builder.neededArtifactTypes; - this.tags = builder.tags; + this.coveredIds = Collections.unmodifiableList(builder.coveredIds); + this.dependOnIds = Collections.unmodifiableList(builder.dependOnIds); + this.needsArtifactTypes = Collections.unmodifiableList(builder.neededArtifactTypes); + this.tags = Collections.unmodifiableList(builder.tags); this.forwards = builder.forwards; } @@ -220,161 +220,22 @@ public boolean isForwarding() } @Override - public final int hashCode() - { - final int prime = 31; - int result = 1; - result = prime * result + ((this.comment == null) ? 0 : this.comment.hashCode()); - result = prime * result + ((this.coveredIds == null) ? 0 : this.coveredIds.hashCode()); - result = prime * result + ((this.dependOnIds == null) ? 0 : this.dependOnIds.hashCode()); - result = prime * result + ((this.description == null) ? 0 : this.description.hashCode()); - result = prime * result + (this.forwards ? 1231 : 1237); - result = prime * result + ((this.id == null) ? 0 : this.id.hashCode()); - result = prime * result + ((this.location == null) ? 0 : this.location.hashCode()); - result = prime * result - + ((this.needsArtifactTypes == null) ? 0 : this.needsArtifactTypes.hashCode()); - result = prime * result + ((this.rationale == null) ? 0 : this.rationale.hashCode()); - result = prime * result + ((this.status == null) ? 0 : this.status.hashCode()); - result = prime * result + ((this.tags == null) ? 0 : this.tags.hashCode()); - result = prime * result + ((this.title == null) ? 0 : this.title.hashCode()); - return result; + public boolean equals(final Object other) { + if (!(other instanceof final SpecificationItem that)) { + return false; + } + return forwards == that.forwards && Objects.equals(id, that.id) && Objects.equals(title, that.title) + && Objects.equals(description, that.description) && Objects.equals(rationale, that.rationale) + && Objects.equals(comment, that.comment) && Objects.equals(location, that.location) + && status == that.status && Objects.equals(coveredIds, that.coveredIds) + && Objects.equals(dependOnIds, that.dependOnIds) + && Objects.equals(needsArtifactTypes, that.needsArtifactTypes) && Objects.equals(tags, that.tags); } @Override - public final boolean equals(final Object obj) - { - if (this == obj) - { - return true; - } - if (obj == null) - { - return false; - } - if (!(obj instanceof SpecificationItem)) - { - return false; - } - final SpecificationItem other = (SpecificationItem) obj; - if (this.comment == null) - { - if (other.comment != null) - { - return false; - } - } - else if (!this.comment.equals(other.comment)) - { - return false; - } - if (this.coveredIds == null) - { - if (other.coveredIds != null) - { - return false; - } - } - else if (!this.coveredIds.equals(other.coveredIds)) - { - return false; - } - if (this.dependOnIds == null) - { - if (other.dependOnIds != null) - { - return false; - } - } - else if (!this.dependOnIds.equals(other.dependOnIds)) - { - return false; - } - if (this.description == null) - { - if (other.description != null) - { - return false; - } - } - else if (!this.description.equals(other.description)) - { - return false; - } - if (this.forwards != other.forwards) - { - return false; - } - if (this.id == null) - { - if (other.id != null) - { - return false; - } - } - else if (!this.id.equals(other.id)) - { - return false; - } - if (this.location == null) - { - if (other.location != null) - { - return false; - } - } - else if (!this.location.equals(other.location)) - { - return false; - } - if (this.needsArtifactTypes == null) - { - if (other.needsArtifactTypes != null) - { - return false; - } - } - else if (!this.needsArtifactTypes.equals(other.needsArtifactTypes)) - { - return false; - } - if (this.rationale == null) - { - if (other.rationale != null) - { - return false; - } - } - else if (!this.rationale.equals(other.rationale)) - { - return false; - } - if (this.status != other.status) - { - return false; - } - if (this.tags == null) - { - if (other.tags != null) - { - return false; - } - } - else if (!this.tags.equals(other.tags)) - { - return false; - } - if (this.title == null) - { - if (other.title != null) - { - return false; - } - } - else if (!this.title.equals(other.title)) - { - return false; - } - return true; + public int hashCode() { + return Objects.hash(id, title, description, rationale, comment, location, status, coveredIds, dependOnIds, + needsArtifactTypes, tags, forwards); } /** @@ -390,7 +251,7 @@ public static Builder builder() /** * Builder for objects of type {@link SpecificationItem} */ - public static class Builder + public static final class Builder { private SpecificationItemId id; private String title; @@ -671,4 +532,4 @@ public Builder forwards(final boolean forwards) return this; } } -} \ No newline at end of file +} diff --git a/api/src/main/java/org/itsallcode/openfasttrace/api/core/SpecificationItemId.java b/api/src/main/java/org/itsallcode/openfasttrace/api/core/SpecificationItemId.java index 54a0c34d1..1b45ff2d7 100644 --- a/api/src/main/java/org/itsallcode/openfasttrace/api/core/SpecificationItemId.java +++ b/api/src/main/java/org/itsallcode/openfasttrace/api/core/SpecificationItemId.java @@ -1,16 +1,19 @@ package org.itsallcode.openfasttrace.api.core; +import java.util.Comparator; +import java.util.Objects; import java.util.logging.Logger; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * Specification item ID - * + *

* Consists of an artifact type (e.g. "test"), a name and a revision number. + *

*/ // [impl->dsn~specification-item-id~1] -public class SpecificationItemId implements Comparable +public final class SpecificationItemId implements Comparable { private static final Logger LOG = Logger.getLogger(SpecificationItemId.class.getName()); @@ -89,67 +92,23 @@ public String getArtifactType() } @Override - public final int hashCode() - { - final int prime = 31; - int result = 1; - result = prime * result + ((this.artifactType == null) ? 0 : this.artifactType.hashCode()); - result = prime * result + ((this.name == null) ? 0 : this.name.hashCode()); - result = prime * result + this.revision; - return result; + public boolean equals(final Object o) { + if (!(o instanceof final SpecificationItemId that)) { + return false; + } + return revision == that.revision && Objects.equals(name, that.name) + && Objects.equals(artifactType, that.artifactType); } @Override - public final boolean equals(final Object obj) - { - if (this == obj) - { - return true; - } - if (obj == null) - { - return false; - } - if (!(obj instanceof SpecificationItemId)) - { - return false; - } - final SpecificationItemId other = (SpecificationItemId) obj; - if (this.artifactType == null) - { - if (other.artifactType != null) - { - return false; - } - } - else if (!this.artifactType.equals(other.artifactType)) - { - return false; - } - if (this.name == null) - { - if (other.name != null) - { - return false; - } - } - else if (!this.name.equals(other.name)) - { - return false; - } - return (other.revision == REVISION_WILDCARD) || (this.revision == other.revision); + public int hashCode() { + return Objects.hash(name, revision, artifactType); } @Override public String toString() { - final StringBuilder builder = new StringBuilder() // - .append(this.artifactType) // - .append(ARTIFACT_TYPE_SEPARATOR) // - .append(this.name) // - .append(REVISION_SEPARATOR) // - .append(this.revision); - return builder.toString(); + return this.artifactType + ARTIFACT_TYPE_SEPARATOR + this.name + REVISION_SEPARATOR + this.revision; } /** @@ -401,22 +360,9 @@ private void parseRevision(final String text) @Override public int compareTo(final SpecificationItemId other) { - int compared = this.getArtifactType().compareTo(other.getArtifactType()); - if (compared == 0) - { - compared = this.getName().compareTo(other.getName()); - if (compared == 0) - { - if (this.getRevision() > other.getRevision()) - { - compared = 1; - } - else if (this.getRevision() < other.getRevision()) - { - compared = -1; - } - } - } - return compared; + return Comparator.comparing(SpecificationItemId::getArtifactType) + .thenComparing(SpecificationItemId::getName) + .thenComparingInt(SpecificationItemId::getRevision) + .compare(this, other); } } diff --git a/api/src/main/java/org/itsallcode/openfasttrace/api/core/Trace.java b/api/src/main/java/org/itsallcode/openfasttrace/api/core/Trace.java index 71a8ecceb..e8928d082 100644 --- a/api/src/main/java/org/itsallcode/openfasttrace/api/core/Trace.java +++ b/api/src/main/java/org/itsallcode/openfasttrace/api/core/Trace.java @@ -1,11 +1,12 @@ package org.itsallcode.openfasttrace.api.core; +import java.util.Collections; import java.util.List; /** * The result of tracing requirements. */ -public class Trace +public final class Trace { private final List items; private final List defectItems; @@ -94,7 +95,7 @@ public static Builder builder() * A builder for {@link Trace}. Use {@link Trace#builder()} to create a new * builder and call {@link #build()} to build a {@link Trace}. */ - public static class Builder + public static final class Builder { private List items; private List defectItems; @@ -112,7 +113,7 @@ private Builder() */ public Builder items(final List items) { - this.items = items; + this.items = Collections.unmodifiableList(items); return this; } @@ -125,7 +126,7 @@ public Builder items(final List items) */ public Builder defectItems(final List defectItems) { - this.defectItems = defectItems; + this.defectItems = Collections.unmodifiableList(defectItems); return this; } @@ -139,4 +140,4 @@ public Trace build() return new Trace(this.items, this.defectItems); } } -} \ No newline at end of file +} diff --git a/api/src/main/java/org/itsallcode/openfasttrace/api/core/TracedLink.java b/api/src/main/java/org/itsallcode/openfasttrace/api/core/TracedLink.java index 2b770ee83..9745e3f64 100644 --- a/api/src/main/java/org/itsallcode/openfasttrace/api/core/TracedLink.java +++ b/api/src/main/java/org/itsallcode/openfasttrace/api/core/TracedLink.java @@ -1,5 +1,7 @@ package org.itsallcode.openfasttrace.api.core; +import java.util.Objects; + /** * This class represents a link that had its status evaluated during a trace * run. @@ -64,42 +66,15 @@ public boolean isOutgoing() } @Override - public int hashCode() - { - final int prime = 31; - int result = 1; - result = prime * result + ((this.otherLinkEnd == null) ? 0 : this.otherLinkEnd.hashCode()); - result = prime * result + ((this.status == null) ? 0 : this.status.hashCode()); - return result; + public boolean equals(final Object o) { + if (!(o instanceof final TracedLink that)) { + return false; + } + return Objects.equals(otherLinkEnd, that.otherLinkEnd) && status == that.status; } @Override - public boolean equals(final Object obj) - { - if (this == obj) - { - return true; - } - if (obj == null) - { - return false; - } - if (!(obj instanceof TracedLink)) - { - return false; - } - final TracedLink other = (TracedLink) obj; - if (this.otherLinkEnd == null) - { - if (other.otherLinkEnd != null) - { - return false; - } - } - else if (!this.otherLinkEnd.equals(other.otherLinkEnd)) - { - return false; - } - return this.status == other.status; + public int hashCode() { + return Objects.hash(otherLinkEnd, status); } } diff --git a/api/src/main/java/org/itsallcode/openfasttrace/api/exporter/ExporterFactory.java b/api/src/main/java/org/itsallcode/openfasttrace/api/exporter/ExporterFactory.java index 5abd2fee0..a51dcd904 100644 --- a/api/src/main/java/org/itsallcode/openfasttrace/api/exporter/ExporterFactory.java +++ b/api/src/main/java/org/itsallcode/openfasttrace/api/exporter/ExporterFactory.java @@ -89,7 +89,7 @@ public Exporter createExporter(final Path file, final String format, final Chars return createExporter(writer, itemStream, newline); } - private Writer createWriter(final Path file, final Charset charset) + private static Writer createWriter(final Path file, final Charset charset) { if (file == null) { @@ -102,12 +102,12 @@ private Writer createWriter(final Path file, final Charset charset) // Using System.out by intention @SuppressWarnings("squid:S106") - private PrintStream getStdOutStream() + private static PrintStream getStdOutStream() { return System.out; } - private Writer createFileWriter(final Path file, final Charset charset) + private static Writer createFileWriter(final Path file, final Charset charset) { try { @@ -132,4 +132,4 @@ private Writer createFileWriter(final Path file, final Charset charset) */ protected abstract Exporter createExporter(final Writer writer, Stream linkedSpecItemStream, final Newline newline); -} \ No newline at end of file +} diff --git a/api/src/main/java/org/itsallcode/openfasttrace/api/importer/ImportSettings.java b/api/src/main/java/org/itsallcode/openfasttrace/api/importer/ImportSettings.java index 1cad0704d..58d690bfb 100644 --- a/api/src/main/java/org/itsallcode/openfasttrace/api/importer/ImportSettings.java +++ b/api/src/main/java/org/itsallcode/openfasttrace/api/importer/ImportSettings.java @@ -2,6 +2,8 @@ import java.nio.file.Path; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; import java.util.List; import org.itsallcode.openfasttrace.api.FilterSettings; @@ -10,7 +12,7 @@ /** * Configuration for an {@link Importer}. */ -public class ImportSettings +public final class ImportSettings { private final List inputs; private final FilterSettings filter; @@ -18,9 +20,9 @@ public class ImportSettings private ImportSettings(final Builder builder) { - this.inputs = builder.inputs; + this.inputs = Collections.unmodifiableList(builder.inputs); this.filter = builder.filter; - this.pathConfigs = builder.pathConfigs; + this.pathConfigs = Collections.unmodifiableList(builder.pathConfigs); } /** @@ -55,7 +57,7 @@ public List getPathConfigs() } /** - * Create a the default import settings + * Create the default import settings * * @return default import settings */ @@ -77,7 +79,7 @@ public static Builder builder() /** * Builder for {@link ImportSettings} */ - public static class Builder + public static final class Builder { private final List inputs = new ArrayList<>(); private FilterSettings filter = FilterSettings.createAllowingEverything(); @@ -109,10 +111,7 @@ public Builder addInputs(final List inputs) */ public Builder addInputs(final Path... inputs) { - for (final Path input : inputs) - { - this.inputs.add(input); - } + this.inputs.addAll(Arrays.asList(inputs)); return this; } @@ -138,7 +137,7 @@ public Builder filter(final FilterSettings filter) */ public Builder pathConfigs(final List pathConfigs) { - this.pathConfigs = pathConfigs; + this.pathConfigs = Collections.unmodifiableList(pathConfigs); return this; } @@ -152,4 +151,4 @@ public ImportSettings build() return new ImportSettings(this); } } -} \ No newline at end of file +} diff --git a/api/src/main/java/org/itsallcode/openfasttrace/api/importer/ImporterContext.java b/api/src/main/java/org/itsallcode/openfasttrace/api/importer/ImporterContext.java index 219432ccc..81fff548d 100644 --- a/api/src/main/java/org/itsallcode/openfasttrace/api/importer/ImporterContext.java +++ b/api/src/main/java/org/itsallcode/openfasttrace/api/importer/ImporterContext.java @@ -52,4 +52,4 @@ public ImportSettings getImportSettings() { return this.settings; } -} \ No newline at end of file +} diff --git a/api/src/main/java/org/itsallcode/openfasttrace/api/importer/SpecificationListBuilder.java b/api/src/main/java/org/itsallcode/openfasttrace/api/importer/SpecificationListBuilder.java index da9c717b7..8136fe67d 100644 --- a/api/src/main/java/org/itsallcode/openfasttrace/api/importer/SpecificationListBuilder.java +++ b/api/src/main/java/org/itsallcode/openfasttrace/api/importer/SpecificationListBuilder.java @@ -10,12 +10,12 @@ * map of specification items from them. The key to the map is the specification * item ID. */ -public class SpecificationListBuilder implements ImportEventListener +public final class SpecificationListBuilder implements ImportEventListener { private final FilterSettings filterSettings; private final List items = new LinkedList<>(); - private SpecificationItem.Builder itemBuilder = null; - private SpecificationItemId id = null; + private SpecificationItem.Builder itemBuilder; + private SpecificationItemId id; private StringBuilder description = new StringBuilder(); private StringBuilder rationale = new StringBuilder(); private StringBuilder comment = new StringBuilder(); @@ -139,7 +139,7 @@ public void addTag(final String tag) public List build() { this.endSpecificationItem(); - return this.items; + return Collections.unmodifiableList(this.items) ; } /** @@ -228,4 +228,4 @@ public void setForwards(final boolean forwards) { this.itemBuilder.forwards(forwards); } -} \ No newline at end of file +} diff --git a/api/src/main/java/org/itsallcode/openfasttrace/api/importer/input/RealFileInput.java b/api/src/main/java/org/itsallcode/openfasttrace/api/importer/input/RealFileInput.java index f8c5d219e..ac6df29f3 100644 --- a/api/src/main/java/org/itsallcode/openfasttrace/api/importer/input/RealFileInput.java +++ b/api/src/main/java/org/itsallcode/openfasttrace/api/importer/input/RealFileInput.java @@ -9,7 +9,7 @@ /** * An {@link InputFile} for a file on disk, represented by a {@link Path}. */ -public class RealFileInput implements InputFile +public final class RealFileInput implements InputFile { private final Path path; private final Charset charset; diff --git a/api/src/main/java/org/itsallcode/openfasttrace/api/importer/tag/config/DescribedPathMatcher.java b/api/src/main/java/org/itsallcode/openfasttrace/api/importer/tag/config/DescribedPathMatcher.java index 0e3d67800..0df802bc0 100644 --- a/api/src/main/java/org/itsallcode/openfasttrace/api/importer/tag/config/DescribedPathMatcher.java +++ b/api/src/main/java/org/itsallcode/openfasttrace/api/importer/tag/config/DescribedPathMatcher.java @@ -7,7 +7,7 @@ /** * A wrapper for {@link PathMatcher} providing a description. */ -public class DescribedPathMatcher +public final class DescribedPathMatcher { private static final String REGEX_PREFIX = "regex:"; private static final String GLOB_PREFIX = "glob:"; @@ -95,7 +95,7 @@ private static class ListBasedPathMatcher implements PathMatcher public ListBasedPathMatcher(final Set paths) { - this.paths = paths; + this.paths = Set.copyOf(paths); } @Override diff --git a/api/src/main/java/org/itsallcode/openfasttrace/api/importer/tag/config/PathConfig.java b/api/src/main/java/org/itsallcode/openfasttrace/api/importer/tag/config/PathConfig.java index bac6aaa48..24c4158d7 100644 --- a/api/src/main/java/org/itsallcode/openfasttrace/api/importer/tag/config/PathConfig.java +++ b/api/src/main/java/org/itsallcode/openfasttrace/api/importer/tag/config/PathConfig.java @@ -13,7 +13,7 @@ * The configuration of a single path that is imported by the tag importer Use * {@link #builder()} to create a new instance. */ -public class PathConfig +public final class PathConfig { private static final Logger LOG = Logger.getLogger(PathConfig.class.getName()); @@ -109,7 +109,7 @@ public static Builder builder() /** * Builder for {@link PathConfig} objects. */ - public static class Builder + public static final class Builder { private DescribedPathMatcher pathMatcher; private String coveredItemNamePrefix; diff --git a/core/src/main/java/org/itsallcode/openfasttrace/core/ExportSettings.java b/core/src/main/java/org/itsallcode/openfasttrace/core/ExportSettings.java index b8b9b7d8c..eb864916a 100644 --- a/core/src/main/java/org/itsallcode/openfasttrace/core/ExportSettings.java +++ b/core/src/main/java/org/itsallcode/openfasttrace/core/ExportSettings.java @@ -7,7 +7,7 @@ * This class implements a parameter object to control the settings of OFT's * export mode. */ -public class ExportSettings +public final class ExportSettings { private final String outputFormat; private final Newline newline; @@ -61,7 +61,7 @@ public static Builder builder() /** * Builder for {@link ExportSettings} */ - public static class Builder + public static final class Builder { private String outputFormat = ExporterConstants.DEFAULT_OUTPUT_FORMAT; private Newline newline = Newline.UNIX; diff --git a/core/src/main/java/org/itsallcode/openfasttrace/core/LinkedItemIndex.java b/core/src/main/java/org/itsallcode/openfasttrace/core/LinkedItemIndex.java index c09918a2f..25e519ab2 100644 --- a/core/src/main/java/org/itsallcode/openfasttrace/core/LinkedItemIndex.java +++ b/core/src/main/java/org/itsallcode/openfasttrace/core/LinkedItemIndex.java @@ -9,7 +9,7 @@ * An idex for {@link LinkedSpecificationItem} that allows retrieving items by * {@link SpecificationItemId}, optionally ignoring the revision. */ -public class LinkedItemIndex +public final class LinkedItemIndex { private final Map idIndex; private final Map> idIndexIgnoringVersion; @@ -124,7 +124,7 @@ public List getByIdIgnoringVersion(final SpecificationI return items == null ? Collections.emptyList() : items; } - static final class SpecificationItemIdWithoutVersion + static final class SpecificationItemIdWithoutVersion implements Comparable { private final String name; private final String artifcatType; @@ -140,56 +140,33 @@ public SpecificationItemIdWithoutVersion(final LinkedSpecificationItem linkedIte this(linkedItem.getId()); } + public String getName() { + return this.name; + } + + public String getArtifcatType() { + return this.artifcatType; + } + @Override public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result - + ((this.artifcatType == null) ? 0 : this.artifcatType.hashCode()); - result = prime * result + ((this.name == null) ? 0 : this.name.hashCode()); - return result; + return Objects.hash(this.artifcatType, this.name); } @Override - public boolean equals(final Object obj) - { - if (this == obj) - { - return true; - } - if (obj == null) - { - return false; - } - if (getClass() != obj.getClass()) - { + public boolean equals(final Object other) { + if (!(other instanceof final SpecificationItemIdWithoutVersion that)) { return false; } - final SpecificationItemIdWithoutVersion other = (SpecificationItemIdWithoutVersion) obj; - if (this.artifcatType == null) - { - if (other.artifcatType != null) - { - return false; - } - } - else if (!this.artifcatType.equals(other.artifcatType)) - { - return false; - } - if (this.name == null) - { - if (other.name != null) - { - return false; - } - } - else if (!this.name.equals(other.name)) - { - return false; - } - return true; + return Objects.equals(name, that.name) && Objects.equals(artifcatType, that.artifcatType); + } + + @Override + public int compareTo(final SpecificationItemIdWithoutVersion other) { + return Comparator.comparing(SpecificationItemIdWithoutVersion::getArtifcatType) + .thenComparing(SpecificationItemIdWithoutVersion::getName) + .compare(this, other); } } } diff --git a/core/src/main/java/org/itsallcode/openfasttrace/core/Linker.java b/core/src/main/java/org/itsallcode/openfasttrace/core/Linker.java index 5660bd111..943eba552 100644 --- a/core/src/main/java/org/itsallcode/openfasttrace/core/Linker.java +++ b/core/src/main/java/org/itsallcode/openfasttrace/core/Linker.java @@ -1,5 +1,6 @@ package org.itsallcode.openfasttrace.core; +import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -30,7 +31,7 @@ public Linker(final List items) this.staleIndex = new HashMap<>(); } - private List wrapItems(final List items) + private static List wrapItems(final List items) { return items.stream() // .map(LinkedSpecificationItem::new) // @@ -45,12 +46,11 @@ private List wrapItems(final List it // [impl->dsn~tracing.needed-coverage-status~1] public List link() { - for (final LinkedSpecificationItem linkedItem : this.linkedItems) { linkItem(linkedItem); } - return this.linkedItems; + return Collections.unmodifiableList(this.linkedItems); } private void linkItem(final LinkedSpecificationItem item) @@ -78,7 +78,7 @@ private void linkItemToItemWithId(final LinkedSpecificationItem item, } } - private void linkMatchingRevision(final LinkedSpecificationItem covering, + private static void linkMatchingRevision(final LinkedSpecificationItem covering, final LinkedSpecificationItem covered) { final String coveringArtifactType = covering.getArtifactType(); @@ -126,7 +126,7 @@ private LinkedSpecificationItem findOrCreateStaleItem(final SpecificationItemId return this.staleIndex.get(id); } - private void linkToOutdatedOrPredated(final LinkedSpecificationItem item, + private static void linkToOutdatedOrPredated(final LinkedSpecificationItem item, final SpecificationItemId id, final List coveredLinkedItems) { @@ -152,4 +152,4 @@ else if (id.getRevision() > coveredItemRevision) } } } -} \ No newline at end of file +} diff --git a/core/src/main/java/org/itsallcode/openfasttrace/core/Oft.java b/core/src/main/java/org/itsallcode/openfasttrace/core/Oft.java index 6f508b874..a2ca887ec 100644 --- a/core/src/main/java/org/itsallcode/openfasttrace/core/Oft.java +++ b/core/src/main/java/org/itsallcode/openfasttrace/core/Oft.java @@ -125,4 +125,4 @@ static Oft create() { return new OftRunner(); } -} \ No newline at end of file +} diff --git a/core/src/main/java/org/itsallcode/openfasttrace/core/cli/ArgumentValidator.java b/core/src/main/java/org/itsallcode/openfasttrace/core/cli/ArgumentValidator.java index f80eb1cff..163a088e2 100644 --- a/core/src/main/java/org/itsallcode/openfasttrace/core/cli/ArgumentValidator.java +++ b/core/src/main/java/org/itsallcode/openfasttrace/core/cli/ArgumentValidator.java @@ -101,7 +101,7 @@ private boolean validateConvertCommand() return ok; } - private String listCommands() + private static String listCommands() { return AVAILABLE_COMMANDS.stream().map(text -> "'" + text + "'") .collect(Collectors.joining(",")); diff --git a/core/src/main/java/org/itsallcode/openfasttrace/core/cli/CliArguments.java b/core/src/main/java/org/itsallcode/openfasttrace/core/cli/CliArguments.java index 3aa0c5bf1..c07678b76 100644 --- a/core/src/main/java/org/itsallcode/openfasttrace/core/cli/CliArguments.java +++ b/core/src/main/java/org/itsallcode/openfasttrace/core/cli/CliArguments.java @@ -3,6 +3,7 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.*; +import java.util.regex.Pattern; import org.itsallcode.openfasttrace.api.ColorScheme; import org.itsallcode.openfasttrace.api.DetailsSectionDisplay; @@ -24,6 +25,7 @@ public class CliArguments { /** Filter in command line arguments matching items with no tags. */ public static final String NO_TAGS_MARKER = "_"; + private static final Pattern COMMA_SEPARATED_PATTERN = Pattern.compile(",(?U)\\s*"); // [impl->dsn~cli.default-newline-format~1] private Newline newline = Newline.fromRepresentation(System.lineSeparator()); private List unnamedValues; @@ -135,7 +137,9 @@ public List getInputs() */ public void setUnnamedValues(final List unnamedValues) { - this.unnamedValues = unnamedValues; + this.unnamedValues = unnamedValues == null + ? List.of() + : Collections.unmodifiableList(unnamedValues); } /** @@ -295,7 +299,7 @@ public void setH(final boolean helpSet) */ public Set getWantedArtifactTypes() { - return this.wantedArtifactTypes; + return Collections.unmodifiableSet(this.wantedArtifactTypes); } /** @@ -309,9 +313,9 @@ public void setWantedArtifactTypes(final String artifactTypes) this.wantedArtifactTypes = createSetFromCommaSeparatedString(artifactTypes); } - private HashSet createSetFromCommaSeparatedString(final String commaSeparatedString) + private static Set createSetFromCommaSeparatedString(final String commaSeparatedString) { - return new HashSet<>(Arrays.asList(commaSeparatedString.split(",\\s*"))); + return Set.of(COMMA_SEPARATED_PATTERN.split(commaSeparatedString)); } /** @@ -332,7 +336,7 @@ public void setA(final String artifactTypes) */ public Set getWantedTags() { - return this.wantedTags; + return Collections.unmodifiableSet(this.wantedTags); } /** @@ -397,7 +401,7 @@ public void setT(final String tags) * * @return {@code true} if origin information should be shown in reports. */ - public boolean getShowOrigin() + public boolean isShowOrigin() { return this.showOrigin; } diff --git a/core/src/main/java/org/itsallcode/openfasttrace/core/cli/CliException.java b/core/src/main/java/org/itsallcode/openfasttrace/core/cli/CliException.java index 69d3fd0fa..8ed80ce97 100644 --- a/core/src/main/java/org/itsallcode/openfasttrace/core/cli/CliException.java +++ b/core/src/main/java/org/itsallcode/openfasttrace/core/cli/CliException.java @@ -5,7 +5,7 @@ */ public class CliException extends Exception { - private static final long serialVersionUID = 3126173961917546825L; + private static final long serialVersionUID = 1L; /** * Create a new {@link CliException} caused by another exception diff --git a/core/src/main/java/org/itsallcode/openfasttrace/core/cli/CommandLineInterpreter.java b/core/src/main/java/org/itsallcode/openfasttrace/core/cli/CommandLineInterpreter.java index 87760465a..446cd481a 100644 --- a/core/src/main/java/org/itsallcode/openfasttrace/core/cli/CommandLineInterpreter.java +++ b/core/src/main/java/org/itsallcode/openfasttrace/core/cli/CommandLineInterpreter.java @@ -8,6 +8,7 @@ import java.util.*; import java.util.function.Function; import java.util.logging.Logger; +import java.util.regex.Pattern; import java.util.stream.Stream; /** @@ -15,7 +16,8 @@ *

* Users of this class must create a POJO that contains a setter method for each * command line argument that they want to use. - *

+ *

+ *

* Additionally, they can add a setter called setUnnamedValues that * will receive all argument values that are unnamed. *

@@ -26,10 +28,11 @@ public class CommandLineInterpreter private static final String UNNAMED_ARGUMENTS_SUFFIX = "unnamedvalues"; private static final String SINGLE_CHAR_ARG_PREFIX = "-"; + private static final Pattern SINGLE_CHAR_ARG_PREFIX_PATTERN = Pattern.compile(SINGLE_CHAR_ARG_PREFIX); private static final String MULTIPLE_CHAR_ARG_PREFIX = "--"; private static final String SETTER_PREFIX = "set"; private final Object argumentsReceiver; - private final String[] arguments; + private final List arguments; private final Map setters; /** @@ -42,7 +45,7 @@ public class CommandLineInterpreter */ public CommandLineInterpreter(final String[] arguments, final Object argumentsReceiver) { - this.arguments = arguments; + this.arguments = List.of(arguments); this.argumentsReceiver = argumentsReceiver; this.setters = findAllSettersInArgumentsReceiver(argumentsReceiver); } @@ -64,7 +67,7 @@ private static String getSetterName(final Method method) { return method.getName() .substring(SETTER_PREFIX.length()) - .toLowerCase(); + .toLowerCase(Locale.ENGLISH); } /** @@ -76,7 +79,7 @@ private static String getSetterName(final Method method) public void parse() throws CliException { final List unnamedArguments = new ArrayList<>(); - final ListIterator iterator = asList(this.arguments).listIterator(); + final ListIterator iterator = this.arguments.listIterator(); while (iterator.hasNext()) { final String argument = iterator.next(); @@ -102,7 +105,8 @@ else if (argument.startsWith(SINGLE_CHAR_ARG_PREFIX)) private void handleChainedSingleCharacterArguments(final ListIterator iterator, final String argument) throws CliException { - final String characters = argument.replaceFirst(SINGLE_CHAR_ARG_PREFIX, "").toLowerCase(Locale.ENGLISH); + final String characters = SINGLE_CHAR_ARG_PREFIX_PATTERN.matcher(argument).replaceFirst("") + .toLowerCase(Locale.ENGLISH); final int lastPosition = characters.length() - 1; for (int position = 0; position <= lastPosition; ++position) @@ -145,7 +149,7 @@ private static void handleUnnamedArgument(final List unnamedArguments, f unnamedArguments.add(argument); } - private void reportUnexpectedNamedArgument(final String argument) throws CliException + private static void reportUnexpectedNamedArgument(final String argument) throws CliException { throw new CliException("Unexpected parameter '" + argument + "' is not allowed"); } @@ -186,7 +190,7 @@ private void handleExpectedNamedArgument(final ListIterator iterator, } } - private T convertArgument(final String stringValue, final Class type) throws CliException + private static T convertArgument(final String stringValue, final Class type) throws CliException { if (type.equals(String.class)) { @@ -201,7 +205,7 @@ private T convertArgument(final String stringValue, final Class type) thr } @SuppressWarnings("unchecked") - private T convertEnum(final String stringValue, final Class type) throws CliException + private static T convertEnum(final String stringValue, final Class type) throws CliException { @SuppressWarnings("rawtypes") final Class enumType = type; @@ -219,13 +223,13 @@ private T convertEnum(final String stringValue, final Class type) throws } } - private void reportUnsupportedSetterArgumentCount(final Method setter) throws CliException + private static void reportUnsupportedSetterArgumentCount(final Method setter) throws CliException { throw new CliException("Unsupported argument count for setter '" + setter + "'. Only one argument is allowed."); } - private void reportMissingParameterValue(final String argumentName) throws CliException + private static void reportMissingParameterValue(final String argumentName) throws CliException { throw new CliException("No value for argument '" + argumentName + "'"); } diff --git a/core/src/main/java/org/itsallcode/openfasttrace/core/cli/StandardDirectoryService.java b/core/src/main/java/org/itsallcode/openfasttrace/core/cli/StandardDirectoryService.java index 57f5c7b84..6d1a4026f 100644 --- a/core/src/main/java/org/itsallcode/openfasttrace/core/cli/StandardDirectoryService.java +++ b/core/src/main/java/org/itsallcode/openfasttrace/core/cli/StandardDirectoryService.java @@ -20,4 +20,4 @@ public String getCurrent() { return System.getProperty("user.dir"); } -} \ No newline at end of file +} diff --git a/core/src/main/java/org/itsallcode/openfasttrace/core/cli/commands/AbstractCommand.java b/core/src/main/java/org/itsallcode/openfasttrace/core/cli/commands/AbstractCommand.java index edd2dc555..be1d7bd41 100644 --- a/core/src/main/java/org/itsallcode/openfasttrace/core/cli/commands/AbstractCommand.java +++ b/core/src/main/java/org/itsallcode/openfasttrace/core/cli/commands/AbstractCommand.java @@ -4,6 +4,7 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.*; +import java.util.stream.Collectors; import org.itsallcode.openfasttrace.api.FilterSettings; import org.itsallcode.openfasttrace.api.core.SpecificationItem; @@ -34,7 +35,7 @@ protected AbstractCommand(final CliArguments arguments) this.oft = Oft.create(); } - private List toPaths(final List inputs) + private static List toPaths(final List inputs) { final List inputsAsPaths = new ArrayList<>(); for (final String input : inputs) @@ -66,16 +67,12 @@ private void setTagFilter(final FilterSettings.Builder builder) final Set wantedTags = this.arguments.getWantedTags(); if (wantedTags != null && !wantedTags.isEmpty()) { - if (wantedTags.contains(CliArguments.NO_TAGS_MARKER)) - { - builder.withoutTags(true); - wantedTags.remove(CliArguments.NO_TAGS_MARKER); - } - else - { - builder.withoutTags(false); - } - builder.tags(wantedTags); + final boolean withoutTags = wantedTags.contains(CliArguments.NO_TAGS_MARKER); + builder.withoutTags(withoutTags); + final Set filteredTags = wantedTags.stream() + .filter(tag -> !CliArguments.NO_TAGS_MARKER.equals(tag)) + .collect(Collectors.toSet()); + builder.tags(filteredTags); } } @@ -88,9 +85,9 @@ protected List importItems() { final ImportSettings importSettings = ImportSettings .builder() - .addInputs(this.toPaths(this.arguments.getInputs())) + .addInputs(toPaths(this.arguments.getInputs())) .filter(createFilterSettingsFromArguments()) .build(); return this.oft.importItems(importSettings); } -} \ No newline at end of file +} diff --git a/core/src/main/java/org/itsallcode/openfasttrace/core/cli/commands/ConvertCommand.java b/core/src/main/java/org/itsallcode/openfasttrace/core/cli/commands/ConvertCommand.java index 1c316b5ec..979f9d20a 100644 --- a/core/src/main/java/org/itsallcode/openfasttrace/core/cli/commands/ConvertCommand.java +++ b/core/src/main/java/org/itsallcode/openfasttrace/core/cli/commands/ConvertCommand.java @@ -10,7 +10,7 @@ /** * Handler for specification item conversion CLI command. */ -public class ConvertCommand extends AbstractCommand implements Performable +public class ConvertCommand extends AbstractCommand { /** The command line action for running this command. */ public static final String COMMAND_NAME = "convert"; diff --git a/core/src/main/java/org/itsallcode/openfasttrace/core/cli/commands/TraceCommand.java b/core/src/main/java/org/itsallcode/openfasttrace/core/cli/commands/TraceCommand.java index 2d3b91dd1..a137b831c 100644 --- a/core/src/main/java/org/itsallcode/openfasttrace/core/cli/commands/TraceCommand.java +++ b/core/src/main/java/org/itsallcode/openfasttrace/core/cli/commands/TraceCommand.java @@ -68,7 +68,7 @@ private ReportSettings convertCommandLineArgumentsToReportSettings() .outputFormat(this.arguments.getOutputFormat()) // .verbosity(this.arguments.getReportVerbosity()) // .newline(this.arguments.getNewline()) // - .showOrigin(this.arguments.getShowOrigin()) // + .showOrigin(this.arguments.isShowOrigin()) // .colorScheme(this.arguments.getColorScheme()) // .detailsSectionDisplay(this.arguments.getDetailsSectionDisplay()) // .build(); diff --git a/core/src/main/java/org/itsallcode/openfasttrace/core/exporter/ExporterFactoryLoader.java b/core/src/main/java/org/itsallcode/openfasttrace/core/exporter/ExporterFactoryLoader.java index d2edb904e..4ec7bc226 100644 --- a/core/src/main/java/org/itsallcode/openfasttrace/core/exporter/ExporterFactoryLoader.java +++ b/core/src/main/java/org/itsallcode/openfasttrace/core/exporter/ExporterFactoryLoader.java @@ -47,17 +47,17 @@ public ExporterFactoryLoader(final ExporterContext context) public ExporterFactory getExporterFactory(final String outputFormat) { final List matchingExporters = getMatchingFactories(outputFormat); - switch (matchingExporters.size()) + return switch (matchingExporters.size()) { - case 0: + case 0 -> throw new ExporterException( "Found no matching exporter for output format '" + outputFormat + "'"); - case 1: - return matchingExporters.get(0); - default: + case 1 -> + matchingExporters.get(0); + default -> throw new ExporterException("Found more than one matching exporter for output format '" + outputFormat + "'"); - } + }; } private List getMatchingFactories(final String format) diff --git a/core/src/main/java/org/itsallcode/openfasttrace/core/importer/ImporterServiceImpl.java b/core/src/main/java/org/itsallcode/openfasttrace/core/importer/ImporterServiceImpl.java index 83b19012a..83fe1c23c 100644 --- a/core/src/main/java/org/itsallcode/openfasttrace/core/importer/ImporterServiceImpl.java +++ b/core/src/main/java/org/itsallcode/openfasttrace/core/importer/ImporterServiceImpl.java @@ -50,4 +50,4 @@ public MultiFileImporter createImporter() return createImporter( SpecificationListBuilder.createWithFilter(this.settings.getFilters())); } -} \ No newline at end of file +} diff --git a/core/src/main/java/org/itsallcode/openfasttrace/core/importer/MultiFileImporterImpl.java b/core/src/main/java/org/itsallcode/openfasttrace/core/importer/MultiFileImporterImpl.java index 6e53a5cca..d8348b9f6 100644 --- a/core/src/main/java/org/itsallcode/openfasttrace/core/importer/MultiFileImporterImpl.java +++ b/core/src/main/java/org/itsallcode/openfasttrace/core/importer/MultiFileImporterImpl.java @@ -117,7 +117,7 @@ private Optional createImporterIfPossible(final InputFile file, final .map(factory -> factory.createImporter(file, builder)); LOG.finest( - () -> (importer.isPresent() ? "Created importer of type '" + importer.get().getClass().getSimpleName() + () -> (importer.isPresent() ? ("Created importer of type '" + importer.get().getClass().getSimpleName()) : "No import") + "' for file '" + file + "'"); return importer; diff --git a/core/src/main/java/org/itsallcode/openfasttrace/core/report/ReportService.java b/core/src/main/java/org/itsallcode/openfasttrace/core/report/ReportService.java index 3ba64e542..b3307fc78 100644 --- a/core/src/main/java/org/itsallcode/openfasttrace/core/report/ReportService.java +++ b/core/src/main/java/org/itsallcode/openfasttrace/core/report/ReportService.java @@ -4,6 +4,8 @@ import java.io.PrintStream; import java.nio.file.Files; import java.nio.file.Path; +import java.util.logging.Level; +import java.util.logging.Logger; import org.itsallcode.openfasttrace.api.core.Trace; import org.itsallcode.openfasttrace.api.report.ReportException; @@ -16,6 +18,7 @@ */ public class ReportService { + private static final Logger LOGGER = Logger.getLogger(ReportService.class.getName()); private final ReporterFactoryLoader reporterFactoryLoader; /** @@ -73,7 +76,7 @@ public void reportTraceToStdOut(final Trace trace, final String outputFormat) // Using System.out by intention @SuppressWarnings("squid:S106") - private PrintStream getStdOutStream() + private static PrintStream getStdOutStream() { return System.out; } @@ -89,7 +92,9 @@ private void reportTraceToStream(final Trace trace, final OutputStream outputStr } catch (final IOException exception) { - throw new ReportException(exception.getMessage()); + final String MESSAGE = "Failed to flush report output stream"; + LOGGER.log(Level.SEVERE, MESSAGE, exception); + throw new ReportException(MESSAGE + exception.getMessage()); } } diff --git a/core/src/main/java/org/itsallcode/openfasttrace/core/report/ReporterFactoryLoader.java b/core/src/main/java/org/itsallcode/openfasttrace/core/report/ReporterFactoryLoader.java index ac9d22ccc..41a328996 100644 --- a/core/src/main/java/org/itsallcode/openfasttrace/core/report/ReporterFactoryLoader.java +++ b/core/src/main/java/org/itsallcode/openfasttrace/core/report/ReporterFactoryLoader.java @@ -48,17 +48,14 @@ private ReporterFactoryLoader(final Loader serviceLoader) public ReporterFactory getReporterFactory(final String outputFormat) { final List matchingReporters = getMatchingFactories(outputFormat); - switch (matchingReporters.size()) + return switch (matchingReporters.size()) { - case 0: - throw new ExporterException( + case 0 -> throw new ExporterException( "Found no matching reporter for output format '" + outputFormat + "'"); - case 1: - return matchingReporters.get(0); - default: - throw new ReportException("Found more than one matching reporter for output format '" + case 1 -> matchingReporters.get(0); + default -> throw new ReportException("Found more than one matching reporter for output format '" + outputFormat + "'"); - } + }; } private List getMatchingFactories(final String format) diff --git a/core/src/main/java/org/itsallcode/openfasttrace/core/serviceloader/ChildFirstClassLoader.java b/core/src/main/java/org/itsallcode/openfasttrace/core/serviceloader/ChildFirstClassLoader.java index 77f82e29f..3330b8447 100644 --- a/core/src/main/java/org/itsallcode/openfasttrace/core/serviceloader/ChildFirstClassLoader.java +++ b/core/src/main/java/org/itsallcode/openfasttrace/core/serviceloader/ChildFirstClassLoader.java @@ -2,6 +2,8 @@ import java.net.URL; import java.net.URLClassLoader; +import java.util.logging.Level; +import java.util.logging.Logger; /** * This class loader will first try to load the class from the given URLs and @@ -12,11 +14,15 @@ * included with OFT. *

* This is based on - * https://medium.com/@isuru89/java-a-child-first-class-loader-cbd9c3d0305 + * + * "Java: A Child First Class Loader" by Isuru Weerarathna + * *

*/ class ChildFirstClassLoader extends URLClassLoader { + private static final Logger LOGGER = Logger.getLogger(ChildFirstClassLoader.class.getName()); + ChildFirstClassLoader(final String name, final URL[] urls, final ClassLoader parent) { super(name, urls, parent); @@ -44,6 +50,7 @@ private Class findClass(final String name, final boolean resolve) throws Clas return loadClassInternally(name, resolve); } + @SuppressWarnings("java:S3032") // Intentionally accessing non-standard classloader private Class loadClassInternally(final String name, final boolean resolve) throws ClassNotFoundException { try @@ -53,8 +60,11 @@ private Class loadClassInternally(final String name, final boolean resolve) t } catch (final ClassNotFoundException ignore) { + LOGGER.log(Level.FINEST, () -> "Unable to find class " + name + " with child classloader '" + + this.getClass().getClassLoader().getName() + "'. " + + "Falling back to parent classloader '" + super.getClass().getClassLoader().getName() + "'."); // Class does not exist in the given URLs. - // Let's try finding it in our parent classloader. + // Let's try finding it in our parent class's classloader. // This will throw ClassNotFoundException on failure. return super.loadClass(name, resolve); } diff --git a/core/src/test/java/org/itsallcode/openfasttrace/core/TestLinkedItemIndex.java b/core/src/test/java/org/itsallcode/openfasttrace/core/TestLinkedItemIndex.java index 7a19ef239..a378654c0 100644 --- a/core/src/test/java/org/itsallcode/openfasttrace/core/TestLinkedItemIndex.java +++ b/core/src/test/java/org/itsallcode/openfasttrace/core/TestLinkedItemIndex.java @@ -10,6 +10,8 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; @@ -100,4 +102,22 @@ void testDuplicateVersionId() LinkedItemInstanceMatcher .sameItemInstance(this.duplicateIdIgnoringVersionItemMock)))); } + + @CsvSource({ + "a, b, a, b, -1", + "a, b, b, a, -1", + "a, a, a, a, 0", + "b, a, a, b, 1", + "a, a, b, a, 1" + }) + @ParameterizedTest + void testCompareSpecificationItemIdWithoutVersion(final String artifactTypeLeft, final String artifactTypeRight, + final String nameLeft, final String nameRight, final int expected) + { + final SpecificationItemIdWithoutVersion left = new SpecificationItemIdWithoutVersion( + SpecificationItemId.createId(artifactTypeLeft, nameLeft, 0)); + final SpecificationItemIdWithoutVersion right = new SpecificationItemIdWithoutVersion( + SpecificationItemId.createId(artifactTypeRight, nameRight, 0)); + assertThat(left.compareTo(right), equalTo(expected)); + } } diff --git a/core/src/test/java/org/itsallcode/openfasttrace/core/cli/TestCliArguments.java b/core/src/test/java/org/itsallcode/openfasttrace/core/cli/TestCliArguments.java index 143b18475..c538bf67f 100644 --- a/core/src/test/java/org/itsallcode/openfasttrace/core/cli/TestCliArguments.java +++ b/core/src/test/java/org/itsallcode/openfasttrace/core/cli/TestCliArguments.java @@ -210,7 +210,7 @@ void testSetWantedTagsIncludingNone() @Test void testShowOriginDisabledByDefault() { - assertThat(this.arguments.getShowOrigin(), is(false)); + assertThat(this.arguments.isShowOrigin(), is(false)); } // [utest->dsn~reporting.plain-text.specification-item-origin~1]] @@ -221,7 +221,7 @@ void testShowOriginDisabledByDefault() void testSetShowOrigin() { this.arguments.setShowOrigin(true); - assertThat(this.arguments.getShowOrigin(), is(true)); + assertThat(this.arguments.isShowOrigin(), is(true)); } // [utest->dsn~reporting.plain-text.specification-item-origin~1]] @@ -232,7 +232,7 @@ void testSetShowOrigin() void testSetS() { this.arguments.setS(true); - assertThat(this.arguments.getShowOrigin(), is(true)); + assertThat(this.arguments.isShowOrigin(), is(true)); } // [utest->dsn~reporting.plain-text.ansi-color~1] diff --git a/core/src/test/java/org/itsallcode/openfasttrace/core/importer/TestImporterService.java b/core/src/test/java/org/itsallcode/openfasttrace/core/importer/TestImporterService.java index 60d977629..0047f4a7c 100644 --- a/core/src/test/java/org/itsallcode/openfasttrace/core/importer/TestImporterService.java +++ b/core/src/test/java/org/itsallcode/openfasttrace/core/importer/TestImporterService.java @@ -3,7 +3,6 @@ import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.sameInstance; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -37,8 +36,6 @@ class TestImporterService private ImporterFactory importerFactoryMock; @Mock private Importer importerMock; - @Mock - private ImporterContext contextMock; @Captor private ArgumentCaptor builderArg; @@ -80,12 +77,10 @@ void testImportUnix() private void runImporter() { final List result = this.importerService.importFile(this.file); - verify(this.importerMock).runImport(); verify(this.importerFactoryMock).createImporter(this.fileArg.capture(), this.builderArg.capture()); - final SpecificationListBuilder builder = this.builderArg.getValue(); - assertThat(result, sameInstance(builder.build())); + assertThat(result, equalTo(builder.build())); } } diff --git a/core/src/test/java/org/itsallcode/openfasttrace/core/matcher/TestSpecificationItemIdMatcher.java b/core/src/test/java/org/itsallcode/openfasttrace/core/matcher/TestSpecificationItemIdMatcher.java index aad3a978f..c2dbc6454 100644 --- a/core/src/test/java/org/itsallcode/openfasttrace/core/matcher/TestSpecificationItemIdMatcher.java +++ b/core/src/test/java/org/itsallcode/openfasttrace/core/matcher/TestSpecificationItemIdMatcher.java @@ -2,13 +2,13 @@ import org.hamcrest.Matcher; import org.itsallcode.openfasttrace.api.core.SpecificationItemId; -import org.itsallcode.openfasttrace.testutil.matcher.MatcherTestBase; +import org.itsallcode.openfasttrace.testutil.matcher.AbstractMatcherTest; import org.junit.jupiter.api.Test; /** * Unit test for {@link SpecificationItemIdMatcher} */ -class TestSpecificationItemIdMatcher extends MatcherTestBase +class TestSpecificationItemIdMatcher extends AbstractMatcherTest { @Test void testMatches() diff --git a/exporter/common/src/main/java/org/itsallcode/openfasttrace/exporter/common/IndentingXMLStreamWriter.java b/exporter/common/src/main/java/org/itsallcode/openfasttrace/exporter/common/IndentingXMLStreamWriter.java index fd897fc0b..c112ddce3 100644 --- a/exporter/common/src/main/java/org/itsallcode/openfasttrace/exporter/common/IndentingXMLStreamWriter.java +++ b/exporter/common/src/main/java/org/itsallcode/openfasttrace/exporter/common/IndentingXMLStreamWriter.java @@ -22,7 +22,7 @@ private enum State private State state = State.SEEN_NOTHING; - private int depth = 0; + private int depth; /** * Create an new instance wrapping a delegate. diff --git a/exporter/specobject/src/main/java/org/itsallcode/openfasttrace/exporter/specobject/SpecobjectExporter.java b/exporter/specobject/src/main/java/org/itsallcode/openfasttrace/exporter/specobject/SpecobjectExporter.java index d772ef3a2..50b78953f 100644 --- a/exporter/specobject/src/main/java/org/itsallcode/openfasttrace/exporter/specobject/SpecobjectExporter.java +++ b/exporter/specobject/src/main/java/org/itsallcode/openfasttrace/exporter/specobject/SpecobjectExporter.java @@ -41,7 +41,7 @@ public SpecobjectExporter(final Stream itemStream, this.originalWriter = originalWriter; } - private Map> groupByDoctype( + private static Map> groupByDoctype( final Stream itemStream) { return itemStream.collect( diff --git a/importer/lightweightmarkup/src/main/java/org/itsallcode/openfasttrace/importer/lightweightmarkup/LightWeightMarkupImporter.java b/importer/lightweightmarkup/src/main/java/org/itsallcode/openfasttrace/importer/lightweightmarkup/AbstractLightWeightMarkupImporter.java similarity index 96% rename from importer/lightweightmarkup/src/main/java/org/itsallcode/openfasttrace/importer/lightweightmarkup/LightWeightMarkupImporter.java rename to importer/lightweightmarkup/src/main/java/org/itsallcode/openfasttrace/importer/lightweightmarkup/AbstractLightWeightMarkupImporter.java index 41bc69674..400ae7647 100644 --- a/importer/lightweightmarkup/src/main/java/org/itsallcode/openfasttrace/importer/lightweightmarkup/LightWeightMarkupImporter.java +++ b/importer/lightweightmarkup/src/main/java/org/itsallcode/openfasttrace/importer/lightweightmarkup/AbstractLightWeightMarkupImporter.java @@ -11,7 +11,7 @@ /** * Base class for importers of lightweight markup text. */ -public abstract class LightWeightMarkupImporter implements Importer, LineReaderCallback +public abstract class AbstractLightWeightMarkupImporter implements Importer, LineReaderCallback { /** File to be imported */ protected final InputFile file; @@ -24,7 +24,7 @@ public abstract class LightWeightMarkupImporter implements Importer, LineReaderC private LineContext currentContext; /** - * Create a new {@link LightWeightMarkupImporter}. + * Create a new {@link AbstractLightWeightMarkupImporter}. * * @param file * input file @@ -34,7 +34,7 @@ public abstract class LightWeightMarkupImporter implements Importer, LineReaderC // Possible 'this' escape before subclass is fully initialized: // LineParserStateMachine constructor does not use 'this'. @SuppressWarnings("this-escape") - protected LightWeightMarkupImporter(final InputFile file, final ImportEventListener listener) + protected AbstractLightWeightMarkupImporter(final InputFile file, final ImportEventListener listener) { this.file = file; this.listener = listener; @@ -131,7 +131,7 @@ protected void informListenerAboutNewItem() * End a specification item gracefully. *

* As opposed to forcing an end at clean-up (see - * {@link LightWeightMarkupImporter#cleanUpLastItem()}. + * {@link AbstractLightWeightMarkupImporter#cleanUpLastItem()}. *

*/ protected void endItem() diff --git a/importer/lightweightmarkup/src/main/java/org/itsallcode/openfasttrace/importer/lightweightmarkup/ForwardingSpecificationItem.java b/importer/lightweightmarkup/src/main/java/org/itsallcode/openfasttrace/importer/lightweightmarkup/ForwardingSpecificationItem.java index eb9306ce6..795801742 100644 --- a/importer/lightweightmarkup/src/main/java/org/itsallcode/openfasttrace/importer/lightweightmarkup/ForwardingSpecificationItem.java +++ b/importer/lightweightmarkup/src/main/java/org/itsallcode/openfasttrace/importer/lightweightmarkup/ForwardingSpecificationItem.java @@ -1,7 +1,7 @@ package org.itsallcode.openfasttrace.importer.lightweightmarkup; -import java.util.Arrays; import java.util.List; +import java.util.regex.Pattern; import org.itsallcode.openfasttrace.api.core.SpecificationItemId; @@ -18,6 +18,7 @@ public class ForwardingSpecificationItem public static final String ORIGINAL_MARKER = ":"; /** Marker after which the artifact types are listed to which we forward. */ public static final String FORWARD_MARKER = "-->"; + private static final Pattern COMMA_SEPARATED_REGEX = Pattern.compile("(?U),\\s*"); private final String skippedArtifactType; private final SpecificationItemId originalId; private final SpecificationItemId skippedId; @@ -34,19 +35,19 @@ public ForwardingSpecificationItem(final String forward) final int posForwardMarker = forward.indexOf(FORWARD_MARKER); final int posOriginalMarker = forward.indexOf(ORIGINAL_MARKER); this.skippedArtifactType = forward.substring(0, posForwardMarker).trim(); - this.targetArtifactTypes = Arrays.asList(forward // - .substring(posForwardMarker + FORWARD_MARKER.length(), posOriginalMarker) // - .trim() // - .split(",\\s*")); - this.originalId = SpecificationItemId.parseId(forward // - .substring(posOriginalMarker + ORIGINAL_MARKER.length()) // + final String commaSeparatedTargetArtifactTypes = forward + .substring(posForwardMarker + FORWARD_MARKER.length(), posOriginalMarker) + .trim(); + this.targetArtifactTypes = List.of(COMMA_SEPARATED_REGEX.split(commaSeparatedTargetArtifactTypes)); + this.originalId = SpecificationItemId.parseId(forward + .substring(posOriginalMarker + ORIGINAL_MARKER.length()) .trim()); this.skippedId = SpecificationItemId.createId(this.skippedArtifactType, this.originalId.getName(), this.originalId.getRevision()); } /** - * The artifact type which forwards the needed coverage (in effect the one + * The artifact type that forwards the needed coverage (in effect the one * that is "skipped" during authoring) * * @return the "skipped" artifact type @@ -86,4 +87,4 @@ public List getTargetArtifactTypes() { return this.targetArtifactTypes; } -} \ No newline at end of file +} diff --git a/importer/markdown/src/main/java/org/itsallcode/openfasttrace/importer/markdown/MarkdownImporter.java b/importer/markdown/src/main/java/org/itsallcode/openfasttrace/importer/markdown/MarkdownImporter.java index 85374d103..5aa0322e9 100644 --- a/importer/markdown/src/main/java/org/itsallcode/openfasttrace/importer/markdown/MarkdownImporter.java +++ b/importer/markdown/src/main/java/org/itsallcode/openfasttrace/importer/markdown/MarkdownImporter.java @@ -4,7 +4,7 @@ import org.itsallcode.openfasttrace.api.importer.ImportEventListener; import org.itsallcode.openfasttrace.api.importer.input.InputFile; -import org.itsallcode.openfasttrace.importer.lightweightmarkup.LightWeightMarkupImporter; +import org.itsallcode.openfasttrace.importer.lightweightmarkup.AbstractLightWeightMarkupImporter; import org.itsallcode.openfasttrace.importer.lightweightmarkup.statemachine.*; /** @@ -18,7 +18,7 @@ * explicitly not the purpose of the importer. *

*/ -class MarkdownImporter extends LightWeightMarkupImporter +class MarkdownImporter extends AbstractLightWeightMarkupImporter { private static final LinePattern SECTION_TITLE = new MdSectionTitlePattern(); @@ -35,6 +35,7 @@ class MarkdownImporter extends LightWeightMarkupImporter super(fileName, listener); } + @SuppressWarnings("squid:S138") // Transition table is OK be larger than 75 lines. protected Transition[] configureTransitions() { // @formatter:off diff --git a/importer/restructuredtext/src/main/java/org/itsallcode/openfasttrace/importer/restructuredtext/RestructuredTextImporter.java b/importer/restructuredtext/src/main/java/org/itsallcode/openfasttrace/importer/restructuredtext/RestructuredTextImporter.java index 979ca6a3a..4a7402b94 100644 --- a/importer/restructuredtext/src/main/java/org/itsallcode/openfasttrace/importer/restructuredtext/RestructuredTextImporter.java +++ b/importer/restructuredtext/src/main/java/org/itsallcode/openfasttrace/importer/restructuredtext/RestructuredTextImporter.java @@ -4,7 +4,7 @@ import org.itsallcode.openfasttrace.api.importer.ImportEventListener; import org.itsallcode.openfasttrace.api.importer.input.InputFile; -import org.itsallcode.openfasttrace.importer.lightweightmarkup.LightWeightMarkupImporter; +import org.itsallcode.openfasttrace.importer.lightweightmarkup.AbstractLightWeightMarkupImporter; import org.itsallcode.openfasttrace.importer.lightweightmarkup.statemachine.*; /** @@ -18,7 +18,7 @@ * is explicitly not the purpose of the importer. *

*/ -public class RestructuredTextImporter extends LightWeightMarkupImporter +public class RestructuredTextImporter extends AbstractLightWeightMarkupImporter { private static final LinePattern SECTION_TITLE = new RstSectionTitlePattern(); diff --git a/importer/specobject/src/main/java/org/itsallcode/openfasttrace/importer/specobject/SpecobjectImporterFactory.java b/importer/specobject/src/main/java/org/itsallcode/openfasttrace/importer/specobject/SpecobjectImporterFactory.java index d4137d163..8e7761e5d 100644 --- a/importer/specobject/src/main/java/org/itsallcode/openfasttrace/importer/specobject/SpecobjectImporterFactory.java +++ b/importer/specobject/src/main/java/org/itsallcode/openfasttrace/importer/specobject/SpecobjectImporterFactory.java @@ -66,7 +66,9 @@ private static boolean doesFileContainOreqmHeader(final InputFile file, final St } catch (final IOException exception) { - LOG.fine(() -> "Unable to peek XML file '" + path + "' trying to determine if it contains ReqM2 format: " + exception.getMessage()); + LOG.fine(() -> "Unable to peek XML file '" + path + + "' trying to determine if it contains ReqM2 format: " + + exception.getMessage()); return false; } } diff --git a/importer/specobject/src/main/java/org/itsallcode/openfasttrace/importer/specobject/handler/FulfilledByHandlerBuilder.java b/importer/specobject/src/main/java/org/itsallcode/openfasttrace/importer/specobject/handler/FulfilledByHandlerBuilder.java index 3a24d0433..7744c642c 100644 --- a/importer/specobject/src/main/java/org/itsallcode/openfasttrace/importer/specobject/handler/FulfilledByHandlerBuilder.java +++ b/importer/specobject/src/main/java/org/itsallcode/openfasttrace/importer/specobject/handler/FulfilledByHandlerBuilder.java @@ -14,11 +14,11 @@ class FulfilledByHandlerBuilder TreeContentHandler build() { - this.handler.addSubTreeHandler("ffbObj", this::createFulfillByObjectHandler); + this.handler.addSubTreeHandler("ffbObj", FulfilledByHandlerBuilder::createFulfillByObjectHandler); return this.handler; } - private CallbackContentHandler createFulfillByObjectHandler() + private static CallbackContentHandler createFulfillByObjectHandler() { return new CallbackContentHandler() .addCharacterDataListener("ffbId", data -> {}) diff --git a/importer/specobject/src/main/java/org/itsallcode/openfasttrace/importer/specobject/handler/SingleSpecObjectsHandlerBuilder.java b/importer/specobject/src/main/java/org/itsallcode/openfasttrace/importer/specobject/handler/SingleSpecObjectsHandlerBuilder.java index 554710997..cfa0570d1 100644 --- a/importer/specobject/src/main/java/org/itsallcode/openfasttrace/importer/specobject/handler/SingleSpecObjectsHandlerBuilder.java +++ b/importer/specobject/src/main/java/org/itsallcode/openfasttrace/importer/specobject/handler/SingleSpecObjectsHandlerBuilder.java @@ -10,7 +10,7 @@ class SingleSpecObjectsHandlerBuilder private final ImportEventListener listener; private final SpecificationItemId.Builder idBuilder; private final Location.Builder locationBuilder; - private String containedFileName = null; + private String containedFileName ; private int containedLine = -1; SingleSpecObjectsHandlerBuilder(final ImportEventListener listener, diff --git a/importer/specobject/src/main/java/org/itsallcode/openfasttrace/importer/specobject/handler/SpecDocumentHandlerBuilder.java b/importer/specobject/src/main/java/org/itsallcode/openfasttrace/importer/specobject/handler/SpecDocumentHandlerBuilder.java index 4c2db4c34..5e529db6f 100644 --- a/importer/specobject/src/main/java/org/itsallcode/openfasttrace/importer/specobject/handler/SpecDocumentHandlerBuilder.java +++ b/importer/specobject/src/main/java/org/itsallcode/openfasttrace/importer/specobject/handler/SpecDocumentHandlerBuilder.java @@ -51,7 +51,6 @@ public TreeContentHandler build() } LOG.warning(() -> "Found unknown element " + startElement); }); - this.handler.addElementListener("specdocument", elem -> { LOG.finest(() -> "Found specdocument element " + elem); if (!elem.isRootElement()) @@ -66,10 +65,8 @@ public TreeContentHandler build() throw new ImporterException("Element " + elem + " does not have an attribute '" + DOCTYPE_ATTRIBUTE_NAME + "' at " + elem.getLocation()); } - final String defaultDoctype = doctypeAttribute.getValue(); - this.handler.pushDelegate( - new SpecObjectsHandlerBuilder(this.file, defaultDoctype, this.listener) + this.handler.pushDelegate(new SpecObjectsHandlerBuilder(this.file, defaultDoctype, this.listener) .build()); }); diff --git a/importer/tag/src/main/java/org/itsallcode/openfasttrace/importer/tag/RegexLineConsumer.java b/importer/tag/src/main/java/org/itsallcode/openfasttrace/importer/tag/AbstractRegexLineConsumer.java similarity index 86% rename from importer/tag/src/main/java/org/itsallcode/openfasttrace/importer/tag/RegexLineConsumer.java rename to importer/tag/src/main/java/org/itsallcode/openfasttrace/importer/tag/AbstractRegexLineConsumer.java index b3231bb6d..1d2f4c9ce 100644 --- a/importer/tag/src/main/java/org/itsallcode/openfasttrace/importer/tag/RegexLineConsumer.java +++ b/importer/tag/src/main/java/org/itsallcode/openfasttrace/importer/tag/AbstractRegexLineConsumer.java @@ -4,16 +4,16 @@ import org.itsallcode.openfasttrace.importer.tag.LineReader.LineConsumer; -abstract class RegexLineConsumer implements LineConsumer +abstract class AbstractRegexLineConsumer implements LineConsumer { private final Pattern pattern; - RegexLineConsumer(final String patternRegex) + AbstractRegexLineConsumer(final String patternRegex) { this(Pattern.compile(patternRegex)); } - private RegexLineConsumer(final Pattern pattern) + private AbstractRegexLineConsumer(final Pattern pattern) { this.pattern = pattern; } diff --git a/importer/tag/src/main/java/org/itsallcode/openfasttrace/importer/tag/ChecksumCalculator.java b/importer/tag/src/main/java/org/itsallcode/openfasttrace/importer/tag/ChecksumCalculator.java index 127ffc3bc..b9619019c 100644 --- a/importer/tag/src/main/java/org/itsallcode/openfasttrace/importer/tag/ChecksumCalculator.java +++ b/importer/tag/src/main/java/org/itsallcode/openfasttrace/importer/tag/ChecksumCalculator.java @@ -3,10 +3,11 @@ import java.nio.charset.StandardCharsets; import java.util.zip.CRC32; -class ChecksumCalculator +final class ChecksumCalculator { private ChecksumCalculator() { + // Prevent instantiation. } static long calculateCrc32(final String value) diff --git a/importer/tag/src/main/java/org/itsallcode/openfasttrace/importer/tag/DelegatingLineConsumer.java b/importer/tag/src/main/java/org/itsallcode/openfasttrace/importer/tag/DelegatingLineConsumer.java index 47eb35019..da7a2ed1b 100644 --- a/importer/tag/src/main/java/org/itsallcode/openfasttrace/importer/tag/DelegatingLineConsumer.java +++ b/importer/tag/src/main/java/org/itsallcode/openfasttrace/importer/tag/DelegatingLineConsumer.java @@ -1,4 +1,5 @@ package org.itsallcode.openfasttrace.importer.tag; +import java.util.Collections; import java.util.List; import org.itsallcode.openfasttrace.importer.tag.LineReader.LineConsumer; @@ -9,7 +10,7 @@ class DelegatingLineConsumer implements LineConsumer DelegatingLineConsumer(final List delegates) { - this.delegates = delegates; + this.delegates = Collections.unmodifiableList(delegates); } @Override diff --git a/importer/tag/src/main/java/org/itsallcode/openfasttrace/importer/tag/LineReader.java b/importer/tag/src/main/java/org/itsallcode/openfasttrace/importer/tag/LineReader.java index a8d101605..0591511da 100644 --- a/importer/tag/src/main/java/org/itsallcode/openfasttrace/importer/tag/LineReader.java +++ b/importer/tag/src/main/java/org/itsallcode/openfasttrace/importer/tag/LineReader.java @@ -46,10 +46,10 @@ private void processLine(final LineConsumer consumer, final int currentLineNumbe { consumer.readLine(currentLineNumber, line); } - catch (final Exception exception) + catch (final RuntimeException exception) { throw new ImporterException("Error processing line " + this.file.getPath() + ":" - + currentLineNumber + " '" + line + "': " + exception.toString(), exception); + + currentLineNumber + " '" + line + "': " + exception, exception); } } diff --git a/importer/tag/src/main/java/org/itsallcode/openfasttrace/importer/tag/LongTagImportingLineConsumer.java b/importer/tag/src/main/java/org/itsallcode/openfasttrace/importer/tag/LongTagImportingLineConsumer.java index 17853ce2a..12ba0865c 100644 --- a/importer/tag/src/main/java/org/itsallcode/openfasttrace/importer/tag/LongTagImportingLineConsumer.java +++ b/importer/tag/src/main/java/org/itsallcode/openfasttrace/importer/tag/LongTagImportingLineConsumer.java @@ -13,7 +13,7 @@ // [impl->dsn~import.full-coverage-tag~1] // [impl->dsn~import.full-coverage-tag-with-needed-coverage~1] -class LongTagImportingLineConsumer extends RegexLineConsumer +class LongTagImportingLineConsumer extends AbstractRegexLineConsumer { private static final Logger LOG = Logger .getLogger(LongTagImportingLineConsumer.class.getName()); @@ -64,7 +64,7 @@ public void processMatch(final Matcher matcher, final int lineNumber, final int this.listener.endSpecificationItem(); } - private List parseCommaSeparatedList(final String input) + private static List parseCommaSeparatedList(final String input) { if (input == null) { @@ -104,7 +104,7 @@ private void logItem(final int lineNumber, final SpecificationItemId coveredId, } } - private int parseRevision(final String revision) + private static int parseRevision(final String revision) { return Optional.ofNullable(revision) .map(Integer::parseInt) @@ -125,12 +125,7 @@ private String getItemName(final int lineNumber, final int lineMatchCount, final private String generateUniqueName(final SpecificationItemId coveredId, final int lineNumber, final int counter) { - final String uniqueName = new StringBuilder() // - .append(this.file.getPath()) // - .append(lineNumber) // - .append(counter) // - .append(coveredId) // - .toString(); + final String uniqueName = this.file.getPath() + lineNumber + counter + coveredId; final String checksum = Long.toString(ChecksumCalculator.calculateCrc32(uniqueName)); return coveredId.getName() + "-" + checksum; } diff --git a/importer/tag/src/main/java/org/itsallcode/openfasttrace/importer/tag/ShortTagImportingLineConsumer.java b/importer/tag/src/main/java/org/itsallcode/openfasttrace/importer/tag/ShortTagImportingLineConsumer.java index 4747da0d7..428ab7dae 100644 --- a/importer/tag/src/main/java/org/itsallcode/openfasttrace/importer/tag/ShortTagImportingLineConsumer.java +++ b/importer/tag/src/main/java/org/itsallcode/openfasttrace/importer/tag/ShortTagImportingLineConsumer.java @@ -10,7 +10,7 @@ import org.itsallcode.openfasttrace.api.importer.tag.config.PathConfig; // [impl->dsn~import.short-coverage-tag~1] -class ShortTagImportingLineConsumer extends RegexLineConsumer +class ShortTagImportingLineConsumer extends AbstractRegexLineConsumer { private static final Logger LOG = Logger.getLogger(ShortTagImportingLineConsumer.class.getName()); @@ -71,7 +71,7 @@ private SpecificationItemId createCoveredItem(final String name, final String re nameWithPrefix, parsedRevision); } - private int parseRevision(final String name, final String revision) + private static int parseRevision(final String name, final String revision) { try { diff --git a/importer/xmlparser/src/main/java/org/itsallcode/openfasttrace/importer/xmlparser/event/Attribute.java b/importer/xmlparser/src/main/java/org/itsallcode/openfasttrace/importer/xmlparser/event/Attribute.java index 9bb442f8c..bf9e97f16 100644 --- a/importer/xmlparser/src/main/java/org/itsallcode/openfasttrace/importer/xmlparser/event/Attribute.java +++ b/importer/xmlparser/src/main/java/org/itsallcode/openfasttrace/importer/xmlparser/event/Attribute.java @@ -8,7 +8,7 @@ /** * A simplified wrapper for SAX {@link Attributes}. */ -public class Attribute +public final class Attribute { private final String qName; private final String value; diff --git a/importer/xmlparser/src/main/java/org/itsallcode/openfasttrace/importer/xmlparser/event/EndElementEvent.java b/importer/xmlparser/src/main/java/org/itsallcode/openfasttrace/importer/xmlparser/event/EndElementEvent.java index 7ff03d5b0..d8a5824f1 100644 --- a/importer/xmlparser/src/main/java/org/itsallcode/openfasttrace/importer/xmlparser/event/EndElementEvent.java +++ b/importer/xmlparser/src/main/java/org/itsallcode/openfasttrace/importer/xmlparser/event/EndElementEvent.java @@ -9,7 +9,7 @@ * * @see org.xml.sax.ContentHandler#endElement(String, String, String) */ -public class EndElementEvent +public final class EndElementEvent { private final QName qName; private final Location location; diff --git a/importer/xmlparser/src/main/java/org/itsallcode/openfasttrace/importer/xmlparser/event/QNameFactory.java b/importer/xmlparser/src/main/java/org/itsallcode/openfasttrace/importer/xmlparser/event/QNameFactory.java index bc3d98c77..dad1142fc 100644 --- a/importer/xmlparser/src/main/java/org/itsallcode/openfasttrace/importer/xmlparser/event/QNameFactory.java +++ b/importer/xmlparser/src/main/java/org/itsallcode/openfasttrace/importer/xmlparser/event/QNameFactory.java @@ -7,7 +7,7 @@ /** * Factory for creating {@link QName} objects. */ -class QNameFactory +final class QNameFactory { private QNameFactory() { diff --git a/importer/xmlparser/src/main/java/org/itsallcode/openfasttrace/importer/xmlparser/event/StartElementEvent.java b/importer/xmlparser/src/main/java/org/itsallcode/openfasttrace/importer/xmlparser/event/StartElementEvent.java index 872e0efbd..b8c7e88a3 100644 --- a/importer/xmlparser/src/main/java/org/itsallcode/openfasttrace/importer/xmlparser/event/StartElementEvent.java +++ b/importer/xmlparser/src/main/java/org/itsallcode/openfasttrace/importer/xmlparser/event/StartElementEvent.java @@ -12,7 +12,7 @@ * * @see org.xml.sax.ContentHandler#endElement(String, String, String) */ -public class StartElementEvent +public final class StartElementEvent { private final QName qName; private final Location location; diff --git a/importer/xmlparser/src/main/java/org/itsallcode/openfasttrace/importer/xmlparser/tree/CallbackContentHandler.java b/importer/xmlparser/src/main/java/org/itsallcode/openfasttrace/importer/xmlparser/tree/CallbackContentHandler.java index bc4aee81f..da64563da 100644 --- a/importer/xmlparser/src/main/java/org/itsallcode/openfasttrace/importer/xmlparser/tree/CallbackContentHandler.java +++ b/importer/xmlparser/src/main/java/org/itsallcode/openfasttrace/importer/xmlparser/tree/CallbackContentHandler.java @@ -138,14 +138,14 @@ public void startElement(final TreeElement treeElement) { consumer.accept(treeElement); } - catch (final Exception e) + catch (final Exception exception) { throw new XmlParserException("Error handling " + treeElement + " with consumer " - + consumer + ": " + e.getMessage(), e); + + consumer + ": " + exception.getMessage(), exception); } } - private boolean isCustomXMLNamespace(final String namespaceURI) + private static boolean isCustomXMLNamespace(final String namespaceURI) { return !"".equals(namespaceURI) && !OPENFASTTRACE_XML_NAMESPACE.equals(namespaceURI); } @@ -201,7 +201,7 @@ public CallbackContentHandler addIntDataListener(final String elementName, return this; } - private int parseInt(final String elementName, final String data) + private static int parseInt(final String elementName, final String data) { try { diff --git a/importer/zip/src/main/java/org/itsallcode/openfasttrace/importer/zip/ZipFileImporter.java b/importer/zip/src/main/java/org/itsallcode/openfasttrace/importer/zip/ZipFileImporter.java index 3b9a93710..730c8ab25 100644 --- a/importer/zip/src/main/java/org/itsallcode/openfasttrace/importer/zip/ZipFileImporter.java +++ b/importer/zip/src/main/java/org/itsallcode/openfasttrace/importer/zip/ZipFileImporter.java @@ -51,7 +51,7 @@ public void runImport() } } - private InputFile createInput(final ZipFile zip, final ZipEntry entry) + private static InputFile createInput(final ZipFile zip, final ZipEntry entry) { return ZipEntryInput.forZipEntry(zip, entry); } diff --git a/importer/zip/src/main/java/org/itsallcode/openfasttrace/importer/zip/input/ZipEntryInput.java b/importer/zip/src/main/java/org/itsallcode/openfasttrace/importer/zip/input/ZipEntryInput.java index 83359808f..c283283f0 100644 --- a/importer/zip/src/main/java/org/itsallcode/openfasttrace/importer/zip/input/ZipEntryInput.java +++ b/importer/zip/src/main/java/org/itsallcode/openfasttrace/importer/zip/input/ZipEntryInput.java @@ -12,7 +12,7 @@ /** * An {@link InputFile} for {@link ZipEntry} of a {@link ZipFile}. */ -public class ZipEntryInput implements InputFile +public final class ZipEntryInput implements InputFile { private final ZipFile zip; private final ZipEntry entry; diff --git a/reporter/aspec/src/main/java/org/itsallcode/openfasttrace/report/aspec/ASpecReport.java b/reporter/aspec/src/main/java/org/itsallcode/openfasttrace/report/aspec/ASpecReport.java index 47306d1e8..62325676a 100644 --- a/reporter/aspec/src/main/java/org/itsallcode/openfasttrace/report/aspec/ASpecReport.java +++ b/reporter/aspec/src/main/java/org/itsallcode/openfasttrace/report/aspec/ASpecReport.java @@ -103,7 +103,7 @@ private void writeSpecDocument(XMLStreamWriter writer) writer.writeEndElement(); } - private Map> groupItemsByAttributeType( + private static Map> groupItemsByAttributeType( final List items) { return items.stream().collect( @@ -166,7 +166,7 @@ private String unifyNewlines(final String text) return matcher.replaceAll(this.newline.toString()); } - private void writeTags(final XMLStreamWriter writer, final List tags) throws XMLStreamException + private static void writeTags(final XMLStreamWriter writer, final List tags) throws XMLStreamException { if (tags.isEmpty()) { @@ -180,7 +180,8 @@ private void writeTags(final XMLStreamWriter writer, final List tags) th writer.writeEndElement(); } - private void writeItemCoverage(XMLStreamWriter writer, LinkedSpecificationItem item) throws XMLStreamException + private static void writeItemCoverage(XMLStreamWriter writer, LinkedSpecificationItem item) + throws XMLStreamException { writer.writeStartElement("coverage"); writeNeedsArtifactTypes(writer, item.getNeedsArtifactTypes()); @@ -195,7 +196,7 @@ private void writeItemCoverage(XMLStreamWriter writer, LinkedSpecificationItem i writer.writeEndElement(); } - private void writeCoveringSpecObjects(XMLStreamWriter writer, LinkedSpecificationItem item) + private static void writeCoveringSpecObjects(XMLStreamWriter writer, LinkedSpecificationItem item) throws XMLStreamException { writer.writeStartElement("coveringSpecObjects"); @@ -211,7 +212,7 @@ private void writeCoveringSpecObjects(XMLStreamWriter writer, LinkedSpecificatio writer.writeEndElement(); } - private void writeCoveringSpecObject(final XMLStreamWriter writer, final LinkStatus linkStatus, + private static void writeCoveringSpecObject(final XMLStreamWriter writer, final LinkStatus linkStatus, final LinkedSpecificationItem item) throws XMLStreamException { writer.writeStartElement("coveringSpecObject"); @@ -231,7 +232,7 @@ private void writeCoveringSpecObject(final XMLStreamWriter writer, final LinkSta writer.writeEndElement(); } - private void writeCoveringStatus(XMLStreamWriter writer, LinkStatus linkStatus, + private static void writeCoveringStatus(XMLStreamWriter writer, LinkStatus linkStatus, DeepCoverageStatus deepCoverageStatus) throws XMLStreamException { @@ -251,9 +252,13 @@ else if (linkStatus == LinkStatus.AMBIGUOUS || linkStatus == LinkStatus.COVERED_ { writeElement(writer, ELEMENT_COVERING_STATUS, CoveringStatus.UNEXPECTED.getLabel()); } + else + { + throw new IllegalStateException("Unknown link status found trying to write ASpec report: " + linkStatus); + } } - private void writeDependsOnIds(final XMLStreamWriter writer, final List dependOnIds) + private static void writeDependsOnIds(final XMLStreamWriter writer, final List dependOnIds) throws XMLStreamException { if (dependOnIds.isEmpty()) @@ -272,7 +277,7 @@ private void writeDependsOnIds(final XMLStreamWriter writer, final List coveredIds) + private static void writeCoveredIds(final XMLStreamWriter writer, final List coveredIds) throws XMLStreamException { if (coveredIds.isEmpty()) @@ -291,7 +296,7 @@ private void writeCoveredIds(final XMLStreamWriter writer, final List needsArtifactTypes) + private static void writeNeedsArtifactTypes(final XMLStreamWriter writer, final List needsArtifactTypes) throws XMLStreamException { if (needsArtifactTypes.isEmpty()) @@ -306,7 +311,8 @@ private void writeNeedsArtifactTypes(final XMLStreamWriter writer, final List types) throws XMLStreamException + private static void writeCoveredTypes(final XMLStreamWriter writer, final Set types) + throws XMLStreamException { if (types.isEmpty()) { @@ -320,7 +326,8 @@ private void writeCoveredTypes(final XMLStreamWriter writer, final Set t writer.writeEndElement(); } - private void writeUncoveredTypes(final XMLStreamWriter writer, final List types) throws XMLStreamException + private static void writeUncoveredTypes(final XMLStreamWriter writer, final List types) + throws XMLStreamException { if (types.isEmpty()) { @@ -334,13 +341,14 @@ private void writeUncoveredTypes(final XMLStreamWriter writer, final List getSortedItems() .toList(); } - private void addSectionedItems(final ViewFactory factory, final ViewableContainer view, + private static void addSectionedItems(final ViewFactory factory, final ViewableContainer view, final List items) { String artifactType = "\0"; diff --git a/reporter/html/src/main/java/org/itsallcode/openfasttrace/report/html/view/AbstractViewContainer.java b/reporter/html/src/main/java/org/itsallcode/openfasttrace/report/html/view/AbstractViewContainer.java index fed194bb8..1c92104f2 100644 --- a/reporter/html/src/main/java/org/itsallcode/openfasttrace/report/html/view/AbstractViewContainer.java +++ b/reporter/html/src/main/java/org/itsallcode/openfasttrace/report/html/view/AbstractViewContainer.java @@ -1,6 +1,7 @@ package org.itsallcode.openfasttrace.report.html.view; import java.util.ArrayList; +import java.util.Collections; import java.util.List; /** @@ -62,7 +63,7 @@ public void render(final int level) } /** - * Render a the part of the view that comes before the children. + * Render the part of the view that comes before the children. * * @param level * indentation level @@ -70,7 +71,7 @@ public void render(final int level) protected abstract void renderBeforeChildren(final int level); /** - * Render a the children of this sub(view). + * Render the children of this sub(view). * * @param level * indentation level @@ -106,6 +107,6 @@ public void add(final Viewable child) @Override public List getChildren() { - return this.children; + return Collections.unmodifiableList(this.children); } } diff --git a/reporter/html/src/main/java/org/itsallcode/openfasttrace/report/html/view/ViewableContainer.java b/reporter/html/src/main/java/org/itsallcode/openfasttrace/report/html/view/ViewableContainer.java index 4fac784b6..af709c650 100644 --- a/reporter/html/src/main/java/org/itsallcode/openfasttrace/report/html/view/ViewableContainer.java +++ b/reporter/html/src/main/java/org/itsallcode/openfasttrace/report/html/view/ViewableContainer.java @@ -42,4 +42,4 @@ public interface ViewableContainer extends Viewable * @return list of children */ List getChildren(); -} \ No newline at end of file +} diff --git a/reporter/html/src/main/java/org/itsallcode/openfasttrace/report/html/view/html/CharacterConstants.java b/reporter/html/src/main/java/org/itsallcode/openfasttrace/report/html/view/html/CharacterConstants.java index c5606c232..50ddef002 100644 --- a/reporter/html/src/main/java/org/itsallcode/openfasttrace/report/html/view/html/CharacterConstants.java +++ b/reporter/html/src/main/java/org/itsallcode/openfasttrace/report/html/view/html/CharacterConstants.java @@ -1,12 +1,12 @@ package org.itsallcode.openfasttrace.report.html.view.html; -class CharacterConstants +final class CharacterConstants { + public static final String CHECK_MARK = ""; + public static final String CROSS_MARK = ""; + private CharacterConstants() { // prevent instantiation } - - public static final String CHECK_MARK = ""; - public static final String CROSS_MARK = ""; -} \ No newline at end of file +} diff --git a/reporter/html/src/main/java/org/itsallcode/openfasttrace/report/html/view/html/HtmlReportDetails.java b/reporter/html/src/main/java/org/itsallcode/openfasttrace/report/html/view/html/HtmlReportDetails.java index 2a858cb5d..b0ced2d41 100644 --- a/reporter/html/src/main/java/org/itsallcode/openfasttrace/report/html/view/html/HtmlReportDetails.java +++ b/reporter/html/src/main/java/org/itsallcode/openfasttrace/report/html/view/html/HtmlReportDetails.java @@ -24,4 +24,4 @@ protected void renderAfterChildren(final int level) renderIndentation(level); this.stream.println(""); } -} \ No newline at end of file +} diff --git a/reporter/html/src/main/java/org/itsallcode/openfasttrace/report/html/view/html/HtmlSpecificationItem.java b/reporter/html/src/main/java/org/itsallcode/openfasttrace/report/html/view/html/HtmlSpecificationItem.java index 52cb4f85d..865508ae5 100644 --- a/reporter/html/src/main/java/org/itsallcode/openfasttrace/report/html/view/html/HtmlSpecificationItem.java +++ b/reporter/html/src/main/java/org/itsallcode/openfasttrace/report/html/view/html/HtmlSpecificationItem.java @@ -6,6 +6,7 @@ import java.io.PrintStream; import java.util.Comparator; import java.util.List; +import java.util.regex.Pattern; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -16,6 +17,7 @@ class HtmlSpecificationItem implements Viewable { + public static final Pattern INSERT_DELETE_PATTERN = Pattern.compile("<(?:ins|del)>"); private final LinkedSpecificationItem item; private final PrintStream stream; private final MarkdownConverter converter = new MarkdownConverter(); @@ -131,12 +133,9 @@ private void renderComment(final String indentation) private void renderNeeds(final String indentation) { - if ((this.item.getNeedsArtifactTypes() != null - && !this.item.getNeedsArtifactTypes().isEmpty()) - || (this.item.getUncoveredArtifactTypes() != null - && !this.item.getUncoveredArtifactTypes().isEmpty()) - || (this.item.getOverCoveredArtifactTypes() != null - && !this.item.getOverCoveredArtifactTypes().isEmpty())) + if (atLeastOneNeededArtifactTypeCovered() + || hasUncoveredArtifactTypes() + || hasOvercoveredArtifactTypes()) { this.stream.print(indentation); this.stream.print("
Needs: "); @@ -145,20 +144,34 @@ private void renderNeeds(final String indentation) } } - private String translateArtifactTypeCoverage(final LinkedSpecificationItem item) + private boolean atLeastOneNeededArtifactTypeCovered() { + return this.item.getNeedsArtifactTypes() != null + && !this.item.getNeedsArtifactTypes().isEmpty(); + } + + private boolean hasUncoveredArtifactTypes() { + return this.item.getUncoveredArtifactTypes() != null + && !this.item.getUncoveredArtifactTypes().isEmpty(); + } + + private boolean hasOvercoveredArtifactTypes() { + return this.item.getOverCoveredArtifactTypes() != null + && !this.item.getOverCoveredArtifactTypes().isEmpty(); + } + + private static String translateArtifactTypeCoverage(final LinkedSpecificationItem item) { - final Comparator byTypeName = Comparator.comparing(a -> a.replaceFirst("<(?:ins|del)>", "")); + final Comparator byTypeName = Comparator + .comparing(a -> INSERT_DELETE_PATTERN.matcher(a).replaceFirst("")); final Stream uncoveredStream = item.getUncoveredArtifactTypes().stream() .map(x -> "" + x + ""); - return Stream.concat( // - Stream.concat( // - uncoveredStream, // - item.getCoveredArtifactTypes().stream() // - ), // - item.getOverCoveredArtifactTypes().stream().map(x -> "" + x + "") // - ) // - .sorted(byTypeName) // + return Stream.concat( + Stream.concat( + uncoveredStream, + item.getCoveredArtifactTypes().stream()), + item.getOverCoveredArtifactTypes().stream().map(x -> "" + x + "")) + .sorted(byTypeName) .collect(Collectors.joining(", ")); } diff --git a/reporter/html/src/main/java/org/itsallcode/openfasttrace/report/html/view/html/HtmlTableOfContents.java b/reporter/html/src/main/java/org/itsallcode/openfasttrace/report/html/view/html/HtmlTableOfContents.java index 5560f7725..a2e4fe236 100644 --- a/reporter/html/src/main/java/org/itsallcode/openfasttrace/report/html/view/html/HtmlTableOfContents.java +++ b/reporter/html/src/main/java/org/itsallcode/openfasttrace/report/html/view/html/HtmlTableOfContents.java @@ -59,4 +59,4 @@ protected void renderLinkWithText(final ViewableContainer container) this.stream.print(container.getTitle()); this.stream.print(""); } -} \ No newline at end of file +} diff --git a/reporter/html/src/main/java/org/itsallcode/openfasttrace/report/html/view/html/HtmlTraceSummary.java b/reporter/html/src/main/java/org/itsallcode/openfasttrace/report/html/view/html/HtmlTraceSummary.java index 23a95eae8..7bb289955 100644 --- a/reporter/html/src/main/java/org/itsallcode/openfasttrace/report/html/view/html/HtmlTraceSummary.java +++ b/reporter/html/src/main/java/org/itsallcode/openfasttrace/report/html/view/html/HtmlTraceSummary.java @@ -86,4 +86,4 @@ protected void renderEnd() { // intentionally left empty } -} \ No newline at end of file +} diff --git a/reporter/html/src/main/java/org/itsallcode/openfasttrace/report/html/view/html/HtmlViewFactory.java b/reporter/html/src/main/java/org/itsallcode/openfasttrace/report/html/view/html/HtmlViewFactory.java index 7b6cf606a..232e03076 100644 --- a/reporter/html/src/main/java/org/itsallcode/openfasttrace/report/html/view/html/HtmlViewFactory.java +++ b/reporter/html/src/main/java/org/itsallcode/openfasttrace/report/html/view/html/HtmlViewFactory.java @@ -15,7 +15,7 @@ * Factory that creates an HTML OFT view (e.g. for reports) and provides an * output stream. */ -public class HtmlViewFactory extends AbstractViewFactory +public final class HtmlViewFactory extends AbstractViewFactory { private static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8; private final URL cssUrl; diff --git a/reporter/html/src/main/java/org/itsallcode/openfasttrace/report/html/view/html/MarkdownConverter.java b/reporter/html/src/main/java/org/itsallcode/openfasttrace/report/html/view/html/MarkdownConverter.java index fdc9242ca..ebf645710 100644 --- a/reporter/html/src/main/java/org/itsallcode/openfasttrace/report/html/view/html/MarkdownConverter.java +++ b/reporter/html/src/main/java/org/itsallcode/openfasttrace/report/html/view/html/MarkdownConverter.java @@ -8,4 +8,4 @@ String convert(final String input) { return this.machine.run(input); } -} \ No newline at end of file +} diff --git a/reporter/html/src/main/java/org/itsallcode/openfasttrace/report/html/view/html/MarkdownLineState.java b/reporter/html/src/main/java/org/itsallcode/openfasttrace/report/html/view/html/MarkdownLineState.java index 10c61cd4b..457eb8355 100644 --- a/reporter/html/src/main/java/org/itsallcode/openfasttrace/report/html/view/html/MarkdownLineState.java +++ b/reporter/html/src/main/java/org/itsallcode/openfasttrace/report/html/view/html/MarkdownLineState.java @@ -1,8 +1,8 @@ package org.itsallcode.openfasttrace.report.html.view.html; /** - * The MarkdownLineState represents the Markdown states that can be - * switched by newlines and the way the next line starts. + * The MarkdownLineState represents the Markdown states that newlines can + * switch and the way the next line starts. */ enum MarkdownLineState { @@ -14,4 +14,4 @@ enum MarkdownLineState ORDERED_LIST_CONTINUED, // PREFORMATTED, // TERMINATOR -} \ No newline at end of file +} diff --git a/reporter/html/src/main/java/org/itsallcode/openfasttrace/report/html/view/html/MarkdownLineStateMachine.java b/reporter/html/src/main/java/org/itsallcode/openfasttrace/report/html/view/html/MarkdownLineStateMachine.java index 8ec0ecde2..626920730 100644 --- a/reporter/html/src/main/java/org/itsallcode/openfasttrace/report/html/view/html/MarkdownLineStateMachine.java +++ b/reporter/html/src/main/java/org/itsallcode/openfasttrace/report/html/view/html/MarkdownLineStateMachine.java @@ -5,9 +5,10 @@ import java.util.ArrayList; import java.util.List; import java.util.function.UnaryOperator; +import java.util.regex.Pattern; /** - * A state machine for converting markdown to HTML. + * A state machine for converting Markdown to HTML. */ public final class MarkdownLineStateMachine { @@ -18,6 +19,8 @@ public final class MarkdownLineStateMachine private static final String P_PRE = "^ .*"; private static final String P_LIST_CONT = ".+"; private static final String P_TERM = "^$"; + private static final Pattern ANY_NEWLINE = Pattern.compile("\n\r?|\r"); + private static final Pattern BULLET_POINT_PREFIX = Pattern.compile("^ {0,3}[-+*]"); private final List transitions = new ArrayList<>(); MarkdownLineStateMachine() @@ -25,7 +28,7 @@ public final class MarkdownLineStateMachine initializeTransitions(); } - // Duplicate strings help making this easier to understand. + // Duplicate strings help make this easier to understand. @SuppressWarnings("squid:S1192") private void initializeTransitions() { @@ -76,7 +79,7 @@ String run(final String input) { final StringBuilder builder = new StringBuilder(); MarkdownLineState state = START; - for (final String line : input.split("(?:\n\r?|\r)", INCLUDE_EMPTY_STRINGS)) + for (final String line : ANY_NEWLINE.split(input, INCLUDE_EMPTY_STRINGS)) { for (final MarkdownLineTransition transition : this.transitions) { @@ -96,7 +99,7 @@ String run(final String input) return builder.toString(); } - private void closeLastLineState(final StringBuilder builder, final MarkdownLineState state) + private static void closeLastLineState(final StringBuilder builder, final MarkdownLineState state) { switch (state) { @@ -120,23 +123,23 @@ private void closeLastLineState(final StringBuilder builder, final MarkdownLineS } } - private UnaryOperator empty() + private static UnaryOperator empty() { return s -> ""; } - private UnaryOperator trimEnum() + private static UnaryOperator trimEnum() { return s -> s.substring(s.indexOf('.') + 1).trim(); } - private UnaryOperator trimPre() + private static UnaryOperator trimPre() { return s -> s.substring(4); } - private UnaryOperator trimBullet() + private static UnaryOperator trimBullet() { - return s -> s.replaceFirst("^ {0,3}[-+*]", "").trim(); + return s -> BULLET_POINT_PREFIX.matcher(s).replaceFirst("").trim(); } } diff --git a/reporter/html/src/main/java/org/itsallcode/openfasttrace/report/html/view/html/MarkdownSpanConverter.java b/reporter/html/src/main/java/org/itsallcode/openfasttrace/report/html/view/html/MarkdownSpanConverter.java index 10975bf83..6836cc7ba 100644 --- a/reporter/html/src/main/java/org/itsallcode/openfasttrace/report/html/view/html/MarkdownSpanConverter.java +++ b/reporter/html/src/main/java/org/itsallcode/openfasttrace/report/html/view/html/MarkdownSpanConverter.java @@ -40,7 +40,7 @@ static String escapeHtml(String text) return text; } - private static class RegexReplacement + private static final class RegexReplacement { private final Pattern pattern; private final String replacement; diff --git a/reporter/html/src/main/java/org/itsallcode/openfasttrace/report/html/view/html/OriginLinkFormatter.java b/reporter/html/src/main/java/org/itsallcode/openfasttrace/report/html/view/html/OriginLinkFormatter.java index 818ad0345..f6a1ef1ff 100644 --- a/reporter/html/src/main/java/org/itsallcode/openfasttrace/report/html/view/html/OriginLinkFormatter.java +++ b/reporter/html/src/main/java/org/itsallcode/openfasttrace/report/html/view/html/OriginLinkFormatter.java @@ -90,13 +90,14 @@ private static boolean checkPathHasProtocol(final String path) return PROTOCOL_PREFIX_PATTERN.matcher(path).matches(); } + @SuppressWarnings("java:S1166") // No need to log the IllegalArgumentException. private static URI convertPathWithProtocolToUri(final String path) { try { return URI.create(path); } - catch (final IllegalArgumentException e) + catch (final IllegalArgumentException exception) { return null; } diff --git a/reporter/plaintext/src/main/java/org/itsallcode/openfasttrace/report/plaintext/AnsiSequence.java b/reporter/plaintext/src/main/java/org/itsallcode/openfasttrace/report/plaintext/AnsiSequence.java index 682a613e4..ed6678acf 100644 --- a/reporter/plaintext/src/main/java/org/itsallcode/openfasttrace/report/plaintext/AnsiSequence.java +++ b/reporter/plaintext/src/main/java/org/itsallcode/openfasttrace/report/plaintext/AnsiSequence.java @@ -39,7 +39,7 @@ enum AnsiSequence { public static final String SUFFIX = "m"; private final int id; - private AnsiSequence(final int id) { + AnsiSequence(final int id) { this.id = id; } diff --git a/reporter/plaintext/src/main/java/org/itsallcode/openfasttrace/report/plaintext/ConsoleColorFormatter.java b/reporter/plaintext/src/main/java/org/itsallcode/openfasttrace/report/plaintext/ConsoleColorFormatter.java index f3b8ca41b..2e8106c1c 100644 --- a/reporter/plaintext/src/main/java/org/itsallcode/openfasttrace/report/plaintext/ConsoleColorFormatter.java +++ b/reporter/plaintext/src/main/java/org/itsallcode/openfasttrace/report/plaintext/ConsoleColorFormatter.java @@ -28,4 +28,4 @@ public String formatNotOk(final String text) { public String formatStrong(final String text) { return AnsiSequence.combine(BOLD, CYAN) + text + RESET; } -} \ No newline at end of file +} diff --git a/reporter/plaintext/src/main/java/org/itsallcode/openfasttrace/report/plaintext/NullTextFormatter.java b/reporter/plaintext/src/main/java/org/itsallcode/openfasttrace/report/plaintext/NullTextFormatter.java index c841c1f0f..424dbe006 100644 --- a/reporter/plaintext/src/main/java/org/itsallcode/openfasttrace/report/plaintext/NullTextFormatter.java +++ b/reporter/plaintext/src/main/java/org/itsallcode/openfasttrace/report/plaintext/NullTextFormatter.java @@ -28,4 +28,4 @@ public String formatNotOk(final String text) { public String formatStrong(final String text) { return text; } -} \ No newline at end of file +} diff --git a/reporter/plaintext/src/main/java/org/itsallcode/openfasttrace/report/plaintext/PlainTextReport.java b/reporter/plaintext/src/main/java/org/itsallcode/openfasttrace/report/plaintext/PlainTextReport.java index 16250bc5d..8435b80af 100644 --- a/reporter/plaintext/src/main/java/org/itsallcode/openfasttrace/report/plaintext/PlainTextReport.java +++ b/reporter/plaintext/src/main/java/org/itsallcode/openfasttrace/report/plaintext/PlainTextReport.java @@ -7,6 +7,8 @@ import java.util.Collections; import java.util.Comparator; import java.util.List; +import java.util.Locale; +import java.util.regex.Pattern; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -20,10 +22,11 @@ */ public class PlainTextReport implements Reportable { - private final Trace trace; + private static final Pattern PLUS_MINUS_PATTERN = Pattern.compile("[-+]"); private static final Comparator LINKED_ITEM_BY_ID = Comparator .comparing(LinkedSpecificationItem::getId); - private int nonEmptySections = 0; + private final Trace trace; + private int nonEmptySections; private final ReportSettings settings; private final TextFormatter formatter; @@ -156,7 +159,7 @@ private void renderItemSummary(final PrintStream report, final LinkedSpecificati private String translateArtifactTypeCoverage(final LinkedSpecificationItem item) { - final Comparator byTypeName = Comparator.comparing(a -> a.replaceFirst("[-+]", "")); + final Comparator byTypeName = Comparator.comparing(a -> PLUS_MINUS_PATTERN.matcher(a).replaceFirst("")); final Stream uncoveredStream = item.getUncoveredArtifactTypes().stream() .map(x -> this.formatter.formatNotOk("-" + x)); @@ -205,7 +208,7 @@ private String formatCountXofY(final int countGood, final int count) { } } - private void renderMaturity(final PrintStream report, final LinkedSpecificationItem item) + private static void renderMaturity(final PrintStream report, final LinkedSpecificationItem item) { final ItemStatus status = item.getStatus(); if (status != ItemStatus.APPROVED) @@ -244,7 +247,7 @@ private void renderItemDetails(final PrintStream report, final LinkedSpecificati renderItemDetailsEnd(report); } - private void renderOrigin(final PrintStream report, final Location location) + private static void renderOrigin(final PrintStream report, final Location location) { report.print("("); report.print(location.getPath()); @@ -322,7 +325,7 @@ private void renderLink(final PrintStream report, final TracedLink link, } private static String padStatus(final LinkStatus status) { - return String.format("%-17s", status.toString().toLowerCase()); + return String.format("%-17s", status.toString().toLowerCase(Locale.ENGLISH)); } private void renderTags(final PrintStream report, final LinkedSpecificationItem item) @@ -360,4 +363,4 @@ private void renderItemDetailsEnd(final PrintStream report) renderEmptyItemDetailsLine(report); } } -} \ No newline at end of file +} diff --git a/reporter/plaintext/src/main/java/org/itsallcode/openfasttrace/report/plaintext/TextFormatter.java b/reporter/plaintext/src/main/java/org/itsallcode/openfasttrace/report/plaintext/TextFormatter.java index e717b5239..257de0695 100644 --- a/reporter/plaintext/src/main/java/org/itsallcode/openfasttrace/report/plaintext/TextFormatter.java +++ b/reporter/plaintext/src/main/java/org/itsallcode/openfasttrace/report/plaintext/TextFormatter.java @@ -9,7 +9,7 @@ interface TextFormatter { * @param text text span to be formatted * @return formatted text */ - public String formatOk(final String text); + String formatOk(final String text); /** * Format a text span that represents a bad result. @@ -17,7 +17,7 @@ interface TextFormatter { * @param text text span to be formatted * @return formatted text */ - public String formatNotOk(final String text); + String formatNotOk(final String text); /** * Format a text span that represents a strongly emphasized text. @@ -25,5 +25,5 @@ interface TextFormatter { * @param text text span to be formatted * @return formatted text */ - public String formatStrong(final String text); -} \ No newline at end of file + String formatStrong(final String text); +} diff --git a/reporter/plaintext/src/main/java/org/itsallcode/openfasttrace/report/plaintext/TextFormatterFactory.java b/reporter/plaintext/src/main/java/org/itsallcode/openfasttrace/report/plaintext/TextFormatterFactory.java index 8e93d8815..0a0fee69d 100644 --- a/reporter/plaintext/src/main/java/org/itsallcode/openfasttrace/report/plaintext/TextFormatterFactory.java +++ b/reporter/plaintext/src/main/java/org/itsallcode/openfasttrace/report/plaintext/TextFormatterFactory.java @@ -16,20 +16,12 @@ private TextFormatterFactory() { * @return text formatter */ public static TextFormatter createFormatter(ColorScheme colorScheme) { - if(colorScheme == null) - { - return new NullTextFormatter(); - } - switch (colorScheme) { - case BLACK_AND_WHITE: - return new NullTextFormatter(); - case MONOCHROME: - return new MonochromeTextFormatter(); - case COLOR: - return new ConsoleColorFormatter(); - default: - throw new IllegalArgumentException("Unable to create text formatter for unknown color scheme '" - + colorScheme + "'."); - } + return (colorScheme == null) + ? new NullTextFormatter() + : (switch (colorScheme) { + case BLACK_AND_WHITE -> new NullTextFormatter(); + case MONOCHROME -> new MonochromeTextFormatter(); + case COLOR -> new ConsoleColorFormatter(); + }); } } diff --git a/testutil/src/main/java/org/itsallcode/openfasttrace/testutil/CompareAssertions.java b/testutil/src/main/java/org/itsallcode/openfasttrace/testutil/CompareAssertions.java index f712b1feb..c070703d7 100644 --- a/testutil/src/main/java/org/itsallcode/openfasttrace/testutil/CompareAssertions.java +++ b/testutil/src/main/java/org/itsallcode/openfasttrace/testutil/CompareAssertions.java @@ -10,7 +10,7 @@ * Provides static assertion methods that verify implementations of * {@link Comparator} and {@link Comparable} are consistent with the contract. */ -public class CompareAssertions +public final class CompareAssertions { private CompareAssertions() { @@ -73,6 +73,7 @@ public static void testComparator(Comparator comparator, T o, T s assertNullValue(comparator, o, nullValueSupported); } + @SuppressWarnings({"java:S1696", "java:S1166"}) // NullPointerExceptions are expected. private static void assertNullValue(Comparator comparator, T o, boolean nullValueSupported) { @@ -81,7 +82,7 @@ private static void assertNullValue(Comparator comparator, T o, comparator.compare(o, null); assertTrue(nullValueSupported, "No NullPointerException but null value not supported!"); } - catch (final NullPointerException ex) + catch (final NullPointerException exception) { assertFalse(nullValueSupported, "NullPointerException thrown but null value supported!!"); diff --git a/testutil/src/main/java/org/itsallcode/openfasttrace/testutil/OsCheck.java b/testutil/src/main/java/org/itsallcode/openfasttrace/testutil/OsCheck.java index b8f412711..e2712dd31 100644 --- a/testutil/src/main/java/org/itsallcode/openfasttrace/testutil/OsCheck.java +++ b/testutil/src/main/java/org/itsallcode/openfasttrace/testutil/OsCheck.java @@ -69,6 +69,8 @@ else if (os.contains("linux")) { return OSType.LINUX; } - return OSType.OTHER; + else { + return OSType.OTHER; + } } } diff --git a/testutil/src/main/java/org/itsallcode/openfasttrace/testutil/OsDetector.java b/testutil/src/main/java/org/itsallcode/openfasttrace/testutil/OsDetector.java index e816d56f0..85686366c 100644 --- a/testutil/src/main/java/org/itsallcode/openfasttrace/testutil/OsDetector.java +++ b/testutil/src/main/java/org/itsallcode/openfasttrace/testutil/OsDetector.java @@ -9,7 +9,7 @@ * Helper class to detect the operating system. Contains assumption methods for * JUnit. */ -public class OsDetector +public final class OsDetector { private static final OsCheck OS_CHECK = new OsCheck(); diff --git a/testutil/src/main/java/org/itsallcode/openfasttrace/testutil/core/ItemBuilderFactory.java b/testutil/src/main/java/org/itsallcode/openfasttrace/testutil/core/ItemBuilderFactory.java index f7055e84c..800638910 100644 --- a/testutil/src/main/java/org/itsallcode/openfasttrace/testutil/core/ItemBuilderFactory.java +++ b/testutil/src/main/java/org/itsallcode/openfasttrace/testutil/core/ItemBuilderFactory.java @@ -6,7 +6,7 @@ /** * The {@link ItemBuilderFactory} class provides convenience methods for creating instances of {@link SpecificationItem}. */ -public class ItemBuilderFactory { +public final class ItemBuilderFactory { private ItemBuilderFactory() { // prevent instantiation. } @@ -16,7 +16,7 @@ private ItemBuilderFactory() { * * @return a new instance of {@link SpecificationItem.Builder} */ - public static final SpecificationItem.Builder item() { + public static SpecificationItem.Builder item() { return SpecificationItem.builder(); } @@ -27,7 +27,7 @@ public static final SpecificationItem.Builder item() { * * @return a new instance of {@link SpecificationItem.Builder} with the specified ID */ - public static final SpecificationItem.Builder itemWithId(SpecificationItemId id) { + public static SpecificationItem.Builder itemWithId(SpecificationItemId id) { return SpecificationItem.builder().id(id); } @@ -38,7 +38,7 @@ public static final SpecificationItem.Builder itemWithId(SpecificationItemId id) * * @return a new instance of {@link SpecificationItem.Builder} with the default filename and the specified line */ - public static final SpecificationItem.Builder itemWithDefaultFilenameInLine(final int line) { + public static SpecificationItem.Builder itemWithDefaultFilenameInLine(final int line) { return SpecificationItem.builder().location("file", line); } } diff --git a/testutil/src/main/java/org/itsallcode/openfasttrace/testutil/core/SampleArtifactTypes.java b/testutil/src/main/java/org/itsallcode/openfasttrace/testutil/core/SampleArtifactTypes.java index 789eeb22e..6cc937adc 100644 --- a/testutil/src/main/java/org/itsallcode/openfasttrace/testutil/core/SampleArtifactTypes.java +++ b/testutil/src/main/java/org/itsallcode/openfasttrace/testutil/core/SampleArtifactTypes.java @@ -3,13 +3,8 @@ /** * Constants for sample artifact types used in tests. */ -public class SampleArtifactTypes +public final class SampleArtifactTypes { - private SampleArtifactTypes() - { - // Not instantiable - } - /** Architecture artifact type. */ public static final String ARCH = "arch"; /** Design artifact type. */ @@ -26,4 +21,9 @@ private SampleArtifactTypes() public static final String UTEST = "utest"; /** User manual artifact type. */ public static final String UMAN = "uman"; + + private SampleArtifactTypes() + { + // Not instantiable + } } diff --git a/testutil/src/main/java/org/itsallcode/openfasttrace/testutil/importer/input/StreamInput.java b/testutil/src/main/java/org/itsallcode/openfasttrace/testutil/importer/input/StreamInput.java index 963e6e2a3..c89d28171 100644 --- a/testutil/src/main/java/org/itsallcode/openfasttrace/testutil/importer/input/StreamInput.java +++ b/testutil/src/main/java/org/itsallcode/openfasttrace/testutil/importer/input/StreamInput.java @@ -10,7 +10,7 @@ * An implementation of {@link InputFile} that reads from a * {@link BufferedReader}. This is useful for tests to avoid using real files. */ -public class StreamInput implements InputFile +public final class StreamInput implements InputFile { private final Path path; private final BufferedReader reader; diff --git a/testutil/src/main/java/org/itsallcode/openfasttrace/testutil/importer/lightweightmarkup/AbstractLightWeightMarkupImporterTest.java b/testutil/src/main/java/org/itsallcode/openfasttrace/testutil/importer/lightweightmarkup/AbstractLightWeightMarkupImporterTest.java index f5faf8aee..2a3ef50c5 100644 --- a/testutil/src/main/java/org/itsallcode/openfasttrace/testutil/importer/lightweightmarkup/AbstractLightWeightMarkupImporterTest.java +++ b/testutil/src/main/java/org/itsallcode/openfasttrace/testutil/importer/lightweightmarkup/AbstractLightWeightMarkupImporterTest.java @@ -79,6 +79,7 @@ void testRequirementIdDetected(final String markdownId, final String expectedArt * @param matcher * matcher to verify the imported specification items */ + @SuppressWarnings("java:S4968") // Match type definition comes from Hamcrest. Cannot change. protected void assertImport(final String path, final String input, final Matcher> matcher) { @@ -95,6 +96,7 @@ protected void assertImport(final String path, final String input, * @param matcher * matcher to verify the imported specification items */ + @SuppressWarnings("java:S4968") // Match type definition comes from Hamcrest. Cannot change. protected void assertImport(final Path path, final String input, final Matcher> matcher) { diff --git a/testutil/src/main/java/org/itsallcode/openfasttrace/testutil/matcher/MatcherTestBase.java b/testutil/src/main/java/org/itsallcode/openfasttrace/testutil/matcher/AbstractMatcherTest.java similarity index 96% rename from testutil/src/main/java/org/itsallcode/openfasttrace/testutil/matcher/MatcherTestBase.java rename to testutil/src/main/java/org/itsallcode/openfasttrace/testutil/matcher/AbstractMatcherTest.java index 907a96a80..f02e8933f 100644 --- a/testutil/src/main/java/org/itsallcode/openfasttrace/testutil/matcher/MatcherTestBase.java +++ b/testutil/src/main/java/org/itsallcode/openfasttrace/testutil/matcher/AbstractMatcherTest.java @@ -15,12 +15,12 @@ * type compared by the {@link TypeSafeDiagnosingMatcher} under * test. */ -public abstract class MatcherTestBase +public abstract class AbstractMatcherTest { /** * Creates a new instance of the test base. */ - protected MatcherTestBase() + protected AbstractMatcherTest() { // Default constructor to fix compiler warning "missing-explicit-ctor" } diff --git a/testutil/src/main/java/org/itsallcode/openfasttrace/testutil/matcher/MultilineTextMatcher.java b/testutil/src/main/java/org/itsallcode/openfasttrace/testutil/matcher/MultilineTextMatcher.java index 1ad593503..baeb7cc4d 100644 --- a/testutil/src/main/java/org/itsallcode/openfasttrace/testutil/matcher/MultilineTextMatcher.java +++ b/testutil/src/main/java/org/itsallcode/openfasttrace/testutil/matcher/MultilineTextMatcher.java @@ -73,7 +73,7 @@ else if (line.equals(originalLines.get(i))) } } - private String describeLineCount(final int lineCount) + private static String describeLineCount(final int lineCount) { return "(" + lineCount + " lines)" + System.lineSeparator(); } @@ -105,7 +105,7 @@ public static MultilineTextMatcher matchesAllLines(final String... lines) return new MultilineTextMatcher(String.join(System.lineSeparator(), lines)); } - private List splitPreservingNewLines(final String text) + private static List splitPreservingNewLines(final String text) { final String lineSplittingRegEx = "(?<=" + LINE_ENDING + ")"; diff --git a/testutil/src/main/java/org/itsallcode/openfasttrace/testutil/xml/IndentingXMLStreamWriter.java b/testutil/src/main/java/org/itsallcode/openfasttrace/testutil/xml/IndentingXMLStreamWriter.java index f3594a8e6..4142075f2 100644 --- a/testutil/src/main/java/org/itsallcode/openfasttrace/testutil/xml/IndentingXMLStreamWriter.java +++ b/testutil/src/main/java/org/itsallcode/openfasttrace/testutil/xml/IndentingXMLStreamWriter.java @@ -13,11 +13,11 @@ public class IndentingXMLStreamWriter extends StreamWriterDelegate private final String indent; private final String newLine; /** How deeply nested the current scope is. The root element is depth 1. */ - private int depth = 0; // document scope + private int depth; // document scope /** stack[depth] indicates what's been written into the current scope. */ private int[] stack = new int[] { 0, 0, 0, 0 }; // nothing written yet /** Prefix that defines how deeply a line is indented. */ - private char[] linePrefix = null; + private char[] linePrefix; /** * Create a new instance of the {@link IndentingXMLStreamWriter}. diff --git a/testutil/src/main/java/org/itsallcode/openfasttrace/testutil/xml/StreamWriterDelegate.java b/testutil/src/main/java/org/itsallcode/openfasttrace/testutil/xml/StreamWriterDelegate.java index c1f7da2ee..edb878c12 100644 --- a/testutil/src/main/java/org/itsallcode/openfasttrace/testutil/xml/StreamWriterDelegate.java +++ b/testutil/src/main/java/org/itsallcode/openfasttrace/testutil/xml/StreamWriterDelegate.java @@ -10,6 +10,9 @@ */ public abstract class StreamWriterDelegate implements XMLStreamWriter { + /** Stream writer to delegate to. */ + protected XMLStreamWriter out; + /** * Creates a new instance of the delegate. * @@ -21,9 +24,6 @@ protected StreamWriterDelegate(final XMLStreamWriter out) this.out = out; } - /** Stream writer to delegate to. */ - protected XMLStreamWriter out; - @Override public Object getProperty(final String name) { diff --git a/testutil/src/test/java/org/itsallcode/openfasttrace/testutil/matcher/MatcherTestBaseTest.java b/testutil/src/test/java/org/itsallcode/openfasttrace/testutil/matcher/MatcherTestBaseTest.java index f154df1a8..d672c42e0 100644 --- a/testutil/src/test/java/org/itsallcode/openfasttrace/testutil/matcher/MatcherTestBaseTest.java +++ b/testutil/src/test/java/org/itsallcode/openfasttrace/testutil/matcher/MatcherTestBaseTest.java @@ -14,7 +14,7 @@ void testConstructor() assertThat(new DummyMatcher(), notNullValue()); } - private static class DummyMatcher extends MatcherTestBase + private static class DummyMatcher extends AbstractMatcherTest { @Override protected Matcher createMatcher(final String object)