Skip to content

Commit d7eb291

Browse files
committed
CAY-2469 Allow maxQueueWaitTime and validationQuery in XML project
1 parent 4fd5039 commit d7eb291

File tree

23 files changed

+441
-60
lines changed

23 files changed

+441
-60
lines changed

RELEASE-NOTES.txt

+2-1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ Changes/New Features:
1515

1616
CAY-2446 Run Disjoint By Id queries outside of synchronized block
1717
CAY-2447 Crypto support for LocalDateTime
18+
CAY-2469 Allow maxQueueWaitTime and validationQuery to be set in XML project
1819
CAY-2471 Support multiple XML project versions
1920

2021
Bug Fixes:
@@ -549,4 +550,4 @@ CAY-1804 Serialisation of long[] type was not working correctly.
549550
CAY-1806 Error importing eomodel
550551
CAY-1817 NPE during Validate Project
551552
CAY-1827 EhCache region corresponding to a cache group loses its settings after 'removeGroup'
552-
CAY-1832 Exception when modifying objects in postLoad callback
553+
CAY-1832 Exception when modifying objects in postLoad callback

cayenne-project-compatibility/src/main/java/org/apache/cayenne/project/compatibility/ProjectCompatibilityModule.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import org.apache.cayenne.project.ProjectModule;
2929
import org.apache.cayenne.project.upgrade.UpgradeService;
3030
import org.apache.cayenne.project.upgrade.handlers.UpgradeHandler_V10;
31+
import org.apache.cayenne.project.upgrade.handlers.UpgradeHandler_V11;
3132
import org.apache.cayenne.project.upgrade.handlers.UpgradeHandler_V7;
3233
import org.apache.cayenne.project.upgrade.handlers.UpgradeHandler_V8;
3334
import org.apache.cayenne.project.upgrade.handlers.UpgradeHandler_V9;
@@ -49,6 +50,7 @@ public void configure(Binder binder) {
4950
.add(UpgradeHandler_V7.class)
5051
.add(UpgradeHandler_V8.class)
5152
.add(UpgradeHandler_V9.class)
52-
.add(UpgradeHandler_V10.class);
53+
.add(UpgradeHandler_V10.class)
54+
.add(UpgradeHandler_V11.class);
5355
}
5456
}

cayenne-project-compatibility/src/test/java/org/apache/cayenne/project/compatibility/CompatibilityTestModule.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import org.apache.cayenne.project.upgrade.UpgradeService;
3535
import org.apache.cayenne.project.upgrade.handlers.UpgradeHandler;
3636
import org.apache.cayenne.project.upgrade.handlers.UpgradeHandler_V10;
37+
import org.apache.cayenne.project.upgrade.handlers.UpgradeHandler_V11;
3738
import org.apache.cayenne.project.upgrade.handlers.UpgradeHandler_V7;
3839
import org.apache.cayenne.project.upgrade.handlers.UpgradeHandler_V8;
3940
import org.apache.cayenne.project.upgrade.handlers.UpgradeHandler_V9;
@@ -59,7 +60,8 @@ public void configure(Binder binder) {
5960
.add(UpgradeHandler_V7.class)
6061
.add(UpgradeHandler_V8.class)
6162
.add(UpgradeHandler_V9.class)
62-
.add(UpgradeHandler_V10.class);
63+
.add(UpgradeHandler_V10.class)
64+
.add(UpgradeHandler_V11.class);
6365

6466
binder.bind(ProjectSaver.class).toInstance(mock(ProjectSaver.class));
6567
binder.bind(DataChannelDescriptorLoader.class).toInstance(mock(DataChannelDescriptorLoader.class));

cayenne-project-compatibility/src/test/java/org/apache/cayenne/project/compatibility/CompatibilityUpgradeServiceIT.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public void testUpgradeFullProjectDom() throws Exception {
5252
Document domainDocument = documentProvider.getDocument(resourceUrl);
5353

5454
assertNotNull(domainDocument);
55-
assertEquals("10", domainDocument.getDocumentElement().getAttribute("project-version"));
55+
assertEquals("11", domainDocument.getDocumentElement().getAttribute("project-version"));
5656

5757
URL dataMapUrl = getClass().getResource("test-map-v6.map.xml");
5858
Document dataMapDocument = documentProvider.getDocument(dataMapUrl);
@@ -87,4 +87,4 @@ public void testUpgradeStandAloneDataMapDom() throws Exception {
8787
private Injector getInjector() {
8888
return DIBootstrap.createInjector(new CompatibilityTestModule());
8989
}
90-
}
90+
}

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

+3-1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.apache.cayenne.project.upgrade.UpgradeService;
2727
import org.apache.cayenne.project.upgrade.handlers.UpgradeHandler;
2828
import org.apache.cayenne.project.upgrade.handlers.UpgradeHandler_V10;
29+
import org.apache.cayenne.project.upgrade.handlers.UpgradeHandler_V11;
2930
import org.apache.cayenne.project.upgrade.handlers.UpgradeHandler_V7;
3031
import org.apache.cayenne.project.upgrade.handlers.UpgradeHandler_V8;
3132
import org.apache.cayenne.project.upgrade.handlers.UpgradeHandler_V9;
@@ -66,7 +67,8 @@ public void configure(Binder binder) {
6667
.add(UpgradeHandler_V7.class)
6768
.add(UpgradeHandler_V8.class)
6869
.add(UpgradeHandler_V9.class)
69-
.add(UpgradeHandler_V10.class);
70+
.add(UpgradeHandler_V10.class)
71+
.add(UpgradeHandler_V11.class);
7072

7173
contributeExtensions(binder);
7274
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package org.apache.cayenne.project;
2+
3+
import org.apache.cayenne.CayenneRuntimeException;
4+
5+
/**
6+
* Encapsulates compatible schema versions.
7+
*/
8+
public enum ProjectVersion {
9+
10+
VERSION_9(null,"9",null,null,null),
11+
VERSION_10("10","10","10","10","10"),
12+
VERSION_11("11","10","10","10","10");
13+
14+
public final String domainSchemaVersion;
15+
public final String modelMapSchemaVersion;
16+
public final String dbImportSchemaVersion;
17+
public final String graphSchemaVersion;
18+
public final String infoSchemaVersion;
19+
20+
ProjectVersion(String domainSchemaVersion, String modelMapSchemaVersion,
21+
String graphSchemaVersion, String infoSchemaVersion,
22+
String dbImportSchemaVersion) {
23+
this.domainSchemaVersion = domainSchemaVersion;
24+
this.modelMapSchemaVersion = modelMapSchemaVersion;
25+
this.dbImportSchemaVersion = dbImportSchemaVersion;
26+
this.graphSchemaVersion = graphSchemaVersion;
27+
this.infoSchemaVersion = infoSchemaVersion;
28+
}
29+
30+
public ProjectVersion getProjectVersion(String version) {
31+
switch (version) {
32+
case "9":
33+
return VERSION_9;
34+
case "10":
35+
return VERSION_10;
36+
case "11":
37+
return VERSION_11;
38+
default:
39+
throw new CayenneRuntimeException("Invalid project version: " + version);
40+
}
41+
}
42+
}

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

+11-11
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,10 @@ public class DefaultUpgradeService implements UpgradeService {
8787

8888
private static final Logger logger = LoggerFactory.getLogger(DefaultUpgradeService.class);
8989

90-
public static final String UNKNOWN_VERSION = "0";
91-
public static final String MIN_SUPPORTED_VERSION = "6";
90+
private static final String UNKNOWN_VERSION = "0";
91+
private static final String MIN_INTERMEDIATE_SUPPORTED_VERSION = "6";
92+
private static final String MIN_SUPPORTED_VERSION = "10";
93+
private static final String MAX_SUPPORTED_VERSION = "11";
9294

9395
TreeMap<String, UpgradeHandler> handlers = new TreeMap<>(VersionComparator.INSTANCE);
9496

@@ -110,28 +112,26 @@ public UpgradeMetaData getUpgradeType(Resource resource) {
110112

111113
String version = loadProjectVersion(resource);
112114
metaData.setProjectVersion(version);
113-
metaData.setSupportedVersion(String.valueOf(Project.VERSION));
114115

115-
int c1 = VersionComparator.INSTANCE.compare(version, MIN_SUPPORTED_VERSION);
116+
int c1 = VersionComparator.INSTANCE.compare(version, MIN_INTERMEDIATE_SUPPORTED_VERSION);
116117
if (c1 < 0) {
117-
metaData.setIntermediateUpgradeVersion(MIN_SUPPORTED_VERSION);
118118
metaData.setUpgradeType(UpgradeType.INTERMEDIATE_UPGRADE_NEEDED);
119119
return metaData;
120120
}
121121

122-
int c2 = VersionComparator.INSTANCE.compare(String.valueOf(Project.VERSION), version);
123-
if (c2 < 0) {
122+
if (VersionComparator.INSTANCE.compare(version, MIN_SUPPORTED_VERSION) < 0) {
123+
metaData.setUpgradeType(UpgradeType.UPGRADE_NEEDED);
124+
} else if (VersionComparator.INSTANCE.compare(version, MAX_SUPPORTED_VERSION) > 0) {
124125
metaData.setUpgradeType(UpgradeType.DOWNGRADE_NEEDED);
125-
} else if (c2 == 0) {
126-
metaData.setUpgradeType(UpgradeType.UPGRADE_NOT_NEEDED);
127126
} else {
128-
metaData.setUpgradeType(UpgradeType.UPGRADE_NEEDED);
127+
metaData.setUpgradeType(UpgradeType.UPGRADE_NOT_NEEDED);
129128
}
129+
130130
return metaData;
131131
}
132132

133133
protected List<UpgradeHandler> getHandlersForVersion(String version) {
134-
boolean found = MIN_SUPPORTED_VERSION.equals(version);
134+
boolean found = MIN_INTERMEDIATE_SUPPORTED_VERSION.equals(version);
135135
List<UpgradeHandler> handlerList = new ArrayList<>();
136136

137137
for(Map.Entry<String, UpgradeHandler> entry : handlers.entrySet()) {

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

-18
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,6 @@ public class UpgradeMetaData {
2828

2929
protected UpgradeType upgradeType;
3030
protected String projectVersion;
31-
protected String supportedVersion;
32-
protected String intermediateUpgradeVersion;
3331

3432
public UpgradeType getUpgradeType() {
3533
return upgradeType;
@@ -47,20 +45,4 @@ public void setProjectVersion(String projectVersion) {
4745
this.projectVersion = projectVersion;
4846
}
4947

50-
public String getSupportedVersion() {
51-
return supportedVersion;
52-
}
53-
54-
public void setSupportedVersion(String supportedVersion) {
55-
this.supportedVersion = supportedVersion;
56-
}
57-
58-
public String getIntermediateUpgradeVersion() {
59-
return intermediateUpgradeVersion;
60-
}
61-
62-
public void setIntermediateUpgradeVersion(String intermediateUpgradeVersion) {
63-
this.intermediateUpgradeVersion = intermediateUpgradeVersion;
64-
}
65-
6648
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
/*****************************************************************
2+
* Licensed to the Apache Software Foundation (ASF) under one
3+
* or more contributor license agreements. See the NOTICE file
4+
* distributed with this work for additional information
5+
* regarding copyright ownership. The ASF licenses this file
6+
* to you under the Apache License, Version 2.0 (the
7+
* "License"); you may not use this file except in compliance
8+
* with the License. You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing,
13+
* software distributed under the License is distributed on an
14+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+
* KIND, either express or implied. See the License for the
16+
* specific language governing permissions and limitations
17+
* under the License.
18+
****************************************************************/
19+
20+
package org.apache.cayenne.project.upgrade.handlers;
21+
22+
import org.apache.cayenne.configuration.DataChannelDescriptor;
23+
import org.apache.cayenne.project.upgrade.UpgradeUnit;
24+
import org.w3c.dom.Element;
25+
26+
/**
27+
* Upgrade handler for the project version "10" introduced by 4.1.M1 release.
28+
* Changes highlight:
29+
* - strict schema for domain (e.g. main project document)
30+
* - new schema for data map allowing usage of additional elements (e.g. XML extensions)
31+
*
32+
* @since 4.1
33+
*/
34+
public class UpgradeHandler_V11 implements UpgradeHandler {
35+
36+
@Override
37+
public String getVersion() {
38+
return "11";
39+
}
40+
41+
@Override
42+
public void processProjectDom(UpgradeUnit upgradeUnit) {
43+
Element domain = upgradeUnit.getDocument().getDocumentElement();
44+
// introduce xml namespace and schema for domain
45+
domain.setAttribute("xmlns","http://cayenne.apache.org/schema/11/domain");
46+
domain.setAttribute("xmlns:xsi","http://www.w3.org/2001/XMLSchema-instance");
47+
domain.setAttribute("xsi:schemaLocation", "http://cayenne.apache.org/schema/11/domain " +
48+
"https://cayenne.apache.org/schema/11/domain.xsd");
49+
// update version
50+
domain.setAttribute("project-version", getVersion());
51+
}
52+
53+
@Override
54+
public void processDataMapDom(UpgradeUnit upgradeUnit) {
55+
// noop
56+
}
57+
58+
@Override
59+
public void processModel(DataChannelDescriptor dataChannelDescriptor) {
60+
// noop
61+
}
62+
}

cayenne-project/src/test/java/org/apache/cayenne/project/upgrade/DefaultUpgradeServiceTest.java

+7-1
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,16 @@ public void getUpgradeType() throws Exception {
6464
metaData = upgradeService.getUpgradeType(getResourceForVersion("6"));
6565
assertEquals(UpgradeType.UPGRADE_NEEDED, metaData.getUpgradeType());
6666

67+
metaData = upgradeService.getUpgradeType(getResourceForVersion("9"));
68+
assertEquals(UpgradeType.UPGRADE_NEEDED, metaData.getUpgradeType());
69+
6770
metaData = upgradeService.getUpgradeType(getResourceForVersion("10"));
6871
assertEquals(UpgradeType.UPGRADE_NOT_NEEDED, metaData.getUpgradeType());
6972

7073
metaData = upgradeService.getUpgradeType(getResourceForVersion("11"));
74+
assertEquals(UpgradeType.UPGRADE_NOT_NEEDED, metaData.getUpgradeType());
75+
76+
metaData = upgradeService.getUpgradeType(getResourceForVersion("12"));
7177
assertEquals(UpgradeType.DOWNGRADE_NEEDED, metaData.getUpgradeType());
7278
}
7379

@@ -160,4 +166,4 @@ private Resource getResourceForVersion(String version) {
160166
return new URLResource(getClass().getResource("handlers/cayenne-project-v"+version+".xml"));
161167
}
162168

163-
}
169+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<!-- Fake version to test DefaultUpgradeService -->
3+
<domain project-version="12"/>

cayenne-server/src/main/java/org/apache/cayenne/configuration/DataChannelDescriptor.java

+16-4
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@
3131
import java.util.List;
3232
import java.util.Map;
3333

34+
import static org.apache.cayenne.configuration.xml.XMLDataChannelDescriptorLoader.DEFAULT_PROJECT_VERSION;
35+
3436
/**
3537
* A descriptor of a DataChannel normally loaded from XML configuration.
3638
*
@@ -43,8 +45,8 @@ public class DataChannelDescriptor implements ConfigurationNode, Serializable, X
4345
/**
4446
* The namespace in which the data map XML file will be created.
4547
*/
46-
public static final String SCHEMA_XSD = "http://cayenne.apache.org/schema/10/domain";
47-
public static final String SCHEMA_XSD_LOCATION = "https://cayenne.apache.org/schema/10/domain.xsd";
48+
private String schemaXsd;
49+
private String schemaXsdLocation;
4850

4951
protected String name;
5052
protected Map<String, String> properties;
@@ -57,15 +59,16 @@ public DataChannelDescriptor() {
5759
properties = new HashMap<>();
5860
dataMaps = new ArrayList<>(5);
5961
nodeDescriptors = new ArrayList<>(3);
62+
setProjectVersion(DEFAULT_PROJECT_VERSION);
6063
}
6164

6265
@Override
6366
public void encodeAsXML(XMLEncoder encoder, ConfigurationNodeVisitor delegate) {
6467

6568
encoder.start("domain")
66-
.attribute("xmlns", SCHEMA_XSD)
69+
.attribute("xmlns", schemaXsd)
6770
.attribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance", true)
68-
.attribute("xsi:schemaLocation", SCHEMA_XSD + " " + SCHEMA_XSD_LOCATION, true)
71+
.attribute("xsi:schemaLocation", schemaXsd + " " + schemaXsdLocation, true)
6972
.projectVersion();
7073

7174
if (!properties.isEmpty()) {
@@ -158,4 +161,13 @@ public String getDefaultNodeName() {
158161
public void setDefaultNodeName(String defaultDataNodeName) {
159162
this.defaultNodeName = defaultDataNodeName;
160163
}
164+
165+
public String getSchemaXsd() {
166+
return schemaXsd;
167+
}
168+
169+
public void setProjectVersion(String projectVersion) {
170+
this.schemaXsd = "http://cayenne.apache.org/schema/" + projectVersion + "/domain";
171+
this.schemaXsdLocation = "https://cayenne.apache.org/schema/" + projectVersion + "/domain.xsd";
172+
}
161173
}

cayenne-server/src/main/java/org/apache/cayenne/configuration/server/XMLPoolingDataSourceFactory.java

+3-4
Original file line numberDiff line numberDiff line change
@@ -64,15 +64,14 @@ public DataSource getDataSource(DataNodeDescriptor nodeDescriptor) throws Except
6464
throw new ConfigurationException(message);
6565
}
6666

67-
long maxQueueWaitTime = properties.getLong(Constants.JDBC_MAX_QUEUE_WAIT_TIME,
68-
UnmanagedPoolingDataSource.MAX_QUEUE_WAIT_DEFAULT);
69-
7067
Driver driver = objectFactory.newInstance(Driver.class, descriptor.getJdbcDriver());
7168

7269
return DataSourceBuilder.url(descriptor.getDataSourceUrl()).driver(driver).userName(descriptor.getUserName())
7370
.password(descriptor.getPassword())
7471
.pool(descriptor.getMinConnections(), descriptor.getMaxConnections())
75-
.maxQueueWaitTime(maxQueueWaitTime).build();
72+
.maxQueueWaitTime(descriptor.getMaxQueueWaitTime())
73+
.validationQuery(descriptor.getValidationQuery())
74+
.build();
7675
}
7776

7877
}

cayenne-server/src/main/java/org/apache/cayenne/configuration/xml/DataChannelHandler.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,15 @@ final class DataChannelHandler extends VersionAwareHandler {
4141
super(loaderContext, DOMAIN_TAG);
4242
this.xmlDataChannelDescriptorLoader = xmlDataChannelDescriptorLoader;
4343
this.descriptor = dataChannelDescriptor;
44-
setTargetNamespace(DataChannelDescriptor.SCHEMA_XSD);
4544
}
4645

4746
@Override
4847
protected ContentHandler createChildTagHandler(String namespaceURI, String localName,
4948
String name, Attributes attributes) {
5049

50+
descriptor.setProjectVersion(attributes.getValue("project-version"));
51+
setTargetNamespace(descriptor.getSchemaXsd());
52+
5153
if (localName.equals(DOMAIN_TAG)) {
5254
return new DataChannelChildrenHandler(xmlDataChannelDescriptorLoader, this);
5355
}

0 commit comments

Comments
 (0)