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 <stari...@gmail.com>
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);
                        }

Reply via email to