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 2018/01/22 14:41:49 UTC

[isis] branch ISIS-1846_internal_utils created (now 44af17e)

This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a change to branch ISIS-1846_internal_utils
in repository https://gitbox.apache.org/repos/asf/isis.git.


      at 44af17e  ISIS-1846 deprecate StringPredicates and StringFunctions, refactoring any references to use the new $String utility class

This branch includes the following new commits:

     new b958267  ISIS-1846 beginning with consolidation of internal utilities
     new c16086d  Merge branch 'master' into ISIS-1846_internal_utils
     new c407760  ISIS-1846 consolidate utilities
     new 3ccfd33  ISIS-1846 deduplicate uses of asNaturalName2 and other
     new 44af17e  ISIS-1846 deprecate StringPredicates and StringFunctions, refactoring any references to use the new $String utility class

The 5 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


-- 
To stop receiving notification emails like this one, please contact
ahuber@apache.org.

[isis] 05/05: ISIS-1846 deprecate StringPredicates and StringFunctions, refactoring any references to use the new $String utility class

Posted by ah...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch ISIS-1846_internal_utils
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 44af17ed727c1c1f66a7328c4b26f9cec1171680
Author: Andi Huber <ah...@apache.org>
AuthorDate: Mon Jan 22 15:38:32 2018 +0100

    ISIS-1846 deprecate StringPredicates and StringFunctions, refactoring
    any references to use the new $String utility class
---
 .../apache/isis/applib/internal/base/$Strings.java | 21 ++++++++++++++++-
 .../isis/core/commons/lang/StringFunctions.java    |  7 +++++-
 .../isis/core/commons/lang/StringPredicates.java   |  7 +++++-
 .../MemberGroupLayoutFacetProperties.java          | 25 +++++++++++----------
 .../core/metamodel/spec/feature/ObjectAction.java  | 26 ++++++++++++++--------
 5 files changed, 62 insertions(+), 24 deletions(-)

diff --git a/core/applib/src/main/java/org/apache/isis/applib/internal/base/$Strings.java b/core/applib/src/main/java/org/apache/isis/applib/internal/base/$Strings.java
index 9b92ff2..990319d 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/internal/base/$Strings.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/internal/base/$Strings.java
@@ -31,6 +31,9 @@ import javax.annotation.Nullable;
  * <p>
  * Provides String related algorithms.
  * <p>
+ * Keep the public methods simple, these are basic building blocks for more complex composites.
+ * Composites are provided as static fields. 
+ * <p>
  * WARNING: Do <b>NOT</b> use any of the classes provided by this package! <br/> 
  * Public access will be removed once we migrate to Java 9+ modules.
  * 
@@ -40,6 +43,10 @@ public final class $Strings {
 
 	private $Strings() {}
 	
+	// -- BASICS
+	
+	public static String[] emptyArray = new String[0];
+	
 	// -- BASIC PREDICATES
 	
 	/**
@@ -75,7 +82,7 @@ public final class $Strings {
 	}
 	
     /**
-     * Converts all of the characters in this String to lower case using the rules of the default locale. 
+     * Converts all of the characters in {@code input} to lower case using the rules of the default locale. 
      * @param input
      * @return null if {@code input} is null
      */
@@ -85,6 +92,18 @@ public final class $Strings {
     	}
         return input.toLowerCase();
     }
+    
+    /**
+     * Converts all of the characters in {@code input} to upper case using the rules of the default locale. 
+     * @param input
+     * @return null if {@code input} is null
+     */
+    public static String upper(@Nullable final String input) {
+    	if(input==null) {
+    		return null;
+    	}
+        return input.toUpperCase();
+    }
 	
 	// -- SPLITTING
 	
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/commons/lang/StringFunctions.java b/core/metamodel/src/main/java/org/apache/isis/core/commons/lang/StringFunctions.java
index 6fde377..644eca2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/commons/lang/StringFunctions.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/commons/lang/StringFunctions.java
@@ -21,7 +21,12 @@ package org.apache.isis.core.commons.lang;
 
 import com.google.common.base.Function;
 
-public final class StringFunctions {
+/**
+ * 
+ * @deprecated [ahuber] use $String::upper and $String::lower instead
+ */
+@Deprecated
+final class StringFunctions {
     
     public static final Function<String,String> TRIM = new Function<String,String>(){
         @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/commons/lang/StringPredicates.java b/core/metamodel/src/main/java/org/apache/isis/core/commons/lang/StringPredicates.java
index 349cf22..ce7a455 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/commons/lang/StringPredicates.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/commons/lang/StringPredicates.java
@@ -21,7 +21,12 @@ package org.apache.isis.core.commons.lang;
 
 import com.google.common.base.Predicate;
 
-public final class StringPredicates {
+/**
+ * 
+ * @deprecated [ahuber] use $String::isNotEmpty instead
+ */
+@Deprecated
+final class StringPredicates {
     
     public static final Predicate<String> NOT_EMPTY = new Predicate<String>() {
         @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/membergroups/annotprop/MemberGroupLayoutFacetProperties.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/membergroups/annotprop/MemberGroupLayoutFacetProperties.java
index 8105410..a2bcd45 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/membergroups/annotprop/MemberGroupLayoutFacetProperties.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/membergroups/annotprop/MemberGroupLayoutFacetProperties.java
@@ -19,14 +19,12 @@
 
 package org.apache.isis.core.metamodel.facets.object.membergroups.annotprop;
 
+import java.util.ArrayList;
 import java.util.Properties;
-
-import com.google.common.base.Splitter;
-import com.google.common.collect.Iterables;
+import java.util.stream.Collectors;
 
 import org.apache.isis.applib.annotation.MemberGroupLayout.ColumnSpans;
-import org.apache.isis.core.commons.lang.StringFunctions;
-import org.apache.isis.core.commons.lang.StringPredicates;
+import org.apache.isis.applib.internal.base.$Strings;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.object.membergroups.MemberGroupLayoutFacetAbstract;
 
@@ -58,13 +56,16 @@ public class MemberGroupLayoutFacetProperties extends MemberGroupLayoutFacetAbst
     static String[] asGroupList(Properties properties, final String key) {
         final String property = properties.getProperty(key);
         if(property == null) {
-            return new String[0];
+            return $Strings.emptyArray;
         }
-        final Iterable<String> split = Splitter.on(',').split(property);
-        return Iterables.toArray(
-                    Iterables.filter(
-                        Iterables.transform(split,StringFunctions.TRIM), 
-                        StringPredicates.NOT_EMPTY), 
-                    String.class);
+
+        return 
+        $Strings.splitThenStream(property, ",")
+        .map($Strings::trim)
+        .filter($Strings::isNotEmpty)
+        .collect(Collectors.toCollection(ArrayList::new)) // array list for fast to-array conversion
+        .toArray($Strings.emptyArray);
+        
+
     }
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAction.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAction.java
index c225cf8..d46fcad 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAction.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAction.java
@@ -20,10 +20,7 @@ package org.apache.isis.core.metamodel.spec.feature;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.List;
-
-import com.google.common.base.Predicate;
-import com.google.common.base.Strings;
-import com.google.common.collect.Lists;
+import java.util.stream.Collectors;
 
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.annotation.ActionLayout;
@@ -31,9 +28,10 @@ import org.apache.isis.applib.annotation.InvokeOn;
 import org.apache.isis.applib.annotation.PromptStyle;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.applib.internal.base.$NullSafe;
+import org.apache.isis.applib.internal.base.$Strings;
 import org.apache.isis.applib.value.Blob;
 import org.apache.isis.applib.value.Clob;
-import org.apache.isis.core.commons.lang.StringFunctions;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.consent.Consent;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
@@ -52,6 +50,10 @@ import org.apache.isis.core.metamodel.layout.memberorderfacet.MemberOrderFacetCo
 import org.apache.isis.core.metamodel.spec.ActionType;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 
+import com.google.common.base.Predicate;
+import com.google.common.base.Strings;
+import com.google.common.collect.Lists;
+
 public interface ObjectAction extends ObjectMember {
 
     //region > getSemantics, getOnType
@@ -477,10 +479,16 @@ public interface ObjectAction extends ObjectMember {
         public static Predicate<ObjectAction> memberOrderNotAssociationOf(final ObjectSpecification adapterSpec) {
 
             final List<ObjectAssociation> associations = adapterSpec.getAssociations(Contributed.INCLUDED);
-            final List<String> associationNames = Lists.transform(associations,
-                    com.google.common.base.Functions.compose(StringFunctions.toLowerCase(), ObjectAssociation.Functions.toName()));
-            final List<String> associationIds = Lists.transform(associations,
-                    com.google.common.base.Functions.compose(StringFunctions.toLowerCase(), ObjectAssociation.Functions.toId()));
+            
+            final List<String> associationNames = $NullSafe.stream(associations)
+            		.map(ObjectAssociation::getName)
+            		.map($Strings::lower)
+            		.collect(Collectors.toList());
+            		
+            final List<String> associationIds = $NullSafe.stream(associations) 
+            		.map(ObjectAssociation::getId)
+            		.map($Strings::lower)
+            		.collect(Collectors.toList());
 
             return new Predicate<ObjectAction>() {
 

-- 
To stop receiving notification emails like this one, please contact
ahuber@apache.org.

[isis] 01/05: ISIS-1846 beginning with consolidation of internal utilities

Posted by ah...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch ISIS-1846_internal_utils
in repository https://gitbox.apache.org/repos/asf/isis.git

commit b958267192ad4f4538ab4b1050bd655365720264
Author: Andi Huber <ah...@apache.org>
AuthorDate: Mon Jan 22 11:20:59 2018 +0100

    ISIS-1846 beginning with consolidation of internal utilities
---
 .../main/java/org/apache/isis/applib/ModuleAbstract.java |  4 ++--
 .../isis/applib/fixturescripts/ExecutionParameters.java  |  6 +++---
 .../isis/applib/fixturescripts/FixtureResultList.java    |  4 ++--
 .../apache/isis/applib/fixturescripts/FixtureScript.java | 16 ++++++++--------
 .../{util/Casts.java => internal/base/$Casts.java}       |  4 ++--
 .../{util/Streams.java => internal/base/$Streams.java}   |  4 ++--
 .../{util/Casts.java => internal/base/$Strings.java}     |  9 ++-------
 .../apache/isis/applib/internal/base/package-info.java   |  7 +++++++
 .../org/apache/isis/applib/internal/package-info.java    |  7 +++++++
 .../apache/isis/applib/services/jaxb/JaxbService.java    | 10 +++++-----
 .../services/queryresultscache/QueryResultsCache.java    |  4 ++--
 .../apache/isis/applib/spec/AbstractSpecification2.java  |  4 ++--
 .../main/java/org/apache/isis/applib/util/JaxbUtil.java  |  4 +++-
 .../org/apache/isis/applib/util/ObjectContracts.java     |  6 ++++--
 .../org/apache/isis/schema/utils/CommonDtoUtils.java     |  9 ++++-----
 .../isis/schema/utils/MemberExecutionDtoUtils.java       |  4 ++--
 16 files changed, 57 insertions(+), 45 deletions(-)

diff --git a/core/applib/src/main/java/org/apache/isis/applib/ModuleAbstract.java b/core/applib/src/main/java/org/apache/isis/applib/ModuleAbstract.java
index 7d96353..889d5ca 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/ModuleAbstract.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/ModuleAbstract.java
@@ -27,7 +27,7 @@ import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlTransient;
 
 import org.apache.isis.applib.fixturescripts.FixtureScript;
-import org.apache.isis.applib.util.Streams;
+import org.apache.isis.applib.internal.base.$Streams;
 
 import com.google.common.collect.Sets;
 
@@ -52,7 +52,7 @@ public abstract class ModuleAbstract
     @XmlElement(name = "module", required = true)
     private Set<ModuleAbstract> getModuleDependencies() {
 
-    	return Streams.stream(getDependencies())
+    	return $Streams.stream(getDependencies())
     	.filter(module->module instanceof ModuleAbstract)
     	.map(module->(ModuleAbstract) module)
     	.collect(Collectors.toSet());
diff --git a/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/ExecutionParameters.java b/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/ExecutionParameters.java
index 8a5fc89..a786957 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/ExecutionParameters.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/ExecutionParameters.java
@@ -30,7 +30,7 @@ import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Maps;
 import com.google.common.io.CharSource;
 
-import org.apache.isis.applib.util.Casts;
+import org.apache.isis.applib.internal.base.$Casts;
 import org.joda.time.DateTime;
 import org.joda.time.LocalDate;
 import org.joda.time.LocalDateTime;
@@ -78,14 +78,14 @@ public class ExecutionParameters {
     }
 
     public <T> T getParameterAsT(final String parameterName, final Class<T> cls) {
-    	return Casts.uncheckedCast(getParameterAsObject(parameterName, cls));
+    	return $Casts.uncheckedCast(getParameterAsObject(parameterName, cls));
     }
     
     protected Object getParameterAsObject(final String parameterName, final Class<?> cls) {
     	final Object value;
         if (Enum.class.isAssignableFrom(cls)) {
             Class<?> enumClass = cls;
-            value = getParameterAsEnum(parameterName, Casts.uncheckedCast(enumClass));
+            value = getParameterAsEnum(parameterName, $Casts.uncheckedCast(enumClass));
         } else if (cls == Boolean.class) {
             value = getParameterAsBoolean(parameterName);
         } else if (cls == Byte.class) {
diff --git a/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureResultList.java b/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureResultList.java
index 3c07687..57b3743 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureResultList.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureResultList.java
@@ -23,7 +23,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.concurrent.atomic.AtomicInteger;
 
-import org.apache.isis.applib.util.Casts;
+import org.apache.isis.applib.internal.base.$Casts;
 
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
@@ -136,7 +136,7 @@ public class FixtureResultList {
         if (!cls.isAssignableFrom(object.getClass())) {
             throw new IllegalStateException(String.format("Fixture result exists and contains object but is of type %s, not %s", object.getClass().getName(), cls.getName()));
         }
-        return Casts.uncheckedCast(object);
+        return $Casts.uncheckedCast(object);
     }
 
     //endregion
diff --git a/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScript.java b/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScript.java
index da8cef9..b81235a 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScript.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScript.java
@@ -42,6 +42,7 @@ import org.apache.isis.applib.annotation.ViewModelLayout;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.fixtures.FixtureType;
 import org.apache.isis.applib.fixtures.InstallableFixture;
+import org.apache.isis.applib.internal.base.$Casts;
 import org.apache.isis.applib.services.factory.FactoryService;
 import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.applib.services.repository.RepositoryService;
@@ -49,7 +50,6 @@ import org.apache.isis.applib.services.sessmgmt.SessionManagementService;
 import org.apache.isis.applib.services.user.UserService;
 import org.apache.isis.applib.services.wrapper.WrapperFactory;
 import org.apache.isis.applib.services.xactn.TransactionService;
-import org.apache.isis.applib.util.Casts;
 
 @ViewModelLayout(named="Script")
 public abstract class FixtureScript 
@@ -628,7 +628,7 @@ public abstract class FixtureScript
                     return childFixtureScript;
                 } else {
                     trace(childFixtureScript, As.SKIP);
-                    return Casts.uncheckedCast(previouslyExecutedScript);
+                    return $Casts.uncheckedCast(previouslyExecutedScript);
                 }
 
             case EXECUTE_ONCE_BY_VALUE:
@@ -676,7 +676,7 @@ public abstract class FixtureScript
                 return childFixtureScript;
             } else {
                 trace(childFixtureScript, As.SKIP);
-                return Casts.uncheckedCast(previouslyExecutedScript);
+                return $Casts.uncheckedCast(previouslyExecutedScript);
             }
         }
 
@@ -772,11 +772,11 @@ public abstract class FixtureScript
         }
         @Programmatic
         public <T> T getUserData(final Class<T> cls) {
-            return Casts.uncheckedCast(userData.get(cls));
+            return $Casts.uncheckedCast(userData.get(cls));
         }
         @Programmatic
         public <T> T clearUserData(final Class<T> cls) {
-            return Casts.uncheckedCast(userData.remove(cls));
+            return $Casts.uncheckedCast(userData.remove(cls));
         }
 
     }
@@ -791,7 +791,7 @@ public abstract class FixtureScript
     }
 
     private <T> T valueFor(final String parameterName, final ExecutionContext ec, final T defaultValue) {
-        final Class<T> cls = Casts.uncheckedCast(defaultValue.getClass());
+        final Class<T> cls = $Casts.uncheckedCast(defaultValue.getClass());
 
         final T value = readParam(parameterName, ec, cls);
         if(value != null) { return (T) value; }
@@ -819,7 +819,7 @@ public abstract class FixtureScript
         Method method;
         try {
             method = this.getClass().getMethod("get" + uppercase(parameterName));
-            value = Casts.uncheckedCast(method.invoke(this));
+            value = $Casts.uncheckedCast(method.invoke(this));
         } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException ignored) {
 
         }
@@ -828,7 +828,7 @@ public abstract class FixtureScript
         if (cls == Boolean.class || cls == boolean.class) {
             try {
                 method = this.getClass().getMethod("is" + uppercase(parameterName));
-                value = Casts.uncheckedCast(method.invoke(this));
+                value = $Casts.uncheckedCast(method.invoke(this));
             } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException ignored) {
 
             }
diff --git a/core/applib/src/main/java/org/apache/isis/applib/util/Casts.java b/core/applib/src/main/java/org/apache/isis/applib/internal/base/$Casts.java
similarity index 93%
copy from core/applib/src/main/java/org/apache/isis/applib/util/Casts.java
copy to core/applib/src/main/java/org/apache/isis/applib/internal/base/$Casts.java
index 94eae10..2f257bd 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/util/Casts.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/internal/base/$Casts.java
@@ -17,9 +17,9 @@
  *  under the License.
  */
 
-package org.apache.isis.applib.util;
+package org.apache.isis.applib.internal.base;
 
-public class Casts {
+public class $Casts {
 
 	@SuppressWarnings("unchecked")
 	public static <T> T uncheckedCast(Object obj) {
diff --git a/core/applib/src/main/java/org/apache/isis/applib/util/Streams.java b/core/applib/src/main/java/org/apache/isis/applib/internal/base/$Streams.java
similarity index 94%
rename from core/applib/src/main/java/org/apache/isis/applib/util/Streams.java
rename to core/applib/src/main/java/org/apache/isis/applib/internal/base/$Streams.java
index 15481f7..e618875 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/util/Streams.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/internal/base/$Streams.java
@@ -17,7 +17,7 @@
  *  under the License.
  */
 
-package org.apache.isis.applib.util;
+package org.apache.isis.applib.internal.base;
 
 import java.util.Collection;
 import java.util.stream.Stream;
@@ -29,7 +29,7 @@ import javax.annotation.Nullable;
  * Stream building utilities.
  *
  */
-public class Streams {
+public class $Streams {
 
 	/**
 	 * If {@code collection} is {@code null} returns the empty stream, 
diff --git a/core/applib/src/main/java/org/apache/isis/applib/util/Casts.java b/core/applib/src/main/java/org/apache/isis/applib/internal/base/$Strings.java
similarity index 83%
rename from core/applib/src/main/java/org/apache/isis/applib/util/Casts.java
rename to core/applib/src/main/java/org/apache/isis/applib/internal/base/$Strings.java
index 94eae10..266b010 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/util/Casts.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/internal/base/$Strings.java
@@ -17,13 +17,8 @@
  *  under the License.
  */
 
-package org.apache.isis.applib.util;
+package org.apache.isis.applib.internal.base;
 
-public class Casts {
+public class $Strings {
 
-	@SuppressWarnings("unchecked")
-	public static <T> T uncheckedCast(Object obj) {
-		return (T) obj;
-	}
-	
 }
diff --git a/core/applib/src/main/java/org/apache/isis/applib/internal/base/package-info.java b/core/applib/src/main/java/org/apache/isis/applib/internal/base/package-info.java
new file mode 100644
index 0000000..f2b7763
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/internal/base/package-info.java
@@ -0,0 +1,7 @@
+/**
+ * Internal classes, not intended as being part of the public API.
+ * 
+ * WARNING: Do NOT use any of the classes provided by this package! <br/> 
+ * Public access will be removed once we migrate to Java 9+ modules.
+ */
+package org.apache.isis.applib.internal.base;
\ No newline at end of file
diff --git a/core/applib/src/main/java/org/apache/isis/applib/internal/package-info.java b/core/applib/src/main/java/org/apache/isis/applib/internal/package-info.java
new file mode 100644
index 0000000..1275ffe
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/internal/package-info.java
@@ -0,0 +1,7 @@
+/**
+ * Internal classes, not intended as being part of the public API.
+ * 
+ * WARNING: Do NOT use any of the classes provided by this package! <br/> 
+ * Public access will be removed once we migrate to Java 9+ modules.
+ */
+package org.apache.isis.applib.internal;
\ No newline at end of file
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/jaxb/JaxbService.java b/core/applib/src/main/java/org/apache/isis/applib/services/jaxb/JaxbService.java
index 566679c..1bf0e6f 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/jaxb/JaxbService.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/jaxb/JaxbService.java
@@ -33,9 +33,9 @@ import org.apache.isis.applib.ApplicationException;
 import org.apache.isis.applib.DomainObjectContainer;
 import org.apache.isis.applib.NonRecoverableException;
 import org.apache.isis.applib.annotation.Programmatic;
+import org.apache.isis.applib.internal.base.$Streams;
+import org.apache.isis.applib.internal.base.$Casts;
 import org.apache.isis.applib.services.dto.Dto_downloadXsd;
-import org.apache.isis.applib.util.Casts;
-import org.apache.isis.applib.util.Streams;
 
 import com.google.common.collect.Maps;
 
@@ -133,7 +133,7 @@ public interface JaxbService {
         public <T> T fromXml(final Class<T> domainClass, final String xml, final Map<String, Object> unmarshallerProperties) {
             try {
                 final JAXBContext context = JAXBContext.newInstance(domainClass);
-                return Casts.uncheckedCast(fromXml(context, xml, unmarshallerProperties));
+                return $Casts.uncheckedCast(fromXml(context, xml, unmarshallerProperties));
 
             } catch (final JAXBException ex) {
                 throw new NonRecoverableException("Error unmarshalling XML to class '" + domainClass.getName() + "'", ex);
@@ -178,10 +178,10 @@ public interface JaxbService {
                     String annotationExceptionMessages = null;
                     try {
                         final Method getErrorsMethod = exClass.getMethod("getErrors");
-                        errors = Casts.uncheckedCast(getErrorsMethod.invoke(ex));
+                        errors = $Casts.uncheckedCast(getErrorsMethod.invoke(ex));
                         
                         annotationExceptionMessages = ": " + 
-                        Streams.stream(errors)
+                        $Streams.stream(errors)
                         .map(Exception::getMessage)
                         .collect(Collectors.joining("; "));
                         
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/queryresultscache/QueryResultsCache.java b/core/applib/src/main/java/org/apache/isis/applib/services/queryresultscache/QueryResultsCache.java
index 91ee4e3..f50c46e 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/queryresultscache/QueryResultsCache.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/queryresultscache/QueryResultsCache.java
@@ -34,8 +34,8 @@ import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.fixturescripts.events.FixturesInstalledEvent;
 import org.apache.isis.applib.fixturescripts.events.FixturesInstallingEvent;
+import org.apache.isis.applib.internal.base.$Casts;
 import org.apache.isis.applib.services.WithTransactionScope;
-import org.apache.isis.applib.util.Casts;
 
 /**
  * This service (API and implementation) provides a mechanism by which idempotent query results can be cached for the duration of an interaction.
@@ -171,7 +171,7 @@ public class QueryResultsCache implements WithTransactionScope {
             final Value<?> cacheValue = cache.get(cacheKey);
             logHitOrMiss(cacheKey, cacheValue);
             if(cacheValue != null) {
-                return Casts.uncheckedCast(cacheValue.getResult());
+                return $Casts.uncheckedCast(cacheValue.getResult());
             }
 
             // cache miss, so get the result...
diff --git a/core/applib/src/main/java/org/apache/isis/applib/spec/AbstractSpecification2.java b/core/applib/src/main/java/org/apache/isis/applib/spec/AbstractSpecification2.java
index ff63a00..412bf4a 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/spec/AbstractSpecification2.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/spec/AbstractSpecification2.java
@@ -21,8 +21,8 @@ package org.apache.isis.applib.spec;
 
 import java.lang.reflect.Method;
 
+import org.apache.isis.applib.internal.base.$Casts;
 import org.apache.isis.applib.services.i18n.TranslatableString;
-import org.apache.isis.applib.util.Casts;
 
 /**
  * Adapter to make it easy to write {@link Specification}s.
@@ -101,7 +101,7 @@ public abstract class AbstractSpecification2<T> implements Specification2 {
                     ? null
                     : TranslatableString.tr("Incorrect type");
         }
-        final T objAsT = Casts.uncheckedCast(obj);
+        final T objAsT = $Casts.uncheckedCast(obj);
         return satisfiesTranslatableSafely(objAsT);
 
     }
diff --git a/core/applib/src/main/java/org/apache/isis/applib/util/JaxbUtil.java b/core/applib/src/main/java/org/apache/isis/applib/util/JaxbUtil.java
index 00a43bc..ebfcf96 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/util/JaxbUtil.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/util/JaxbUtil.java
@@ -29,6 +29,8 @@ import javax.xml.bind.JAXBException;
 import javax.xml.bind.Marshaller;
 import javax.xml.bind.Unmarshaller;
 
+import org.apache.isis.applib.internal.base.$Casts;
+
 import com.google.common.io.Resources;
 
 /**
@@ -49,7 +51,7 @@ public class JaxbUtil {
         Unmarshaller un = null;
         try {
             un = getJaxbContext(dtoClass).createUnmarshaller();
-            return Casts.uncheckedCast(un.unmarshal(reader));
+            return $Casts.uncheckedCast(un.unmarshal(reader));
         } catch (JAXBException e) {
             throw new RuntimeException(e);
         }
diff --git a/core/applib/src/main/java/org/apache/isis/applib/util/ObjectContracts.java b/core/applib/src/main/java/org/apache/isis/applib/util/ObjectContracts.java
index a40236e..2b0b1cb 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/util/ObjectContracts.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/util/ObjectContracts.java
@@ -20,6 +20,8 @@ import java.util.Arrays;
 import java.util.Comparator;
 import java.util.List;
 
+import org.apache.isis.applib.internal.base.$Casts;
+
 import com.google.common.base.Function;
 import com.google.common.base.Objects;
 import com.google.common.base.Objects.ToStringHelper;
@@ -68,8 +70,8 @@ public class ObjectContracts {
         final Iterable<Clause> clauses = clausesFor(propertyNamesIter);
         ComparisonChain chain = ComparisonChain.start();
         for (final Clause clause : clauses) {
-            final Comparable<T> propertyValueOfP = Casts.uncheckedCast(clause.getValueOf(p));
-            final Comparable<T> propertyValueOfQ = Casts.uncheckedCast(clause.getValueOf(q));
+            final Comparable<T> propertyValueOfP = $Casts.uncheckedCast(clause.getValueOf(p));
+            final Comparable<T> propertyValueOfQ = $Casts.uncheckedCast(clause.getValueOf(q));
             chain = chain.compare(propertyValueOfP, propertyValueOfQ, clause.getDirection().getOrdering());
         }
         return chain.result();
diff --git a/core/applib/src/main/java/org/apache/isis/schema/utils/CommonDtoUtils.java b/core/applib/src/main/java/org/apache/isis/schema/utils/CommonDtoUtils.java
index 8fe38c6..2b4f836 100644
--- a/core/applib/src/main/java/org/apache/isis/schema/utils/CommonDtoUtils.java
+++ b/core/applib/src/main/java/org/apache/isis/schema/utils/CommonDtoUtils.java
@@ -30,10 +30,9 @@ import org.joda.time.DateTime;
 import org.joda.time.LocalDate;
 import org.joda.time.LocalDateTime;
 import org.joda.time.LocalTime;
-
+import org.apache.isis.applib.internal.base.$Casts;
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.bookmark.BookmarkService;
-import org.apache.isis.applib.util.Casts;
 import org.apache.isis.schema.cmd.v1.ParamDto;
 import org.apache.isis.schema.common.v1.CollectionDto;
 import org.apache.isis.schema.common.v1.EnumDto;
@@ -278,7 +277,7 @@ public final class CommonDtoUtils {
     public static <T> T getValue(
             final ValueDto valueDto,
             final ValueType valueType) {
-    	return Casts.uncheckedCast(getValueAsObject(valueDto, valueType));
+    	return $Casts.uncheckedCast(getValueAsObject(valueDto, valueType));
     }
     
     private static Object getValueAsObject(
@@ -324,7 +323,7 @@ public final class CommonDtoUtils {
             final String enumType = enumDto.getEnumType();
             @SuppressWarnings("rawtypes") 
             final Class<? extends Enum> enumClass = loadClassElseThrow(enumType);
-            return Enum.valueOf(Casts.uncheckedCast(enumClass), enumDto.getEnumName());
+            return Enum.valueOf($Casts.uncheckedCast(enumClass), enumDto.getEnumName());
         case REFERENCE:
             return valueDto.getReference();
         case VOID:
@@ -339,7 +338,7 @@ public final class CommonDtoUtils {
 
     private static <T> Class<T> loadClassElseThrow(final String className) {
         try {
-            return Casts.uncheckedCast(loadClass(className));
+            return $Casts.uncheckedCast(loadClass(className));
         } catch (ClassNotFoundException e) {
             throw new RuntimeException(e);
         }
diff --git a/core/applib/src/main/java/org/apache/isis/schema/utils/MemberExecutionDtoUtils.java b/core/applib/src/main/java/org/apache/isis/schema/utils/MemberExecutionDtoUtils.java
index 9977b21..11b1cd8 100644
--- a/core/applib/src/main/java/org/apache/isis/schema/utils/MemberExecutionDtoUtils.java
+++ b/core/applib/src/main/java/org/apache/isis/schema/utils/MemberExecutionDtoUtils.java
@@ -29,7 +29,7 @@ import javax.xml.bind.Unmarshaller;
 import javax.xml.namespace.QName;
 import javax.xml.transform.stream.StreamSource;
 
-import org.apache.isis.applib.util.Casts;
+import org.apache.isis.applib.internal.base.$Casts;
 import org.apache.isis.schema.common.v1.DifferenceDto;
 import org.apache.isis.schema.common.v1.PeriodDto;
 import org.apache.isis.schema.ixn.v1.MemberExecutionDto;
@@ -39,7 +39,7 @@ import org.apache.isis.schema.ixn.v1.ObjectCountsDto;
 public final class MemberExecutionDtoUtils {
 
     public static <T extends MemberExecutionDto> T clone(final T dto) {
-        final Class<T> aClass = Casts.uncheckedCast(dto.getClass());
+        final Class<T> aClass = $Casts.uncheckedCast(dto.getClass());
         return clone(dto, aClass);
     }
 

-- 
To stop receiving notification emails like this one, please contact
ahuber@apache.org.

[isis] 03/05: ISIS-1846 consolidate utilities

Posted by ah...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch ISIS-1846_internal_utils
in repository https://gitbox.apache.org/repos/asf/isis.git

commit c4077602032d5a77835b43165826cfc651c4de44
Author: Andi Huber <ah...@apache.org>
AuthorDate: Mon Jan 22 12:29:51 2018 +0100

    ISIS-1846 consolidate utilities
---
 .../org/apache/isis/applib/ModuleAbstract.java     |  4 +-
 .../apache/isis/applib/internal/base/$Casts.java   | 14 +++++-
 .../isis/applib/internal/base/$NullSafe.java}      | 56 ++++++++++++++++------
 .../apache/isis/applib/internal/base/$Streams.java | 44 -----------------
 .../apache/isis/applib/internal/base/$Strings.java | 14 +++++-
 .../isis/applib/services/jaxb/JaxbService.java     |  4 +-
 ...ctionInvocationFacetForDomainEventAbstract.java | 15 +++---
 ...cetInvertedByNullableAnnotationOnParameter.java |  4 +-
 8 files changed, 80 insertions(+), 75 deletions(-)

diff --git a/core/applib/src/main/java/org/apache/isis/applib/ModuleAbstract.java b/core/applib/src/main/java/org/apache/isis/applib/ModuleAbstract.java
index 889d5ca..133ded1 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/ModuleAbstract.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/ModuleAbstract.java
@@ -27,7 +27,7 @@ import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlTransient;
 
 import org.apache.isis.applib.fixturescripts.FixtureScript;
-import org.apache.isis.applib.internal.base.$Streams;
+import org.apache.isis.applib.internal.base.$NullSafe;
 
 import com.google.common.collect.Sets;
 
@@ -52,7 +52,7 @@ public abstract class ModuleAbstract
     @XmlElement(name = "module", required = true)
     private Set<ModuleAbstract> getModuleDependencies() {
 
-    	return $Streams.stream(getDependencies())
+    	return $NullSafe.stream(getDependencies())
     	.filter(module->module instanceof ModuleAbstract)
     	.map(module->(ModuleAbstract) module)
     	.collect(Collectors.toSet());
diff --git a/core/applib/src/main/java/org/apache/isis/applib/internal/base/$Casts.java b/core/applib/src/main/java/org/apache/isis/applib/internal/base/$Casts.java
index 2f257bd..7e9adf8 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/internal/base/$Casts.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/internal/base/$Casts.java
@@ -19,8 +19,20 @@
 
 package org.apache.isis.applib.internal.base;
 
-public class $Casts {
+/**
+ * <h1>- internal use only -</h1>
+ * <p>
+ * Casting Utilities
+ * <p>
+ * WARNING: Do <b>NOT</b> use any of the classes provided by this package! <br/> 
+ * Public access will be removed once we migrate to Java 9+ modules.
+ * 
+ * @since 2.0.0
+ */
+public final class $Casts {
 
+	private $Casts(){}
+	
 	@SuppressWarnings("unchecked")
 	public static <T> T uncheckedCast(Object obj) {
 		return (T) obj;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/commons/lang/NullSafe.java b/core/applib/src/main/java/org/apache/isis/applib/internal/base/$NullSafe.java
similarity index 71%
rename from core/metamodel/src/main/java/org/apache/isis/core/commons/lang/NullSafe.java
rename to core/applib/src/main/java/org/apache/isis/applib/internal/base/$NullSafe.java
index c86063e..dae3354 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/commons/lang/NullSafe.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/internal/base/$NullSafe.java
@@ -16,47 +16,73 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.isis.core.commons.lang;
+package org.apache.isis.applib.internal.base;
 
 import java.util.Collection;
 import java.util.Comparator;
+import java.util.Iterator;
 import java.util.Map;
 import java.util.Objects;
 import java.util.stream.Stream;
+import java.util.stream.StreamSupport;
 
 /**
- * 
- * Provides convenient null check / null safe methods primarily 
+ * <h1>- internal use only -</h1>
+ * <p>
+ *  Provides convenient null check / null safe methods primarily 
  * to shortcut null-check idioms.
+ * <p>
+ * WARNING: Do <b>NOT</b> use any of the classes provided by this package! <br/> 
+ * Public access will be removed once we migrate to Java 9+ modules.
  * 
- * @author ahuber@apache.org
  * @since 2.0.0
  *
  */
-public class NullSafe {
 
-	// -- STREAM CREATION
+public final class $NullSafe {
+	
+	private $NullSafe(){}
 
+	// -- STREAM CREATION
+	
 	/**
-	 * Shortcut for {@code Optional.ofNullable(array).map(Stream::of)}
+	 * If {@code array} is {@code array} returns the empty stream, 
+	 * otherwise returns a stream of the array's elements.
 	 * @param array
-	 * @return a sequential ordered stream whose elements are the elements of 
-	 * the specified {@code array}, or the empty stream if array is {@code null}.
+	 * @return
 	 */
-	public static <T> Stream<T> stream(T[] array) {
+	public static <T> Stream<T> stream(final T[] array) {
 		return array!=null ? Stream.of(array) : Stream.empty();
 	}
 
 	/**
-	 * Shortcut for {@code Optional.ofNullable(coll).map(Stream::of)}
-	 * @param coll
-	 * @return a sequential ordered stream whose elements are the elements of 
-	 * the specified {@code coll}, or the empty stream if coll is {@code null}.
+	 * If {@code collection} is {@code null} returns the empty stream, 
+	 * otherwise returns a stream of the collection's elements.
+	 * @param collection
+	 * @return
 	 */
-	public static <T> Stream<T> stream(Collection<T> coll){
+	public static <T> Stream<T> stream(final Collection<T> coll){
 		return coll!=null ? coll.stream() : Stream.empty();
 	}
 	
+	/**
+	 * If {@code iterator} is {@code null} returns the empty stream, 
+	 * otherwise returns a stream of the iterator's elements.
+	 * @param collection
+	 * @return
+	 */
+	public static <T> Stream<T> stream(final Iterator<T> iterator){
+		return iterator!=null 
+				? StreamSupport.stream(toIterable(iterator).spliterator(), false) //not parallel 
+				: Stream.empty();
+	}
+	
+	// [ahuber] not public, since one time use only!
+	private static <T> Iterable<T> toIterable(final Iterator<T> iterator){
+		return ()->iterator;
+	}
+
+	
 	// -- ABSENCE/PRESENCE PREDICATES
 	
 	/**
diff --git a/core/applib/src/main/java/org/apache/isis/applib/internal/base/$Streams.java b/core/applib/src/main/java/org/apache/isis/applib/internal/base/$Streams.java
deleted file mode 100644
index e618875..0000000
--- a/core/applib/src/main/java/org/apache/isis/applib/internal/base/$Streams.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.applib.internal.base;
-
-import java.util.Collection;
-import java.util.stream.Stream;
-
-import javax.annotation.Nullable;
-
-/**
- * 
- * Stream building utilities.
- *
- */
-public class $Streams {
-
-	/**
-	 * If {@code collection} is {@code null} returns the empty stream, 
-	 * otherwise returns a stream of the collection's elements.
-	 * @param collection
-	 * @return
-	 */
-	public static <T> Stream<T> stream(@Nullable Collection<T> collection) {
-		return collection != null ? collection.stream() : Stream.empty();
-	}
-
-}
diff --git a/core/applib/src/main/java/org/apache/isis/applib/internal/base/$Strings.java b/core/applib/src/main/java/org/apache/isis/applib/internal/base/$Strings.java
index 266b010..87cabc5 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/internal/base/$Strings.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/internal/base/$Strings.java
@@ -19,6 +19,18 @@
 
 package org.apache.isis.applib.internal.base;
 
-public class $Strings {
+/**
+ * <h1>- internal use only -</h1>
+ * <p>
+ * Provides String related algorithms.
+ * <p>
+ * WARNING: Do <b>NOT</b> use any of the classes provided by this package! <br/> 
+ * Public access will be removed once we migrate to Java 9+ modules.
+ * 
+ * @since 2.0.0
+ */
+public final class $Strings {
 
+	private $Strings() {}
+	
 }
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/jaxb/JaxbService.java b/core/applib/src/main/java/org/apache/isis/applib/services/jaxb/JaxbService.java
index 1bf0e6f..651f069 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/jaxb/JaxbService.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/jaxb/JaxbService.java
@@ -33,8 +33,8 @@ import org.apache.isis.applib.ApplicationException;
 import org.apache.isis.applib.DomainObjectContainer;
 import org.apache.isis.applib.NonRecoverableException;
 import org.apache.isis.applib.annotation.Programmatic;
-import org.apache.isis.applib.internal.base.$Streams;
 import org.apache.isis.applib.internal.base.$Casts;
+import org.apache.isis.applib.internal.base.$NullSafe;
 import org.apache.isis.applib.services.dto.Dto_downloadXsd;
 
 import com.google.common.collect.Maps;
@@ -181,7 +181,7 @@ public interface JaxbService {
                         errors = $Casts.uncheckedCast(getErrorsMethod.invoke(ex));
                         
                         annotationExceptionMessages = ": " + 
-                        $Streams.stream(errors)
+                        $NullSafe.stream(errors)
                         .map(Exception::getMessage)
                         .collect(Collectors.joining("; "));
                         
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java
index ea24599..f9509aa 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java
@@ -28,14 +28,9 @@ import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.Callable;
 
-import com.google.common.base.Strings;
-import com.google.common.collect.Lists;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import org.apache.isis.applib.NonRecoverableException;
 import org.apache.isis.applib.RecoverableException;
+import org.apache.isis.applib.internal.base.$Casts;
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.bookmark.BookmarkService;
 import org.apache.isis.applib.services.clock.ClockService;
@@ -51,7 +46,6 @@ import org.apache.isis.applib.services.queryresultscache.QueryResultsCache;
 import org.apache.isis.applib.services.repository.RepositoryService;
 import org.apache.isis.applib.services.xactn.TransactionService;
 import org.apache.isis.applib.services.xactn.TransactionState;
-import org.apache.isis.applib.util.Casts;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.commons.authentication.AuthenticationSessionProvider;
 import org.apache.isis.core.commons.config.IsisConfiguration;
@@ -83,6 +77,11 @@ import org.apache.isis.core.metamodel.specloader.ReflectiveActionException;
 import org.apache.isis.core.metamodel.specloader.specimpl.MixedInMember2;
 import org.apache.isis.core.runtime.system.transaction.TransactionalClosure;
 import org.apache.isis.schema.ixn.v1.ActionInvocationDto;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.Lists;
 
 public abstract class ActionInvocationFacetForDomainEventAbstract
         extends ActionInvocationFacetAbstract
@@ -312,7 +311,7 @@ public abstract class ActionInvocationFacetForDomainEventAbstract
 
             // handle any exceptions
             final Interaction.Execution<ActionInvocationDto, ?> priorExecution = 
-            		Casts.uncheckedCast(interaction.getPriorExecution());
+            		$Casts.uncheckedCast(interaction.getPriorExecution());
 
             final Exception executionExceptionIfAny = priorExecution.getThrew();
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/mandatory/MandatoryFacetInvertedByNullableAnnotationOnParameter.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/mandatory/MandatoryFacetInvertedByNullableAnnotationOnParameter.java
index a493be5..7081870 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/mandatory/MandatoryFacetInvertedByNullableAnnotationOnParameter.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/mandatory/MandatoryFacetInvertedByNullableAnnotationOnParameter.java
@@ -23,7 +23,7 @@ import java.util.List;
 
 import javax.annotation.Nullable;
 
-import org.apache.isis.core.commons.lang.NullSafe;
+import org.apache.isis.applib.internal.base.$NullSafe;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.FacetedMethodParameter;
 import org.apache.isis.core.metamodel.facets.objectvalue.mandatory.MandatoryFacet;
@@ -39,7 +39,7 @@ import org.apache.isis.core.metamodel.facets.objectvalue.mandatory.MandatoryFace
 public class MandatoryFacetInvertedByNullableAnnotationOnParameter extends MandatoryFacetAbstract {
 
     public static MandatoryFacet create(final List<Nullable> annotation, final Class<?> parameterType, final FacetedMethodParameter holder) {
-        if(NullSafe.isEmpty(annotation)) {
+        if($NullSafe.isEmpty(annotation)) {
             return null;
         }
         if(parameterType.isPrimitive()) {

-- 
To stop receiving notification emails like this one, please contact
ahuber@apache.org.

[isis] 02/05: Merge branch 'master' into ISIS-1846_internal_utils

Posted by ah...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch ISIS-1846_internal_utils
in repository https://gitbox.apache.org/repos/asf/isis.git

commit c16086def721508ffb4db005772b3e988e29f04a
Merge: b958267 de41037
Author: Andi Huber <ah...@apache.org>
AuthorDate: Mon Jan 22 12:01:02 2018 +0100

    Merge branch 'master' into ISIS-1846_internal_utils

 .../invocation/ActionInvocationFacetForDomainEventAbstract.java       | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

-- 
To stop receiving notification emails like this one, please contact
ahuber@apache.org.

[isis] 04/05: ISIS-1846 deduplicate uses of asNaturalName2 and other

Posted by ah...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch ISIS-1846_internal_utils
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 3ccfd33e8d185b602d3ae8bd5405aeddd5c38f82
Author: Andi Huber <ah...@apache.org>
AuthorDate: Mon Jan 22 15:08:28 2018 +0100

    ISIS-1846 deduplicate uses of asNaturalName2 and other
---
 .../isis/applib/fixturescripts/FixtureScript.java  |  19 +--
 .../isis/applib/fixturescripts/StringUtil.java     |  79 ------------
 .../apache/isis/applib/internal/base/$Strings.java | 138 +++++++++++++++++++++
 .../isis/applib/internal/base/NaturalNames.java    |  89 +++++++++++++
 .../isis/core/commons/lang/StringExtensions.java   |  62 ++-------
 5 files changed, 245 insertions(+), 142 deletions(-)

diff --git a/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScript.java b/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScript.java
index b81235a..5c26c90 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScript.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScript.java
@@ -27,13 +27,6 @@ import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
-import com.google.common.base.Strings;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-
-import org.joda.time.LocalDate;
-import org.joda.time.LocalDateTime;
-
 import org.apache.isis.applib.AbstractViewModel;
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.annotation.PropertyLayout;
@@ -43,6 +36,7 @@ import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.fixtures.FixtureType;
 import org.apache.isis.applib.fixtures.InstallableFixture;
 import org.apache.isis.applib.internal.base.$Casts;
+import org.apache.isis.applib.internal.base.$Strings;
 import org.apache.isis.applib.services.factory.FactoryService;
 import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.applib.services.repository.RepositoryService;
@@ -50,6 +44,12 @@ import org.apache.isis.applib.services.sessmgmt.SessionManagementService;
 import org.apache.isis.applib.services.user.UserService;
 import org.apache.isis.applib.services.wrapper.WrapperFactory;
 import org.apache.isis.applib.services.xactn.TransactionService;
+import org.joda.time.LocalDate;
+import org.joda.time.LocalDateTime;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
 
 @ViewModelLayout(named="Script")
 public abstract class FixtureScript 
@@ -115,12 +115,13 @@ public abstract class FixtureScript
 
         withTracing(printStream);
     }
+    
     protected String localNameElseDerived(final String str) {
-        return str != null ? str : StringUtil.asLowerDashed(friendlyNameElseDerived(str));
+        return str != null ? str : $Strings.asLowerDashed.apply(friendlyNameElseDerived(str));
     }
 
     protected String friendlyNameElseDerived(final String str) {
-        return str != null ? str : StringUtil.asNaturalName2(getClass().getSimpleName());
+        return str != null ? str : $Strings.asNaturalName2.apply(getClass().getSimpleName());
     }
 
     //endregion
diff --git a/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/StringUtil.java b/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/StringUtil.java
deleted file mode 100644
index dacebd0..0000000
--- a/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/StringUtil.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.isis.applib.fixturescripts;
-
-
-/**
- * Copied in from Isis' own <tt>StringExtensions</tt> class.
- */
-final class StringUtil {
-
-    private StringUtil(){}
-    
-    static final char SPACE = ' ';
-
-    /**
-     * Returns a word spaced version of the specified name, so there are spaces
-     * between the words, where each word starts with a capital letter. E.g.,
-     * "NextAvailableDate" is returned as "Next Available Date".
-     */
-    static String asNaturalName2(final String name) {
-    
-        final int length = name.length();
-    
-        if (length <= 1) {
-            return name.toUpperCase();// ensure first character is upper case
-        }
-    
-        final StringBuffer naturalName = new StringBuffer(length);
-    
-        char previousCharacter;
-        char character = Character.toUpperCase(name.charAt(0));// ensure first
-                                                               // character is
-                                                               // upper case
-        naturalName.append(character);
-        char nextCharacter = name.charAt(1);
-    
-        for (int pos = 2; pos < length; pos++) {
-            previousCharacter = character;
-            character = nextCharacter;
-            nextCharacter = name.charAt(pos);
-    
-            if (previousCharacter != SPACE) {
-                if (Character.isUpperCase(character) && !Character.isUpperCase(previousCharacter)) {
-                    naturalName.append(SPACE);
-                }
-                if (Character.isUpperCase(character) && Character.isLowerCase(nextCharacter) && Character.isUpperCase(previousCharacter)) {
-                    naturalName.append(SPACE);
-                }
-                if (Character.isDigit(character) && !Character.isDigit(previousCharacter)) {
-                    naturalName.append(SPACE);
-                }
-            }
-            naturalName.append(character);
-        }
-        naturalName.append(nextCharacter);
-        return naturalName.toString();
-    }
-    
-    static String asLowerDashed(String extendee) {
-        return extendee.toLowerCase().replaceAll("\\s+", "-");
-    }
-
-}
diff --git a/core/applib/src/main/java/org/apache/isis/applib/internal/base/$Strings.java b/core/applib/src/main/java/org/apache/isis/applib/internal/base/$Strings.java
index 87cabc5..9b92ff2 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/internal/base/$Strings.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/internal/base/$Strings.java
@@ -19,6 +19,13 @@
 
 package org.apache.isis.applib.internal.base;
 
+import java.util.Objects;
+import java.util.function.UnaryOperator;
+import java.util.regex.Pattern;
+import java.util.stream.Stream;
+
+import javax.annotation.Nullable;
+
 /**
  * <h1>- internal use only -</h1>
  * <p>
@@ -33,4 +40,135 @@ public final class $Strings {
 
 	private $Strings() {}
 	
+	// -- BASIC PREDICATES
+	
+	/**
+	 * 
+	 * @param x
+	 * @return true only if string is of zero length or null. 
+	 */
+	public static boolean isEmpty(final CharSequence x){
+		return x==null || x.length()==0;
+	}
+
+	/**
+	 * 
+	 * @param x
+	 * @return inverse of isEmpty(CharSequence). 
+	 */
+	public static boolean isNotEmpty(final CharSequence x){
+		return x!=null && x.length()!=0;
+	}
+	
+	// -- BASIC UNARY OPERATORS
+	
+	/**
+	 * Trims the input.
+	 * @param input
+	 * @return null if the {@code input} is null
+	 */
+	public static String trim(String input) {
+		if(input==null) {
+			return null;
+		}
+		return input.trim();
+	}
+	
+    /**
+     * Converts all of the characters in this String to lower case using the rules of the default locale. 
+     * @param input
+     * @return null if {@code input} is null
+     */
+    public static String lower(@Nullable final String input) {
+    	if(input==null) {
+    		return null;
+    	}
+        return input.toLowerCase();
+    }
+	
+	// -- SPLITTING
+	
+	/**
+	 * Splits the {@code input} into chunks separated by {@code separator}
+	 * @param input
+	 * @param separator
+	 * @return empty stream if {@code input} is null
+	 * @throws {@link IllegalArgumentException} if {@code separator} is empty
+	 */
+	public static Stream<String> splitThenStream(@Nullable final String input, final String separator) {
+		if(isEmpty(separator))
+			throw new IllegalArgumentException("a non empty separator is required");
+		if(isEmpty(input))
+			return Stream.of();
+		if(!input.contains(separator))
+			return Stream.of(input);
+		
+		return Stream.of(input.split(Pattern.quote(separator)));
+	}
+    
+    // -- REPLACEMENT OPERATORS
+    
+    /**
+     * Condenses any whitespace to the given {@code replacement}
+     * 
+     * @param input
+     * @param replacement
+     * @return null if {@code input} is null
+     */
+    public static String condenseWhitespaces(@Nullable final String input, final String replacement) {
+    	if(input==null) {
+    		return null;
+    	}
+    	Objects.requireNonNull(replacement);
+        return input.replaceAll("\\s+", replacement);
+    }
+    
+    // -- UNARY OPERATOR COMPOSITION
+    
+    /**
+     * Monadic StringOperator that allows composition of unary string operators.
+     */
+    public final static class StringOperator {
+    	
+    	private final UnaryOperator<String> operator;
+    	    	
+		private StringOperator(UnaryOperator<String> operator) {
+			this.operator = operator;
+		}
+
+		public String apply(String input) {
+			return operator.apply(input);
+		}
+		
+		public StringOperator compose(UnaryOperator<String> andThen) {
+			if(operator==null)
+				return new StringOperator(andThen::apply);
+			return new StringOperator(s->andThen.apply(operator.apply(s)));
+		}
+    	
+    }
+    
+    /**
+     * Returns a monadic StringOperator that allows composition of unary string operators
+     * @return
+     */
+    public static StringOperator operator() {
+		return new StringOperator(null);
+    }
+    
+    // -- SPECIAL COMPOSITES 
+    
+    // using naming convention asXxx...
+    
+    public final static StringOperator asLowerDashed = operator()
+        	.compose($Strings::lower)
+        	.compose(s->$Strings.condenseWhitespaces(s, "-"));
+
+ 	public final static StringOperator asNormalized = operator()
+ 			.compose(s->$Strings.condenseWhitespaces(s, " "));
+    
+ 	public final static StringOperator asNaturalName2 = operator()
+ 			.compose(s->NaturalNames.naturalName2(s, true));
+
+    
 }
diff --git a/core/applib/src/main/java/org/apache/isis/applib/internal/base/NaturalNames.java b/core/applib/src/main/java/org/apache/isis/applib/internal/base/NaturalNames.java
new file mode 100644
index 0000000..42f4e1d
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/internal/base/NaturalNames.java
@@ -0,0 +1,89 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.applib.internal.base;
+
+import javax.annotation.Nullable;
+
+class NaturalNames {
+	
+	private static final char SPACE = ' ';
+ 	/**
+      * Returns a word spaced version of the specified name, so there are spaces
+      * between the words, where each word starts with a capital letter. E.g.,
+      * "NextAvailableDate" is returned as "Next Available Date".
+      * <p>
+      * TODO [ahuber] handleNestedClassNames=false was only used by FixtureScript,
+      * can we remove this parameter and always handleNestedClassNames?
+      * 
+ 	 * @param name
+ 	 * @param handleNestedClassNames whether to handle any nested class names, eg 'Foo$Bar'
+ 	 * @return
+ 	 * 
+ 	 */
+     static String naturalName2(@Nullable String name, final boolean handleNestedClassNames) {
+     	
+     	if(name==null)
+     		return null;
+
+     	if(handleNestedClassNames) {
+ 	        // handle any nested class names, eg 'Foo$Bar'
+ 	        final int idx = name.lastIndexOf("$");
+ 	        if(idx != -1) {
+ 	            name = name.substring(idx+1);
+ 	        }
+     	} 
+
+         final int length = name.length();
+     
+         if (length <= 1) {
+             return name.toUpperCase();// ensure first character is upper case
+         }
+     
+         final StringBuilder naturalName = new StringBuilder(length);
+     
+         char previousCharacter;
+         char character = Character.toUpperCase(name.charAt(0));// ensure first
+                                                                // character is
+                                                                // upper case
+         naturalName.append(character);
+         char nextCharacter = name.charAt(1);
+     
+         for (int pos = 2; pos < length; pos++) {
+             previousCharacter = character;
+             character = nextCharacter;
+             nextCharacter = name.charAt(pos);
+     
+             if (previousCharacter != SPACE) {
+                 if (Character.isUpperCase(character) && !Character.isUpperCase(previousCharacter)) {
+                     naturalName.append(SPACE);
+                 }
+                 if (Character.isUpperCase(character) && Character.isLowerCase(nextCharacter) && Character.isUpperCase(previousCharacter)) {
+                     naturalName.append(SPACE);
+                 }
+                 if (Character.isDigit(character) && !Character.isDigit(previousCharacter)) {
+                     naturalName.append(SPACE);
+                 }
+             }
+             naturalName.append(character);
+         }
+         naturalName.append(nextCharacter);
+         return naturalName.toString();
+     }
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/commons/lang/StringExtensions.java b/core/metamodel/src/main/java/org/apache/isis/core/commons/lang/StringExtensions.java
index 0b47f22..949b0c4 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/commons/lang/StringExtensions.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/commons/lang/StringExtensions.java
@@ -24,16 +24,14 @@ import java.util.Collections;
 import java.util.List;
 import java.util.StringTokenizer;
 
-import com.google.common.base.Strings;
-
+import org.apache.isis.applib.internal.base.$Strings;
 import org.apache.isis.applib.util.Enums;
 
+import com.google.common.base.Strings;
+
 public final class StringExtensions {
     
-    static final char SPACE = ' ';
-
-    private StringExtensions() {
-    }
+    private StringExtensions() {}
 
     // ////////////////////////////////////////////////////////////
     // naturalName, naturalize, simpleName, camel, memberIdFor
@@ -45,48 +43,7 @@ public final class StringExtensions {
      * "NextAvailableDate" is returned as "Next Available Date".
      */
     public static String asNaturalName2(String name) {
-
-        // handle any nested class names, eg 'Foo$Bar'
-        final int idx = name.lastIndexOf("$");
-        if(idx != -1) {
-            name = name.substring(idx+1);
-        }
-
-        final int length = name.length();
-    
-        if (length <= 1) {
-            return name.toUpperCase();// ensure first character is upper case
-        }
-    
-        final StringBuilder naturalName = new StringBuilder(length);
-    
-        char previousCharacter;
-        char character = Character.toUpperCase(name.charAt(0));// ensure first
-                                                               // character is
-                                                               // upper case
-        naturalName.append(character);
-        char nextCharacter = name.charAt(1);
-    
-        for (int pos = 2; pos < length; pos++) {
-            previousCharacter = character;
-            character = nextCharacter;
-            nextCharacter = name.charAt(pos);
-    
-            if (previousCharacter != StringExtensions.SPACE) {
-                if (Character.isUpperCase(character) && !Character.isUpperCase(previousCharacter)) {
-                    naturalName.append(StringExtensions.SPACE);
-                }
-                if (Character.isUpperCase(character) && Character.isLowerCase(nextCharacter) && Character.isUpperCase(previousCharacter)) {
-                    naturalName.append(StringExtensions.SPACE);
-                }
-                if (Character.isDigit(character) && !Character.isDigit(previousCharacter)) {
-                    naturalName.append(StringExtensions.SPACE);
-                }
-            }
-            naturalName.append(character);
-        }
-        naturalName.append(nextCharacter);
-        return naturalName.toString();
+    	return $Strings.asNaturalName2.apply(name);
     }
 
     public static String asNaturalName(final String extendee) {
@@ -162,7 +119,7 @@ public final class StringExtensions {
     }
 
     public static String asLowerDashed(String extendee) {
-        return extendee.toLowerCase().replaceAll("\\s+", "-");
+        return $Strings.asLowerDashed.apply(extendee);
     }
 
     public static String asPascal(final String extendee) {
@@ -292,11 +249,8 @@ public final class StringExtensions {
      * @param extendee
      * @return
      */
-    public static String normalized(final String extendee) {
-        if (extendee == null) {
-            return null;
-        }
-        return extendee.replaceAll("\\s+", " ");
+    public static String normalized(@javax.annotation.Nullable final String extendee) {
+    	return $Strings.asNormalized.apply(extendee);
     }
 
     public static String removePrefix(final String extendee, final String prefix) {

-- 
To stop receiving notification emails like this one, please contact
ahuber@apache.org.