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({