Skip to content

Commit 8c63c20

Browse files
committed
refactor: extract Transformer super interface ...
... from VariationDiffTransformer
1 parent 48f93b4 commit 8c63c20

7 files changed

Lines changed: 79 additions & 66 deletions

File tree

src/main/java/org/variantsync/diffdetective/analysis/PreprocessingAnalysis.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import java.util.Arrays;
44
import java.util.List;
55

6+
import org.variantsync.diffdetective.variation.diff.transform.Transformer;
67
import org.variantsync.diffdetective.variation.diff.transform.VariationDiffTransformer;
78
import org.variantsync.diffdetective.variation.DiffLinesLabel;
89

@@ -20,7 +21,7 @@ public PreprocessingAnalysis(VariationDiffTransformer<DiffLinesLabel>... preproc
2021

2122
@Override
2223
public boolean analyzeVariationDiff(Analysis analysis) {
23-
VariationDiffTransformer.apply(preprocessors, analysis.getCurrentVariationDiff());
24+
Transformer.apply(preprocessors, analysis.getCurrentVariationDiff());
2425
analysis.getCurrentVariationDiff().assertConsistency();
2526
return true;
2627
}

src/main/java/org/variantsync/diffdetective/internal/SimpleRenderer.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import org.variantsync.diffdetective.variation.diff.render.RenderOptions;
1919
import org.variantsync.diffdetective.variation.diff.render.VariationDiffRenderer;
2020
import org.variantsync.diffdetective.variation.diff.serialize.nodeformat.MappingsDiffNodeFormat;
21+
import org.variantsync.diffdetective.variation.diff.transform.Transformer;
2122
import org.variantsync.diffdetective.variation.diff.transform.VariationDiffTransformer;
2223

2324
import java.io.IOException;
@@ -165,7 +166,7 @@ public static void main(String[] args) throws IOException {
165166
final List<VariationDiffTransformer<DiffLinesLabel>> transform = VariationDiffMiner.Postprocessing(repository);
166167
final PatchDiff patch = VariationDiffParser.parsePatch(repository, file, commit);
167168
Assert.assertNotNull(patch != null);
168-
VariationDiffTransformer.apply(transform, patch.getVariationDiff());
169+
Transformer.apply(transform, patch.getVariationDiff());
169170
renderer.render(patch, Path.of("render", repoName), RENDER_OPTIONS_TO_USE);
170171
}
171172

src/main/java/org/variantsync/diffdetective/mining/postprocessing/Postprocessor.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import org.variantsync.diffdetective.variation.diff.filter.ExplainedFilter;
88
import org.variantsync.diffdetective.variation.diff.filter.TaggedPredicate;
99
import org.variantsync.diffdetective.variation.diff.transform.CutNonEditedSubtrees;
10+
import org.variantsync.diffdetective.variation.diff.transform.Transformer;
1011
import org.variantsync.diffdetective.variation.diff.transform.VariationDiffTransformer;
1112

1213
import java.util.List;
@@ -66,7 +67,7 @@ public static <L extends Label> Postprocessor<L> Default() {
6667
public Result<L> postprocess(final List<VariationDiff<L>> frequentSubgraphs) {
6768
final List<VariationDiff<L>> processedTrees = frequentSubgraphs.stream()
6869
.filter(filters)
69-
.peek(tree -> VariationDiffTransformer.apply(transformers, tree))
70+
.peek(tree -> Transformer.apply(transformers, tree))
7071
.toList();
7172

7273
final Map<String, Integer> filterCounts = new ExplainedFilterSummary(filters).snapshot();

src/main/java/org/variantsync/diffdetective/variation/diff/transform/CollapseNestedNonEditedAnnotations.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ public class CollapseNestedNonEditedAnnotations implements VariationDiffTransfor
3636
private final List<Stack<DiffNode<DiffLinesLabel>>> chains = new ArrayList<>();
3737

3838
@Override
39-
public List<Class<? extends VariationDiffTransformer<DiffLinesLabel>>> getDependencies() {
39+
public List<Class<? extends Transformer<VariationDiff<DiffLinesLabel>>>> getDependencies() {
4040
return List.of(Cast.unchecked(CutNonEditedSubtrees.class));
4141
}
4242

src/main/java/org/variantsync/diffdetective/variation/diff/transform/LabelWithEditClass.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public void transform(VariationDiff<DiffLinesLabel> variationDiff) {
3939
}
4040

4141
@Override
42-
public List<Class<? extends VariationDiffTransformer<DiffLinesLabel>>> getDependencies() {
42+
public List<Class<? extends Transformer<VariationDiff<DiffLinesLabel>>>> getDependencies() {
4343
return relabelNodes.getDependencies();
4444
}
4545
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package org.variantsync.diffdetective.variation.diff.transform;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
6+
/**
7+
* Models an operation that changes an object of type T inplace (i.e., the object is altered).
8+
* To model further assumptions on the given elements T (i.e., assumptions that cannot easily be expressed as a type),
9+
* Transformers may have dependencies to other transformers, which should be applied first.
10+
*/
11+
public interface Transformer<T> {
12+
/**
13+
* Apply a transformation to the given Object inplace.
14+
* The object will be changed.
15+
* @param element The T object to transform.
16+
*/
17+
void transform(final T element);
18+
19+
/**
20+
* Returns a list of dependencies to other transformers.
21+
* A transformer should only be run, if another transformation with the respective type was run for each type on the dependencies.
22+
* @return List of types of which instances should be run before applying this transformation.
23+
*/
24+
default List<Class<? extends Transformer<T>>> getDependencies() {
25+
return new ArrayList<>(0);
26+
}
27+
28+
/**
29+
* Checks that the dependencies of all given transformers are satisfied when
30+
* applying the transformers sequentially.
31+
* @param transformers The transformers whose dependencies to check.
32+
* @throws RuntimeException when a dependency is not met.
33+
*/
34+
static <T> void checkDependencies(final List<? extends Transformer<T>> transformers) {
35+
for (int i = transformers.size() - 1; i >= 0; --i) {
36+
final Transformer<T> currentTransformer = transformers.get(i);
37+
final List<Class<? extends Transformer<T>>> currentDependencies = currentTransformer.getDependencies();
38+
for (final Class<? extends Transformer<T>> dependency : currentDependencies) {
39+
boolean dependencyMet = false;
40+
for (int j = i - 1; j >= 0; --j) {
41+
if (dependency.isInstance(transformers.get(j))) {
42+
dependencyMet = true;
43+
break;
44+
}
45+
}
46+
if (!dependencyMet) {
47+
throw new RuntimeException("Dependency not met! Transformer "
48+
+ currentTransformer
49+
+ " requires a transformer of type "
50+
+ dependency
51+
+ " applied before!");
52+
}
53+
}
54+
}
55+
}
56+
57+
/**
58+
* Applies all given transformers to the given element sequentially.
59+
* First checks that all dependencies between transformers are met via {@link #checkDependencies(List)}.
60+
* @param transformers Transformers to apply sequentially.
61+
* @param tree Tree to transform inplace.
62+
*/
63+
static <T> void apply(final List<? extends Transformer<T>> transformers, final T element) {
64+
checkDependencies(transformers);
65+
for (final Transformer<T> t : transformers) {
66+
t.transform(element);
67+
}
68+
}
69+
70+
}

src/main/java/org/variantsync/diffdetective/variation/diff/transform/VariationDiffTransformer.java

Lines changed: 1 addition & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -3,70 +3,10 @@
33
import org.variantsync.diffdetective.variation.Label;
44
import org.variantsync.diffdetective.variation.diff.VariationDiff;
55

6-
import java.util.ArrayList;
7-
import java.util.List;
8-
96
/**
107
* Interface that represents inplace transformations of VariationDiffs.
118
* A VariationDiffTransformer is intended to alter a given VariationDiff.
129
* @author Paul Bittner
1310
*/
14-
public interface VariationDiffTransformer<L extends Label> {
15-
/**
16-
* Apply a transformation to the given VariationDiff inplace.
17-
* The given tree will be changed.
18-
* @param variationDiff The VariationDiff to transform.
19-
*/
20-
void transform(final VariationDiff<L> variationDiff);
21-
22-
/**
23-
* Returns a list of dependencies to other transformers.
24-
* A transformer should only be run, if another transformation with the respective type was run for each type on the dependencies.
25-
* @return List of types of which instances should be run before applying this transformation.
26-
*/
27-
default List<Class<? extends VariationDiffTransformer<L>>> getDependencies() {
28-
return new ArrayList<>(0);
29-
}
30-
31-
/**
32-
* Checks that the dependencies of all given VariationDiffTransformers are satisfied when
33-
* applying the transformers sequentially.
34-
* @param transformers The transformers whose dependencies to check.
35-
* @throws RuntimeException when a dependency is not met.
36-
*/
37-
static <L extends Label> void checkDependencies(final List<VariationDiffTransformer<L>> transformers) {
38-
for (int i = transformers.size() - 1; i >= 0; --i) {
39-
final VariationDiffTransformer<L> currentTransformer = transformers.get(i);
40-
final List<Class<? extends VariationDiffTransformer<L>>> currentDependencies = currentTransformer.getDependencies();
41-
for (final Class<? extends VariationDiffTransformer<L>> dependency : currentDependencies) {
42-
boolean dependencyMet = false;
43-
for (int j = i - 1; j >= 0; --j) {
44-
if (dependency.isInstance(transformers.get(j))) {
45-
dependencyMet = true;
46-
break;
47-
}
48-
}
49-
if (!dependencyMet) {
50-
throw new RuntimeException("Dependency not met! VariationDiffTransformer "
51-
+ currentTransformer
52-
+ " requires a transformer of type "
53-
+ dependency
54-
+ " applied before!");
55-
}
56-
}
57-
}
58-
}
59-
60-
/**
61-
* Applies all given transformers to the given VariationDiff sequentially.
62-
* First checks that all dependencies between transformers are met via {@link #checkDependencies(List)}.
63-
* @param transformers Transformers to apply sequentially.
64-
* @param tree Tree to transform inplace.
65-
*/
66-
static <L extends Label> void apply(final List<VariationDiffTransformer<L>> transformers, final VariationDiff<L> tree) {
67-
checkDependencies(transformers);
68-
for (final VariationDiffTransformer<L> t : transformers) {
69-
t.transform(tree);
70-
}
71-
}
11+
public interface VariationDiffTransformer<L extends Label> extends Transformer<VariationDiff<L>> {
7212
}

0 commit comments

Comments
 (0)