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:53 UTC

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

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.