This is an automated email from the ASF dual-hosted git repository.
ntimofeev pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git
The following commit(s) were added to refs/heads/master by this push:
new 69baef29a Add generics to the AdhocObjectFactory.getJavaClass() method
69baef29a is described below
commit 69baef29a18ef0ce58d3071d63e0d7a1777ca81e
Author: Nikita Timofeev <[email protected]>
AuthorDate: Wed Feb 28 16:13:44 2024 +0400
Add generics to the AdhocObjectFactory.getJavaClass() method
---
.../configuration/DriverDataSourceFactory.java | 2 +-
.../org/apache/cayenne/di/AdhocObjectFactory.java | 2 +-
.../cayenne/di/spi/DefaultAdhocObjectFactory.java | 103 +++++++++++----------
.../cayenne/access/DataDomainQueryAction.java | 10 +-
.../runtime/PropertyDataSourceFactory.java | 2 +-
.../runtime/XMLPoolingDataSourceFactory.java | 2 +-
.../org/apache/cayenne/graph/ChildDiffLoader.java | 5 +-
7 files changed, 64 insertions(+), 62 deletions(-)
diff --git
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/configuration/DriverDataSourceFactory.java
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/configuration/DriverDataSourceFactory.java
index b892e22cf..0aa59b1f6 100644
---
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/configuration/DriverDataSourceFactory.java
+++
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/configuration/DriverDataSourceFactory.java
@@ -47,7 +47,7 @@ public class DriverDataSourceFactory implements
DataSourceFactory {
throw new IllegalArgumentException("'nodeDescriptor'
contains no datasource descriptor");
}
- Driver driver =
(Driver)objectFactory.getJavaClass(dataSourceDescriptor.getJdbcDriver()).getDeclaredConstructor().newInstance();
+ Driver driver =
objectFactory.<Driver>getJavaClass(dataSourceDescriptor.getJdbcDriver()).getDeclaredConstructor().newInstance();
return new DriverDataSource(driver,
dataSourceDescriptor.getDataSourceUrl(), dataSourceDescriptor.getUserName(),
dataSourceDescriptor.getPassword());
}
diff --git
a/cayenne-di/src/main/java/org/apache/cayenne/di/AdhocObjectFactory.java
b/cayenne-di/src/main/java/org/apache/cayenne/di/AdhocObjectFactory.java
index c5705b96c..b3f406bd6 100644
--- a/cayenne-di/src/main/java/org/apache/cayenne/di/AdhocObjectFactory.java
+++ b/cayenne-di/src/main/java/org/apache/cayenne/di/AdhocObjectFactory.java
@@ -38,5 +38,5 @@ public interface AdhocObjectFactory {
*
* @since 4.0
*/
- Class<?> getJavaClass(String className);
+ <T> Class<? extends T> getJavaClass(String className);
}
diff --git
a/cayenne-di/src/main/java/org/apache/cayenne/di/spi/DefaultAdhocObjectFactory.java
b/cayenne-di/src/main/java/org/apache/cayenne/di/spi/DefaultAdhocObjectFactory.java
index d3eb1ee05..c50ea0025 100644
---
a/cayenne-di/src/main/java/org/apache/cayenne/di/spi/DefaultAdhocObjectFactory.java
+++
b/cayenne-di/src/main/java/org/apache/cayenne/di/spi/DefaultAdhocObjectFactory.java
@@ -65,8 +65,8 @@ public class DefaultAdhocObjectFactory implements
AdhocObjectFactory {
T instance;
try {
- Provider<T> provider0 = new ConstructorInjectingProvider<T>(type,
(DefaultInjector) injector);
- Provider<T> provider1 = new FieldInjectingProvider<T>(provider0,
(DefaultInjector) injector);
+ Provider<T> provider0 = new ConstructorInjectingProvider<>(type,
(DefaultInjector) injector);
+ Provider<T> provider1 = new FieldInjectingProvider<>(provider0,
(DefaultInjector) injector);
instance = provider1.get();
} catch (Exception e) {
throw new DIRuntimeException("Error creating instance of class %s
of type %s", e, className,
@@ -76,53 +76,53 @@ public class DefaultAdhocObjectFactory implements
AdhocObjectFactory {
return instance;
}
+ @SuppressWarnings("unchecked")
@Override
public Class<?> getJavaClass(String className) {
-
// is there a better way to get array class from string name?
-
if (className == null) {
throw new NullPointerException("Null class name");
}
ClassLoader classLoader =
classLoaderManager.getClassLoader(className.replace('.', '/'));
- // use custom logic on failure only, assuming primitives and arrays are
- // not that common
+ // use custom logic on failure only, assuming primitives and arrays
are not that common
try {
return Class.forName(className, true, classLoader);
} catch (ClassNotFoundException e) {
if (!className.endsWith("[]")) {
- if ("byte".equals(className)) {
- return Byte.TYPE;
- } else if ("int".equals(className)) {
- return Integer.TYPE;
- } else if ("short".equals(className)) {
- return Short.TYPE;
- } else if ("char".equals(className)) {
- return Character.TYPE;
- } else if ("double".equals(className)) {
- return Double.TYPE;
- } else if ("long".equals(className)) {
- return Long.TYPE;
- } else if ("float".equals(className)) {
- return Float.TYPE;
- } else if ("boolean".equals(className)) {
- return Boolean.TYPE;
- } else if ("void".equals(className)) {
- return Void.TYPE;
- }
- // try inner class often specified with "." instead of $
- else {
- int dot = className.lastIndexOf('.');
- if (dot > 0 && dot + 1 < className.length()) {
- className = className.substring(0, dot) + "$" +
className.substring(dot + 1);
- try {
- return Class.forName(className, true, classLoader);
- } catch (ClassNotFoundException nestedE) {
- // ignore, throw the original exception...
+ switch (className) {
+ case "byte":
+ return Byte.TYPE;
+ case "int":
+ return Integer.TYPE;
+ case "short":
+ return Short.TYPE;
+ case "char":
+ return Character.TYPE;
+ case "double":
+ return Double.TYPE;
+ case "long":
+ return Long.TYPE;
+ case "float":
+ return Float.TYPE;
+ case "boolean":
+ return Boolean.TYPE;
+ case "void":
+ return Void.TYPE;
+
+ // try inner class often specified with "." instead of $
+ default:
+ int dot = className.lastIndexOf('.');
+ if (dot > 0 && dot + 1 < className.length()) {
+ className = className.substring(0, dot) + "$" +
className.substring(dot + 1);
+ try {
+ return Class.forName(className, true,
classLoader);
+ } catch (ClassNotFoundException nestedE) {
+ // ignore, throw the original exception...
+ }
}
- }
+ break;
}
throw new DIRuntimeException("Invalid class: '%s'", e,
className);
@@ -135,22 +135,23 @@ public class DefaultAdhocObjectFactory implements
AdhocObjectFactory {
// TODO: support for multi-dim arrays
className = className.substring(0, className.length() - 2);
- if ("byte".equals(className)) {
- return byte[].class;
- } else if ("int".equals(className)) {
- return int[].class;
- } else if ("long".equals(className)) {
- return long[].class;
- } else if ("short".equals(className)) {
- return short[].class;
- } else if ("char".equals(className)) {
- return char[].class;
- } else if ("double".equals(className)) {
- return double[].class;
- } else if ("float".equals(className)) {
- return float[].class;
- } else if ("boolean".equals(className)) {
- return boolean[].class;
+ switch (className) {
+ case "byte":
+ return byte[].class;
+ case "int":
+ return int[].class;
+ case "long":
+ return long[].class;
+ case "short":
+ return short[].class;
+ case "char":
+ return char[].class;
+ case "double":
+ return double[].class;
+ case "float":
+ return float[].class;
+ case "boolean":
+ return boolean[].class;
}
try {
diff --git
a/cayenne/src/main/java/org/apache/cayenne/access/DataDomainQueryAction.java
b/cayenne/src/main/java/org/apache/cayenne/access/DataDomainQueryAction.java
index e8ec4dd5b..ab86d7108 100644
--- a/cayenne/src/main/java/org/apache/cayenne/access/DataDomainQueryAction.java
+++ b/cayenne/src/main/java/org/apache/cayenne/access/DataDomainQueryAction.java
@@ -808,14 +808,15 @@ class DataDomainQueryAction implements QueryRouter,
OperationObserver {
List<EmbeddableObject> convert(List<DataRow> mainRows) {
EmbeddableResultSegment resultSegment = (EmbeddableResultSegment)
metadata.getResultSetMapping().get(0);
Embeddable embeddable = resultSegment.getEmbeddable();
- Class<?> embeddableClass =
objectFactory.getJavaClass(embeddable.getClassName());
+ Class<? extends EmbeddableObject> embeddableClass =
objectFactory.getJavaClass(embeddable.getClassName());
List<EmbeddableObject> result = new ArrayList<>(mainRows.size());
mainRows.forEach(dataRow -> {
EmbeddableObject eo;
try {
- eo = (EmbeddableObject)
embeddableClass.getDeclaredConstructor().newInstance();
+ eo =
embeddableClass.getDeclaredConstructor().newInstance();
} catch (Exception e) {
- throw new CayenneRuntimeException("Unable to materialize
embeddable '%s'", e, embeddable.getClassName());
+ throw new CayenneRuntimeException("Unable to materialize
embeddable '%s'", e,
+ embeddable.getClassName());
}
dataRow.forEach(eo::writePropertyDirectly);
result.add(eo);
@@ -948,8 +949,7 @@ class DataDomainQueryAction implements QueryRouter,
OperationObserver {
} else if (mapping instanceof EmbeddableResultSegment) {
EmbeddableResultSegment resultSegment =
(EmbeddableResultSegment) mapping;
Embeddable embeddable = resultSegment.getEmbeddable();
- @SuppressWarnings("unchecked")
- Class<? extends EmbeddableObject> embeddableClass =
(Class<? extends EmbeddableObject>) objectFactory
+ Class<? extends EmbeddableObject> embeddableClass =
objectFactory
.getJavaClass(embeddable.getClassName());
try {
Constructor<? extends EmbeddableObject>
declaredConstructor = embeddableClass
diff --git
a/cayenne/src/main/java/org/apache/cayenne/configuration/runtime/PropertyDataSourceFactory.java
b/cayenne/src/main/java/org/apache/cayenne/configuration/runtime/PropertyDataSourceFactory.java
index 6ee46fd8a..81260f04e 100644
---
a/cayenne/src/main/java/org/apache/cayenne/configuration/runtime/PropertyDataSourceFactory.java
+++
b/cayenne/src/main/java/org/apache/cayenne/configuration/runtime/PropertyDataSourceFactory.java
@@ -71,7 +71,7 @@ public class PropertyDataSourceFactory implements
DataSourceFactory {
UnmanagedPoolingDataSource.MAX_QUEUE_WAIT_DEFAULT);
String validationQuery =
properties.get(Constants.JDBC_VALIDATION_QUERY_PROPERTY);
- Driver driver =
(Driver)objectFactory.getJavaClass(driverClass).getDeclaredConstructor().newInstance();
+ Driver driver =
objectFactory.<Driver>getJavaClass(driverClass).getDeclaredConstructor().newInstance();
return
DataSourceBuilder.url(url).driver(driver).userName(username).password(password)
.pool(minConnections,
maxConnections).maxQueueWaitTime(maxQueueWaitTime)
.validationQuery(validationQuery).build();
diff --git
a/cayenne/src/main/java/org/apache/cayenne/configuration/runtime/XMLPoolingDataSourceFactory.java
b/cayenne/src/main/java/org/apache/cayenne/configuration/runtime/XMLPoolingDataSourceFactory.java
index bd89170b8..3616b861e 100644
---
a/cayenne/src/main/java/org/apache/cayenne/configuration/runtime/XMLPoolingDataSourceFactory.java
+++
b/cayenne/src/main/java/org/apache/cayenne/configuration/runtime/XMLPoolingDataSourceFactory.java
@@ -65,7 +65,7 @@ public class XMLPoolingDataSourceFactory implements
DataSourceFactory {
long maxQueueWaitTime = properties
.getLong(Constants.JDBC_MAX_QUEUE_WAIT_TIME,
UnmanagedPoolingDataSource.MAX_QUEUE_WAIT_DEFAULT);
- Driver driver =
(Driver)objectFactory.getJavaClass(descriptor.getJdbcDriver())
+ Driver driver =
objectFactory.<Driver>getJavaClass(descriptor.getJdbcDriver())
.getDeclaredConstructor().newInstance();
return DataSourceBuilder.url(descriptor.getDataSourceUrl())
diff --git
a/cayenne/src/main/java/org/apache/cayenne/graph/ChildDiffLoader.java
b/cayenne/src/main/java/org/apache/cayenne/graph/ChildDiffLoader.java
index f8c7643b7..790b51c99 100644
--- a/cayenne/src/main/java/org/apache/cayenne/graph/ChildDiffLoader.java
+++ b/cayenne/src/main/java/org/apache/cayenne/graph/ChildDiffLoader.java
@@ -96,9 +96,10 @@ public class ChildDiffLoader implements GraphChangeHandler {
}
Persistent persistent;
- Class<?> javaClass =
context.getEntityResolver().getObjectFactory().getJavaClass(entity.getJavaClassName());
+ Class<? extends Persistent> javaClass =
context.getEntityResolver().getObjectFactory()
+
.getJavaClass(entity.getJavaClassName());
try {
- persistent = (Persistent)
javaClass.getDeclaredConstructor().newInstance();
+ persistent =
javaClass.getDeclaredConstructor().newInstance();
} catch (Exception ex) {
throw new CayenneRuntimeException("Error
instantiating object.", ex);
}