You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2020/01/04 10:11:07 UTC
[isis] branch master updated: ISIS-2158: adds optimized
Can.toArray(...) (reduced heap-pollution)
This is an automated email from the ASF dual-hosted git repository.
ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git
The following commit(s) were added to refs/heads/master by this push:
new 0c83b24 ISIS-2158: adds optimized Can.toArray(...) (reduced heap-pollution)
0c83b24 is described below
commit 0c83b24c42c14964b1e3c0903951b1bc8d46ecac
Author: Andi Huber <ah...@apache.org>
AuthorDate: Sat Jan 4 11:11:00 2020 +0100
ISIS-2158: adds optimized Can.toArray(...) (reduced heap-pollution)
---
.../java/org/apache/isis/commons/collections/Can.java | 19 ++++++++++++++++++-
.../apache/isis/commons/collections/Can_Empty.java | 11 ++++++++++-
.../apache/isis/commons/collections/Can_Multiple.java | 9 +++++++++
.../isis/commons/collections/Can_Singleton.java | 11 ++++++++++-
.../org/apache/isis/metamodel/spec/ManagedObject.java | 2 +-
.../jdo/datanucleus5/IsisModuleJdoDataNucleus5.java | 15 ++++++---------
6 files changed, 54 insertions(+), 13 deletions(-)
diff --git a/core/commons/src/main/java/org/apache/isis/commons/collections/Can.java b/core/commons/src/main/java/org/apache/isis/commons/collections/Can.java
index 8e53eda..6c8bf51 100644
--- a/core/commons/src/main/java/org/apache/isis/commons/collections/Can.java
+++ b/core/commons/src/main/java/org/apache/isis/commons/collections/Can.java
@@ -482,7 +482,7 @@ public interface Can<T> extends Iterable<T> {
// -- CONVERSIONS
/**
- * @return an serializable and immutable List, containing the elements of this Can
+ * @return a serializable and immutable List, containing the elements of this Can
*/
List<T> toList();
@@ -497,5 +497,22 @@ public interface Can<T> extends Iterable<T> {
* @return a collection, containing the elements of this Can
*/
<C extends Collection<T>> C toCollection(Supplier<C> collectionFactory);
+
+ /**
+ * @param a the array into which the elements of this Can are to
+ * be stored, if it is big enough; otherwise, a new array of the
+ * same runtime type is allocated for this purpose.
+ * @return a non-null array, containing the elements of this Can
+ */
+ default T[] toArray(T[] a) {
+ return toList().toArray(a);
+ }
+
+ /**
+ * @param elementType the {@code Class} object representing the component
+ * type of the new array
+ * @return a non-null array, containing the elements of this Can
+ */
+ T[] toArray(Class<T> elementType);
}
diff --git a/core/commons/src/main/java/org/apache/isis/commons/collections/Can_Empty.java b/core/commons/src/main/java/org/apache/isis/commons/collections/Can_Empty.java
index 8393cc1..73aea09 100644
--- a/core/commons/src/main/java/org/apache/isis/commons/collections/Can_Empty.java
+++ b/core/commons/src/main/java/org/apache/isis/commons/collections/Can_Empty.java
@@ -18,6 +18,7 @@
*/
package org.apache.isis.commons.collections;
+import java.lang.reflect.Array;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
@@ -26,10 +27,13 @@ import java.util.Optional;
import java.util.function.Supplier;
import java.util.stream.Stream;
+import org.apache.isis.commons.internal.base._Casts;
+
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import lombok.NonNull;
import lombok.Value;
+import lombok.val;
@Value @NoArgsConstructor(access = AccessLevel.PRIVATE)
final class Can_Empty<T> implements Can<T> {
@@ -119,6 +123,11 @@ final class Can_Empty<T> implements Can<T> {
public <C extends Collection<T>> C toCollection(@NonNull Supplier<C> collectionFactory) {
return collectionFactory.get();
}
-
+
+ @Override
+ public T[] toArray(@NonNull Class<T> elementType) {
+ val array = _Casts.<T[]>uncheckedCast(Array.newInstance(elementType, 0));
+ return array;
+ }
}
diff --git a/core/commons/src/main/java/org/apache/isis/commons/collections/Can_Multiple.java b/core/commons/src/main/java/org/apache/isis/commons/collections/Can_Multiple.java
index fb4cb58..783a759 100644
--- a/core/commons/src/main/java/org/apache/isis/commons/collections/Can_Multiple.java
+++ b/core/commons/src/main/java/org/apache/isis/commons/collections/Can_Multiple.java
@@ -18,6 +18,7 @@
*/
package org.apache.isis.commons.collections;
+import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
@@ -28,6 +29,8 @@ import java.util.function.Supplier;
import java.util.stream.Collectors;
import java.util.stream.Stream;
+import org.apache.isis.commons.internal.base._Casts;
+
import lombok.Getter;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
@@ -139,5 +142,11 @@ final class Can_Multiple<T> implements Can<T> {
collection.addAll(elements);
return collection;
}
+
+ @Override
+ public T[] toArray(@NonNull Class<T> elementType) {
+ val array = _Casts.<T[]>uncheckedCast(Array.newInstance(elementType, size()));
+ return elements.toArray(array);
+ }
}
diff --git a/core/commons/src/main/java/org/apache/isis/commons/collections/Can_Singleton.java b/core/commons/src/main/java/org/apache/isis/commons/collections/Can_Singleton.java
index 69cb193..4248bde 100644
--- a/core/commons/src/main/java/org/apache/isis/commons/collections/Can_Singleton.java
+++ b/core/commons/src/main/java/org/apache/isis/commons/collections/Can_Singleton.java
@@ -18,6 +18,7 @@
*/
package org.apache.isis.commons.collections;
+import java.lang.reflect.Array;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
@@ -26,6 +27,8 @@ import java.util.Optional;
import java.util.function.Supplier;
import java.util.stream.Stream;
+import org.apache.isis.commons.internal.base._Casts;
+
import lombok.Getter;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
@@ -130,6 +133,12 @@ final class Can_Singleton<T> implements Can<T> {
return collection;
}
-
+ @Override
+ public T[] toArray(@NonNull Class<T> elementType) {
+ val array = _Casts.<T[]>uncheckedCast(Array.newInstance(elementType, 1));
+ array[0] = element;
+ return array;
+ }
+
}
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/spec/ManagedObject.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/spec/ManagedObject.java
index 64c3eec..75f2344 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/spec/ManagedObject.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/spec/ManagedObject.java
@@ -424,7 +424,7 @@ public interface ManagedObject {
}
public static Object invoke(Method method, ManagedObject adapter, Can<ManagedObject> args) {
- return invoke(method, adapter, args.toList().toArray(new ManagedObject[]{}));
+ return invoke(method, adapter, args.toArray(ManagedObject.class));
}
public static Object invoke(Method method, ManagedObject adapter, ManagedObject arg0Adapter) {
diff --git a/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/IsisModuleJdoDataNucleus5.java b/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/IsisModuleJdoDataNucleus5.java
index 1b25f3d..4bc18fc 100644
--- a/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/IsisModuleJdoDataNucleus5.java
+++ b/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/IsisModuleJdoDataNucleus5.java
@@ -21,28 +21,25 @@ package org.apache.isis.persistence.jdo.datanucleus5;
import java.util.HashMap;
import java.util.Map;
-import org.apache.isis.metamodel.IsisModuleMetamodel;
-import org.apache.isis.persistence.jdo.applib.IsisModuleJdoApplib;
-import org.apache.isis.persistence.jdo.datanucleus5.exceprecog.ExceptionRecognizerCompositeForJdoObjectStore;
-import org.apache.isis.persistence.jdo.datanucleus5.jdosupport.mixins.Persistable_datanucleusVersionLong;
-import org.apache.isis.persistence.jdo.datanucleus5.jdosupport.mixins.Persistable_datanucleusVersionTimestamp;
-import org.apache.isis.persistence.jdo.datanucleus5.jdosupport.mixins.Persistable_downloadJdoMetadata;
-import org.apache.isis.runtime.IsisModuleRuntime;
-import org.apache.isis.schema.IsisModuleSchema;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
+import org.apache.isis.persistence.jdo.applib.IsisModuleJdoApplib;
import org.apache.isis.persistence.jdo.datanucleus5.datanucleus.DataNucleusSettings;
import org.apache.isis.persistence.jdo.datanucleus5.datanucleus.service.JdoPersistenceLifecycleService;
+import org.apache.isis.persistence.jdo.datanucleus5.exceprecog.ExceptionRecognizerCompositeForJdoObjectStore;
import org.apache.isis.persistence.jdo.datanucleus5.jdosupport.IsisJdoSupportDN5;
import org.apache.isis.persistence.jdo.datanucleus5.jdosupport.mixins.Persistable_datanucleusIdLong;
+import org.apache.isis.persistence.jdo.datanucleus5.jdosupport.mixins.Persistable_datanucleusVersionLong;
+import org.apache.isis.persistence.jdo.datanucleus5.jdosupport.mixins.Persistable_datanucleusVersionTimestamp;
+import org.apache.isis.persistence.jdo.datanucleus5.jdosupport.mixins.Persistable_downloadJdoMetadata;
import org.apache.isis.persistence.jdo.datanucleus5.metamodel.JdoProgrammingModelPlugin;
import org.apache.isis.persistence.jdo.datanucleus5.metrics.MetricsServiceDefault;
import org.apache.isis.persistence.jdo.datanucleus5.persistence.IsisPlatformTransactionManagerForJdo;
import org.apache.isis.persistence.jdo.datanucleus5.persistence.PersistenceSessionFactory5;
+import org.apache.isis.runtime.IsisModuleRuntime;
@Configuration
@Import({