Skip to content

Commit 847c5a2

Browse files
CAY-2874 Define project XML version in one place
* Add ProjectVersion value-based class. * Extract building of XML namespaces and schema locations to a utility class.
1 parent 9782dad commit 847c5a2

File tree

27 files changed

+353
-157
lines changed

27 files changed

+353
-157
lines changed

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,9 @@
2020

2121
import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
2222
import org.apache.cayenne.configuration.xml.DataChannelMetaData;
23+
import org.apache.cayenne.configuration.xml.ProjectVersion;
24+
import org.apache.cayenne.configuration.xml.Schema;
2325
import org.apache.cayenne.di.Inject;
24-
import org.apache.cayenne.project.Project;
2526
import org.apache.cayenne.project.extension.BaseNamingDelegate;
2627
import org.apache.cayenne.project.extension.LoaderDelegate;
2728
import org.apache.cayenne.project.extension.ProjectExtension;
@@ -32,7 +33,7 @@
3233
*/
3334
public class CgenExtension implements ProjectExtension {
3435

35-
public static final String NAMESPACE = "http://cayenne.apache.org/schema/" + Project.VERSION + "/cgen";
36+
public static final String NAMESPACE = Schema.buildNamespace(ProjectVersion.getCurrent(), "cgen");
3637

3738
@Inject
3839
private DataChannelMetaData metaData;

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,9 @@
2121

2222
import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
2323
import org.apache.cayenne.configuration.xml.DataChannelMetaData;
24+
import org.apache.cayenne.configuration.xml.ProjectVersion;
25+
import org.apache.cayenne.configuration.xml.Schema;
2426
import org.apache.cayenne.di.Inject;
25-
import org.apache.cayenne.project.Project;
2627
import org.apache.cayenne.project.extension.BaseNamingDelegate;
2728
import org.apache.cayenne.project.extension.LoaderDelegate;
2829
import org.apache.cayenne.project.extension.ProjectExtension;
@@ -33,7 +34,7 @@
3334
*/
3435
public class DbImportExtension implements ProjectExtension {
3536

36-
public static final String NAMESPACE = "http://cayenne.apache.org/schema/" + Project.VERSION + "/dbimport";
37+
public static final String NAMESPACE = Schema.buildNamespace(ProjectVersion.getCurrent(), "dbimport");
3738

3839
@Inject
3940
private DataChannelMetaData metaData;

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
import org.apache.cayenne.configuration.BaseConfigurationNodeVisitor;
2424
import org.apache.cayenne.configuration.DataChannelDescriptor;
25+
import org.apache.cayenne.configuration.xml.ProjectVersion;
2526
import org.apache.cayenne.map.DataMap;
2627
import org.apache.cayenne.project.extension.SaverDelegate;
2728
import org.apache.cayenne.util.XMLEncoder;
@@ -33,10 +34,10 @@
3334
class ConfigurationSaver extends BaseConfigurationNodeVisitor<Void> {
3435

3536
private PrintWriter printWriter;
36-
private String version;
37+
private ProjectVersion version;
3738
private SaverDelegate delegate;
3839

39-
ConfigurationSaver(PrintWriter printWriter, String version, SaverDelegate delegate) {
40+
ConfigurationSaver(PrintWriter printWriter, ProjectVersion version, SaverDelegate delegate) {
4041
this.printWriter = printWriter;
4142
this.version = version;
4243
this.delegate = delegate;

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.apache.cayenne.configuration.ConfigurationNameMapper;
2323
import org.apache.cayenne.configuration.ConfigurationNode;
2424
import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
25+
import org.apache.cayenne.configuration.xml.ProjectVersion;
2526
import org.apache.cayenne.di.Inject;
2627
import org.apache.cayenne.map.DataMap;
2728
import org.apache.cayenne.project.extension.ProjectExtension;
@@ -77,8 +78,8 @@ public FileProjectSaver(@Inject List<ProjectExtension> extensions) {
7778
}
7879

7980
@Override
80-
public String getSupportedVersion() {
81-
return String.valueOf(Project.VERSION);
81+
public ProjectVersion getSupportedVersion() {
82+
return ProjectVersion.getCurrent();
8283
}
8384

8485
@Override

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.apache.cayenne.configuration.ConfigurationNode;
2626
import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
2727
import org.apache.cayenne.configuration.ConfigurationTree;
28+
import org.apache.cayenne.configuration.xml.ProjectVersion;
2829
import org.apache.cayenne.resource.Resource;
2930

3031
/**
@@ -41,8 +42,10 @@ public class Project {
4142
* Used by different parsers and savers of project's XML files.
4243
*
4344
* @since 4.1
45+
* @deprecated since 5.0 use {@link ProjectVersion#getCurrent()} instead
4446
*/
45-
static public final int VERSION = 11;
47+
@Deprecated(since = "5.0", forRemoval = true)
48+
public static final int VERSION = (int) ProjectVersion.getCurrent().getAsDouble();
4649

4750
protected boolean modified;
4851

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
****************************************************************/
1919
package org.apache.cayenne.project;
2020

21+
import org.apache.cayenne.configuration.xml.ProjectVersion;
2122
import org.apache.cayenne.resource.Resource;
2223

2324
/**
@@ -30,7 +31,7 @@ public interface ProjectSaver {
3031
/**
3132
* Returns a version of the project configuration supported by the current runtime.
3233
*/
33-
String getSupportedVersion();
34+
ProjectVersion getSupportedVersion();
3435

3536
/**
3637
* Saves project in the location of its current configuration sources. Since resource

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,9 @@
2121

2222
import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
2323
import org.apache.cayenne.configuration.xml.DataChannelMetaData;
24+
import org.apache.cayenne.configuration.xml.ProjectVersion;
25+
import org.apache.cayenne.configuration.xml.Schema;
2426
import org.apache.cayenne.di.Inject;
25-
import org.apache.cayenne.project.Project;
2627
import org.apache.cayenne.project.extension.BaseNamingDelegate;
2728
import org.apache.cayenne.project.extension.LoaderDelegate;
2829
import org.apache.cayenne.project.extension.ProjectExtension;
@@ -37,7 +38,7 @@
3738
*/
3839
public class InfoExtension implements ProjectExtension {
3940

40-
static final String NAMESPACE = "http://cayenne.apache.org/schema/" + Project.VERSION + "/info";
41+
static final String NAMESPACE = Schema.buildNamespace(ProjectVersion.getCurrent(), "info");
4142

4243
@Inject
4344
private DataChannelMetaData metaData;

cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/DefaultUpgradeService.java

Lines changed: 18 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
import java.net.URL;
2424
import java.util.ArrayList;
2525
import java.util.Collection;
26-
import java.util.Comparator;
2726
import java.util.List;
2827
import java.util.Map;
2928
import java.util.TreeMap;
@@ -42,6 +41,7 @@
4241
import org.apache.cayenne.configuration.ConfigurationTree;
4342
import org.apache.cayenne.configuration.DataChannelDescriptor;
4443
import org.apache.cayenne.configuration.DataChannelDescriptorLoader;
44+
import org.apache.cayenne.configuration.xml.ProjectVersion;
4545
import org.apache.cayenne.di.Inject;
4646
import org.apache.cayenne.map.DataMap;
4747
import org.apache.cayenne.map.EntityResolver;
@@ -61,8 +61,6 @@
6161
import org.xml.sax.XMLReader;
6262
import org.xml.sax.helpers.DefaultHandler;
6363

64-
import static org.apache.cayenne.util.Util.isBlank;
65-
6664
/**
6765
*
6866
* Upgrade service sequence is following:
@@ -89,10 +87,9 @@ public class DefaultUpgradeService implements UpgradeService {
8987

9088
private static final Logger logger = LoggerFactory.getLogger(DefaultUpgradeService.class);
9189

92-
public static final String UNKNOWN_VERSION = "0";
93-
public static final String MIN_SUPPORTED_VERSION = "6";
90+
public static final ProjectVersion MIN_SUPPORTED_VERSION = ProjectVersion.V6;
9491

95-
TreeMap<String, UpgradeHandler> handlers = new TreeMap<>(VersionComparator.INSTANCE);
92+
TreeMap<ProjectVersion, UpgradeHandler> handlers = new TreeMap<>();
9693

9794
@Inject
9895
private ProjectSaver projectSaver;
@@ -101,7 +98,7 @@ public class DefaultUpgradeService implements UpgradeService {
10198
private DataChannelDescriptorLoader loader;
10299

103100
public DefaultUpgradeService(@Inject List<UpgradeHandler> handlerList) {
104-
for(UpgradeHandler handler : handlerList) {
101+
for (UpgradeHandler handler : handlerList) {
105102
handlers.put(handler.getVersion(), handler);
106103
}
107104
}
@@ -110,44 +107,34 @@ public DefaultUpgradeService(@Inject List<UpgradeHandler> handlerList) {
110107
public UpgradeMetaData getUpgradeType(Resource resource) {
111108
UpgradeMetaData metaData = new UpgradeMetaData();
112109

113-
String version = loadProjectVersion(resource);
114-
metaData.setProjectVersion(version);
115-
metaData.setSupportedVersion(String.valueOf(Project.VERSION));
110+
ProjectVersion version = loadProjectVersion(resource);
111+
metaData.setProjectVersion(version.getAsString());
112+
metaData.setSupportedVersion(ProjectVersion.getCurrent().getAsString());
116113

117-
int c1 = VersionComparator.INSTANCE.compare(version, MIN_SUPPORTED_VERSION);
118-
if (c1 < 0) {
119-
metaData.setIntermediateUpgradeVersion(MIN_SUPPORTED_VERSION);
114+
if (version.compareTo(MIN_SUPPORTED_VERSION) < 0) {
115+
metaData.setIntermediateUpgradeVersion(MIN_SUPPORTED_VERSION.getAsString());
120116
metaData.setUpgradeType(UpgradeType.INTERMEDIATE_UPGRADE_NEEDED);
121117
return metaData;
122118
}
123119

124-
int c2 = VersionComparator.INSTANCE.compare(String.valueOf(Project.VERSION), version);
125-
if (c2 < 0) {
120+
int comparison = ProjectVersion.getCurrent().compareTo(version);
121+
if (comparison < 0) {
126122
metaData.setUpgradeType(UpgradeType.DOWNGRADE_NEEDED);
127-
} else if (c2 == 0) {
123+
} else if (comparison == 0) {
128124
metaData.setUpgradeType(UpgradeType.UPGRADE_NOT_NEEDED);
129125
} else {
130126
metaData.setUpgradeType(UpgradeType.UPGRADE_NEEDED);
131127
}
132128
return metaData;
133129
}
134130

135-
protected List<UpgradeHandler> getHandlersForVersion(String version) {
136-
boolean found = MIN_SUPPORTED_VERSION.equals(version);
131+
protected List<UpgradeHandler> getHandlersForVersion(ProjectVersion version) {
137132
List<UpgradeHandler> handlerList = new ArrayList<>();
138-
139-
for(Map.Entry<String, UpgradeHandler> entry : handlers.entrySet()) {
140-
if(entry.getKey().equals(version)) {
141-
found = true;
142-
continue;
133+
for (Map.Entry<ProjectVersion, UpgradeHandler> entry : handlers.entrySet()) {
134+
if(entry.getKey().compareTo(version) > 0) {
135+
handlerList.add(entry.getValue());
143136
}
144-
if(!found) {
145-
continue;
146-
}
147-
148-
handlerList.add(entry.getValue());
149137
}
150-
151138
return handlerList;
152139
}
153140

@@ -263,7 +250,7 @@ protected void saveDocument(UpgradeUnit upgradeUnit) {
263250
* A default method for quick extraction of the project version from an XML
264251
* file.
265252
*/
266-
protected String loadProjectVersion(Resource resource) {
253+
protected ProjectVersion loadProjectVersion(Resource resource) {
267254

268255
RootTagHandler rootHandler = new RootTagHandler();
269256
URL url = resource.getURL();
@@ -278,44 +265,7 @@ protected String loadProjectVersion(Resource resource) {
278265
throw new ConfigurationException("Error reading configuration from %s", e, url);
279266
}
280267

281-
return rootHandler.projectVersion != null ? rootHandler.projectVersion : UNKNOWN_VERSION;
282-
}
283-
284-
protected static double decodeVersion(String version) {
285-
if (version == null || isBlank(version)) {
286-
return 0;
287-
}
288-
289-
// leave the first dot, and treat remaining as a fraction
290-
// remove all non digit chars
291-
StringBuilder buffer = new StringBuilder(version.length());
292-
boolean dotProcessed = false;
293-
for (int i = 0; i < version.length(); i++) {
294-
char nextChar = version.charAt(i);
295-
if (nextChar == '.' && !dotProcessed) {
296-
dotProcessed = true;
297-
buffer.append('.');
298-
} else if (Character.isDigit(nextChar)) {
299-
buffer.append(nextChar);
300-
}
301-
}
302-
303-
return Double.parseDouble(buffer.toString());
304-
}
305-
306-
private static class VersionComparator implements Comparator<String> {
307-
308-
private static final VersionComparator INSTANCE = new VersionComparator();
309-
310-
@Override
311-
public int compare(String o1, String o2) {
312-
if (o1.equals(o2)) {
313-
return 0;
314-
}
315-
double v1Double = decodeVersion(o1);
316-
double v2Double = decodeVersion(o2);
317-
return v1Double < v2Double ? -1 : 1;
318-
}
268+
return ProjectVersion.fromString(rootHandler.projectVersion);
319269
}
320270

321271
class RootTagHandler extends DefaultHandler {

cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/handlers/UpgradeHandler.java

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
import javax.xml.xpath.XPathFactory;
2626

2727
import org.apache.cayenne.configuration.DataChannelDescriptor;
28+
import org.apache.cayenne.configuration.xml.ProjectVersion;
29+
import org.apache.cayenne.configuration.xml.Schema;
2830
import org.apache.cayenne.project.upgrade.UpgradeUnit;
2931
import org.w3c.dom.Element;
3032
import org.w3c.dom.NodeList;
@@ -58,7 +60,7 @@ public interface UpgradeHandler {
5860
/**
5961
* @return target version for this handler
6062
*/
61-
String getVersion();
63+
ProjectVersion getVersion();
6264

6365
/**
6466
* Process DOM for the project root file (e.g. cayenne-project.xml)
@@ -84,13 +86,14 @@ default void processModel(DataChannelDescriptor dataChannelDescriptor) {
8486
*/
8587
default void updateDomainSchemaAndVersion(UpgradeUnit upgradeUnit) {
8688
Element domain = upgradeUnit.getDocument().getDocumentElement();
89+
ProjectVersion version = getVersion();
8790
// update schema
88-
domain.setAttribute("xmlns","http://cayenne.apache.org/schema/"+getVersion()+"/domain");
91+
domain.setAttribute("xmlns", Schema.buildNamespace(version, "domain"));
8992
domain.setAttribute("xmlns:xsi","http://www.w3.org/2001/XMLSchema-instance");
90-
domain.setAttribute("xsi:schemaLocation", "http://cayenne.apache.org/schema/"+getVersion()+"/domain " +
91-
"https://cayenne.apache.org/schema/"+getVersion()+"/domain.xsd");
93+
domain.setAttribute("xsi:schemaLocation", Schema.buildNamespace(version, "domain") + " " +
94+
Schema.buildSchemaLocation(version, "domain"));
9295
// update version
93-
domain.setAttribute("project-version", getVersion());
96+
domain.setAttribute("project-version", version.getAsString());
9497
}
9598

9699
/**
@@ -99,12 +102,13 @@ default void updateDomainSchemaAndVersion(UpgradeUnit upgradeUnit) {
99102
*/
100103
default void updateDataMapSchemaAndVersion(UpgradeUnit upgradeUnit) {
101104
Element dataMap = upgradeUnit.getDocument().getDocumentElement();
105+
ProjectVersion version = getVersion();
102106
// update schema
103-
dataMap.setAttribute("xmlns","http://cayenne.apache.org/schema/"+getVersion()+"/modelMap");
104-
dataMap.setAttribute("xsi:schemaLocation", "http://cayenne.apache.org/schema/"+getVersion()+"/modelMap " +
105-
"https://cayenne.apache.org/schema/"+getVersion()+"/modelMap.xsd");
107+
dataMap.setAttribute("xmlns", Schema.buildNamespace(version, "modelMap"));
108+
dataMap.setAttribute("xsi:schemaLocation", Schema.buildNamespace(version, "modelMap") + " " +
109+
Schema.buildSchemaLocation(version, "modelMap"));
106110
// update version
107-
dataMap.setAttribute("project-version", getVersion());
111+
dataMap.setAttribute("project-version", version.getAsString());
108112
}
109113

110114
/**
@@ -123,7 +127,7 @@ default void updateExtensionSchema(UpgradeUnit upgradeUnit, String extension) {
123127
}
124128
for (int j = 0; j < nodes.getLength(); j++) {
125129
Element element = (Element) nodes.item(j);
126-
element.setAttribute("xmlns", "http://cayenne.apache.org/schema/"+getVersion()+"/"+extension.toLowerCase());
130+
element.setAttribute("xmlns", Schema.buildNamespace(getVersion(), extension.toLowerCase()));
127131
}
128132
}
129133
}

cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/handlers/UpgradeHandler_V10.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
package org.apache.cayenne.project.upgrade.handlers;
2121

22+
import org.apache.cayenne.configuration.xml.ProjectVersion;
2223
import org.apache.cayenne.project.upgrade.UpgradeUnit;
2324

2425
/**
@@ -32,8 +33,8 @@
3233
public class UpgradeHandler_V10 implements UpgradeHandler {
3334

3435
@Override
35-
public String getVersion() {
36-
return "10";
36+
public ProjectVersion getVersion() {
37+
return ProjectVersion.V10;
3738
}
3839

3940
@Override

0 commit comments

Comments
 (0)