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.