Skip to content

Commit 39bc9c1

Browse files
committed
CAY-2952 Unstable project extension ordering
1 parent a596a68 commit 39bc9c1

8 files changed

Lines changed: 63 additions & 3 deletions

File tree

RELEASE-NOTES.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ CAY-2931 Modeler: default encoding detected as UTF8, should be UTF-8
7878
CAY-2934 Modeler: dropdown data trunction
7979
CAY-2944 MergerTokenFactoryProvider does not resolve adapter subclasses
8080
CAY-2951 Newly reverse-engineered entities are excluded from CGen
81+
CAY-2952 Unstable project extension ordering
8182

8283
----------------------------------
8384
Release: 5.0-M1

cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenExtension.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,4 +51,9 @@ public SaverDelegate createSaverDelegate() {
5151
public ConfigurationNodeVisitor<String> createNamingDelegate() {
5252
return new BaseNamingDelegate();
5353
}
54+
55+
@Override
56+
public int order() {
57+
return 30;
58+
}
5459
}

cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/xml/DbImportExtension.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,4 +53,8 @@ public ConfigurationNodeVisitor<String> createNamingDelegate() {
5353
return new BaseNamingDelegate();
5454
}
5555

56+
@Override
57+
public int order() {
58+
return 20;
59+
}
5660
}

cayenne-project/src/main/java/org/apache/cayenne/project/FileProjectSaver.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import java.net.URL;
4343
import java.util.ArrayList;
4444
import java.util.Collection;
45+
import java.util.Comparator;
4546
import java.util.List;
4647

4748
/**
@@ -68,9 +69,11 @@ public FileProjectSaver(@Inject List<ProjectExtension> extensions) {
6869
// this is not configurable yet... probably doesn't have to be
6970
fileEncoding = "UTF-8";
7071

71-
this.extensions = extensions;
72-
Collection<SaverDelegate> delegates = new ArrayList<>(extensions.size());
73-
for (ProjectExtension extension : extensions) {
72+
List<ProjectExtension> sorted = new ArrayList<>(extensions);
73+
sorted.sort(Comparator.comparingInt(ProjectExtension::order));
74+
this.extensions = sorted;
75+
Collection<SaverDelegate> delegates = new ArrayList<>(sorted.size());
76+
for (ProjectExtension extension : sorted) {
7477
delegates.add(extension.createSaverDelegate());
7578
}
7679
delegate = new CompoundSaverDelegate(delegates);

cayenne-project/src/main/java/org/apache/cayenne/project/extension/ProjectExtension.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,4 +50,12 @@ public interface ProjectExtension {
5050

5151
ConfigurationNodeVisitor<String> createNamingDelegate();
5252

53+
/**
54+
* Controls the relative position of this extension's XML elements within a saved file.
55+
* Extensions with lower values are written first. Each known extension must return a unique value.
56+
*
57+
* @since 5.0
58+
*/
59+
int order();
60+
5361
}

cayenne-project/src/main/java/org/apache/cayenne/project/extension/info/InfoExtension.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,4 +56,9 @@ public SaverDelegate createSaverDelegate() {
5656
public ConfigurationNodeVisitor<String> createNamingDelegate() {
5757
return new BaseNamingDelegate();
5858
}
59+
60+
@Override
61+
public int order() {
62+
return 10;
63+
}
5964
}

cayenne-project/src/main/java/org/apache/cayenne/project/extension/validation/ValidationExtension.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,4 +48,9 @@ public SaverDelegate createSaverDelegate() {
4848
public ConfigurationNodeVisitor<String> createNamingDelegate() {
4949
return new BaseNamingDelegate();
5050
}
51+
52+
@Override
53+
public int order() {
54+
return 40;
55+
}
5156
}

cayenne-project/src/test/java/org/apache/cayenne/project/FileProjectSaverTest.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
package org.apache.cayenne.project;
2020

2121
import org.apache.cayenne.configuration.ConfigurationNameMapper;
22+
import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
2223
import org.apache.cayenne.configuration.ConfigurationTree;
2324
import org.apache.cayenne.configuration.DataChannelDescriptor;
2425
import org.apache.cayenne.configuration.DataNodeDescriptor;
@@ -27,7 +28,10 @@
2728
import org.apache.cayenne.di.Injector;
2829
import org.apache.cayenne.di.Module;
2930
import org.apache.cayenne.map.DataMap;
31+
import org.apache.cayenne.project.extension.BaseSaverDelegate;
32+
import org.apache.cayenne.project.extension.LoaderDelegate;
3033
import org.apache.cayenne.project.extension.ProjectExtension;
34+
import org.apache.cayenne.project.extension.SaverDelegate;
3135
import org.apache.cayenne.resource.URLResource;
3236
import org.junit.jupiter.api.BeforeEach;
3337
import org.junit.jupiter.api.Test;
@@ -43,6 +47,7 @@
4347
import java.net.URL;
4448
import java.util.Arrays;
4549
import java.util.Collections;
50+
import java.util.List;
4651

4752
import static org.junit.jupiter.api.Assertions.assertEquals;
4853
import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -135,6 +140,30 @@ private void assertSaveAs_Sorted(File file) throws Exception {
135140
assertEquals("C", xpath.evaluate("@name", mapRefs.item(2)));
136141
}
137142

143+
@Test
144+
public void extensionsAreSortedByOrder() {
145+
ProjectExtension ext10 = stubExtension(10);
146+
ProjectExtension ext20 = stubExtension(20);
147+
ProjectExtension ext30 = stubExtension(30);
148+
149+
// supply in reverse order — saver must still store them sorted ascending
150+
FileProjectSaver s1 = new FileProjectSaver(List.of(ext30, ext20, ext10));
151+
assertEquals(List.of(ext10, ext20, ext30), s1.extensions);
152+
153+
// supply in random order
154+
FileProjectSaver s2 = new FileProjectSaver(List.of(ext20, ext10, ext30));
155+
assertEquals(List.of(ext10, ext20, ext30), s2.extensions);
156+
}
157+
158+
private static ProjectExtension stubExtension(int order) {
159+
return new ProjectExtension() {
160+
@Override public LoaderDelegate createLoaderDelegate() { return null; }
161+
@Override public SaverDelegate createSaverDelegate() { return new BaseSaverDelegate(); }
162+
@Override public ConfigurationNodeVisitor<String> createNamingDelegate() { return null; }
163+
@Override public int order() { return order; }
164+
};
165+
}
166+
138167
/**
139168
* Regression test for CAY-1780: relative fragments (e.g. ./../) in target
140169
* file path must be resolved correctly.

0 commit comments

Comments
 (0)