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); }