From f6db969dd263b635e3ea72fea0366e077852350d Mon Sep 17 00:00:00 2001 From: Ulli Hafner Date: Tue, 11 Apr 2023 10:30:27 +0200 Subject: [PATCH 1/6] Restore old serialized `FileNode` instances correctly. Restore the relative path to an empty string. --- src/main/java/edu/hm/hafner/coverage/FileNode.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/main/java/edu/hm/hafner/coverage/FileNode.java b/src/main/java/edu/hm/hafner/coverage/FileNode.java index 568ce553..1e30dd7c 100644 --- a/src/main/java/edu/hm/hafner/coverage/FileNode.java +++ b/src/main/java/edu/hm/hafner/coverage/FileNode.java @@ -40,7 +40,7 @@ public final class FileNode extends Node { private final NavigableMap indirectCoverageChanges = new TreeMap<>(); private final NavigableMap coverageDelta = new TreeMap<>(); - private TreeString relativePath; + private TreeString relativePath; // @since 0.22.0 /** * Creates a new {@link FileNode} with the given name. @@ -68,6 +68,18 @@ public FileNode(final String name, final String relativePath) { this(name, TreeString.valueOf(relativePath)); } + /** + * Called after de-serialization to retain backward compatibility. + * + * @return this + */ + private Object readResolve() { + if (relativePath == null) { + relativePath = TreeString.valueOf(StringUtils.EMPTY); + } + return this; + } + @Override public FileNode copy() { var file = new FileNode(getName(), relativePath); From 1299a1380525effa6ffbd478da4cf50117358f51 Mon Sep 17 00:00:00 2001 From: Ulli Hafner Date: Tue, 11 Apr 2023 10:32:05 +0200 Subject: [PATCH 2/6] Bump version to 0.22.1. --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f49ee78d..25c30a61 100644 --- a/pom.xml +++ b/pom.xml @@ -45,7 +45,7 @@ HEAD - 0.23.0 + 0.22.1 -SNAPSHOT edu.hm.hafner.coverage From 827f9443f5e7f4d2f7ef4d212231fc36c7c153b1 Mon Sep 17 00:00:00 2001 From: Ulli Hafner Date: Tue, 11 Apr 2023 11:03:28 +0200 Subject: [PATCH 3/6] Make `readResolve` protected. --- src/main/java/edu/hm/hafner/coverage/FileNode.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/edu/hm/hafner/coverage/FileNode.java b/src/main/java/edu/hm/hafner/coverage/FileNode.java index 1e30dd7c..3d68978c 100644 --- a/src/main/java/edu/hm/hafner/coverage/FileNode.java +++ b/src/main/java/edu/hm/hafner/coverage/FileNode.java @@ -73,7 +73,7 @@ public FileNode(final String name, final String relativePath) { * * @return this */ - private Object readResolve() { + protected Object readResolve() { if (relativePath == null) { relativePath = TreeString.valueOf(StringUtils.EMPTY); } From 7a9ad82ba15cbd0f5d0cdbf1112b39a96141376c Mon Sep 17 00:00:00 2001 From: Ulli Hafner Date: Tue, 11 Apr 2023 11:13:31 +0200 Subject: [PATCH 4/6] Increment serial version number. --- src/main/java/edu/hm/hafner/coverage/FileNode.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/edu/hm/hafner/coverage/FileNode.java b/src/main/java/edu/hm/hafner/coverage/FileNode.java index 3d68978c..390a7f5c 100644 --- a/src/main/java/edu/hm/hafner/coverage/FileNode.java +++ b/src/main/java/edu/hm/hafner/coverage/FileNode.java @@ -29,7 +29,7 @@ */ @SuppressWarnings("PMD.GodClass") public final class FileNode extends Node { - private static final long serialVersionUID = -3795695377267542624L; + private static final long serialVersionUID = 2L; // @since 0.22.0 private final NavigableMap coveredPerLine = new TreeMap<>(); private final NavigableMap missedPerLine = new TreeMap<>(); From f0591fcf85014284fb312be7693cba72eef5da26 Mon Sep 17 00:00:00 2001 From: Ulli Hafner Date: Tue, 11 Apr 2023 11:58:31 +0200 Subject: [PATCH 5/6] Add a test case. --- .../java/edu/hm/hafner/coverage/FileNode.java | 4 ++-- src/main/java/module-info.java | 10 ---------- .../edu/hm/hafner/coverage/AbstractNodeTest.java | 8 +++++++- .../edu/hm/hafner/coverage/FileNodeTest.java | 11 ++++++++++- .../edu/hm/hafner/coverage/version-0.21.0.ser | Bin 0 -> 1027 bytes 5 files changed, 19 insertions(+), 14 deletions(-) delete mode 100644 src/main/java/module-info.java create mode 100644 src/test/resources/edu/hm/hafner/coverage/version-0.21.0.ser diff --git a/src/main/java/edu/hm/hafner/coverage/FileNode.java b/src/main/java/edu/hm/hafner/coverage/FileNode.java index 390a7f5c..a66e5bee 100644 --- a/src/main/java/edu/hm/hafner/coverage/FileNode.java +++ b/src/main/java/edu/hm/hafner/coverage/FileNode.java @@ -29,7 +29,7 @@ */ @SuppressWarnings("PMD.GodClass") public final class FileNode extends Node { - private static final long serialVersionUID = 2L; // @since 0.22.0 + private static final long serialVersionUID = -3795695377267542624L; // Set to 1 when release 1.0.0 is ready private final NavigableMap coveredPerLine = new TreeMap<>(); private final NavigableMap missedPerLine = new TreeMap<>(); @@ -73,7 +73,7 @@ public FileNode(final String name, final String relativePath) { * * @return this */ - protected Object readResolve() { + private Object readResolve() { if (relativePath == null) { relativePath = TreeString.valueOf(StringUtils.EMPTY); } diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java deleted file mode 100644 index 5e5174ae..00000000 --- a/src/main/java/module-info.java +++ /dev/null @@ -1,10 +0,0 @@ -module edu.hm.hafner.metric { - requires java.xml; - requires org.apache.commons.lang3; - requires com.github.spotbugs.annotations; - requires com.google.errorprone.annotations; - requires edu.hm.hafner.codingstyle; - - exports edu.hm.hafner.coverage; - exports edu.hm.hafner.coverage.registry; -} diff --git a/src/test/java/edu/hm/hafner/coverage/AbstractNodeTest.java b/src/test/java/edu/hm/hafner/coverage/AbstractNodeTest.java index 7929aef3..a4764c04 100644 --- a/src/test/java/edu/hm/hafner/coverage/AbstractNodeTest.java +++ b/src/test/java/edu/hm/hafner/coverage/AbstractNodeTest.java @@ -5,6 +5,7 @@ import org.junit.jupiter.api.Test; import edu.hm.hafner.coverage.Coverage.CoverageBuilder; +import edu.hm.hafner.util.SerializableTest; import nl.jqno.equalsverifier.EqualsVerifier; import nl.jqno.equalsverifier.api.EqualsVerifierApi; @@ -12,7 +13,7 @@ import static edu.hm.hafner.coverage.assertions.Assertions.*; -abstract class AbstractNodeTest { +abstract class AbstractNodeTest extends SerializableTest { private static final String NAME = "Node Name"; private static final String CHILD = "Child"; private static final Coverage MUTATION_COVERAGE = new CoverageBuilder().setMetric(Metric.MUTATION) @@ -20,6 +21,11 @@ abstract class AbstractNodeTest { .setMissed(10) .build(); + @Override + protected Node createSerializable() { + return createNode("Serialized"); + } + abstract Metric getMetric(); abstract Node createNode(String name); diff --git a/src/test/java/edu/hm/hafner/coverage/FileNodeTest.java b/src/test/java/edu/hm/hafner/coverage/FileNodeTest.java index 1be28b0e..00e72567 100644 --- a/src/test/java/edu/hm/hafner/coverage/FileNodeTest.java +++ b/src/test/java/edu/hm/hafner/coverage/FileNodeTest.java @@ -1,5 +1,6 @@ package edu.hm.hafner.coverage; +import org.apache.commons.lang3.StringUtils; import org.junit.jupiter.api.Test; import edu.hm.hafner.util.TreeString; @@ -19,7 +20,6 @@ Metric getMetric() { void configureEqualsVerifier(final EqualsVerifierApi verifier) { verifier.withPrefabValues(TreeString.class, TreeString.valueOf("src"), TreeString.valueOf("test")) .suppress(Warning.NONFINAL_FIELDS); - } @Override @@ -66,4 +66,13 @@ void shouldGetFilePath() { assertThat(file.matches(Metric.FILE, otherPath.hashCode())).isTrue(); assertThat(file.matches(Metric.FILE, "wrong".hashCode())).isFalse(); } + + @Test + void shouldReadOldVersion() { + byte[] restored = readAllBytes("version-0.21.0.ser"); + + var serializable = (FileNode)createSerializable(); + serializable.setRelativePath(TreeString.valueOf(StringUtils.EMPTY)); + assertThatRestoredInstanceEqualsOriginalInstance(serializable, restore(restored)); + } } diff --git a/src/test/resources/edu/hm/hafner/coverage/version-0.21.0.ser b/src/test/resources/edu/hm/hafner/coverage/version-0.21.0.ser new file mode 100644 index 0000000000000000000000000000000000000000..8d92b6bdae3243b5cb4af55357ba55e27e8fe6f7 GIT binary patch literal 1027 zcmZ`&ziSjh6n?jN2`2Gk5{V|nBb63{yPycdfuLs&4>loqb~a9SUv4MtFK1`ZRWT6I z1hmwE7D9@Y`6sL_>};$Av9JqRX<_4gyUFGvWQt{W-#6d;zVFTM?ZZ%_U>@Dn^a9fp zt05}WiTbES56!mpaVc`~^S!^9uRgrKW5BQt^~3TV^tI41W3P$6uu?63Yf1EFPptU3 zDB`9K<2e-FWmL8d@e!;;#fI}TbfrQ^w+{NWJQ4OVIVjfynI!+8sRxlOS0%d4lW3S8 zXxfdGMz@QaI*tS>X_8S$n27<5Efd|$6wICAlwI!LeYyE6eg4&eAsbFPp7dRXA*-s| zFdU#(($O$)6NTjkRuPtUn1;2O14u(H6a@q`^^8($jlKZy@jsC1x~$fuaaK%@5}Qaw||!ts#qW)RSHO_q7h421T~ zwh|7H9H80%^&-1%fYE_57sDu!A$RJ)2>GEaO?&b=apZF;4OUQX?rk^5-hO{=Pz;=3 zg)L>dyU9X|Q98@x>4X}4sHT4G?EcxECRpI@#8{PD$B11XHI{@w|C2Lw)eLlRN2u$nzIG#;LQF3`nooU literal 0 HcmV?d00001 From 6712ac0a679563117d29aebcdcdc6124b5557a33 Mon Sep 17 00:00:00 2001 From: Ulli Hafner Date: Tue, 11 Apr 2023 12:03:27 +0200 Subject: [PATCH 6/6] Make `FileNode#readResolve` protected. --- src/main/java/edu/hm/hafner/coverage/FileNode.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/edu/hm/hafner/coverage/FileNode.java b/src/main/java/edu/hm/hafner/coverage/FileNode.java index a66e5bee..0a9c3405 100644 --- a/src/main/java/edu/hm/hafner/coverage/FileNode.java +++ b/src/main/java/edu/hm/hafner/coverage/FileNode.java @@ -73,7 +73,7 @@ public FileNode(final String name, final String relativePath) { * * @return this */ - private Object readResolve() { + protected Object readResolve() { if (relativePath == null) { relativePath = TreeString.valueOf(StringUtils.EMPTY); }