This is an automated email from the ASF dual-hosted git repository. ahuber pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/causeway.git
commit b681773376b3fa853fa2b2c724685aa600c04bbf Author: Andi Huber <[email protected]> AuthorDate: Thu May 11 16:09:46 2023 +0200 CAUSEWAY-3404: de-duplicate camel case utils (1) --- .../causeway/commons/internal/base/_Strings.java | 16 +++++- .../commons/internal/base/_Strings_CamelCase.java | 60 ++++++++++++++++++++++ ...NaturalNames.java => _Strings_NaturalName.java} | 2 +- .../commons/internal/base/StringsTest.java | 31 ++++++++--- .../core/metamodel/commons/StringExtensions.java | 43 ---------------- .../core/metamodel/facets/FacetedMethod.java | 8 +-- .../specimpl/_MixedInMemberNamingStrategy.java | 3 +- .../commons/StringUtils_camelLowerFirst.java | 37 ------------- .../commons/StringUtils_toLowerDashed.java | 35 ------------- .../wicket/model/mementos/PageParameterNames.java | 18 +++---- .../wicket/ui/CollectionContentsAsFactory.java | 4 +- .../CollectionPresentationSelectorPanel.java | 4 +- 12 files changed, 116 insertions(+), 145 deletions(-) diff --git a/commons/src/main/java/org/apache/causeway/commons/internal/base/_Strings.java b/commons/src/main/java/org/apache/causeway/commons/internal/base/_Strings.java index a9e0a700aa..ad87ef7d21 100644 --- a/commons/src/main/java/org/apache/causeway/commons/internal/base/_Strings.java +++ b/commons/src/main/java/org/apache/causeway/commons/internal/base/_Strings.java @@ -836,8 +836,22 @@ public final class _Strings { .andThen(s->_Strings.condenseWhitespaces(s, " ")); public static final StringOperator asNaturalName = operator() - .andThen(s->_Strings_NaturalNames.naturalName(s, true)); + .andThen(s->_Strings_NaturalName.naturalName(s, true)); + /** + * Camel case is the practice of writing phrases without spaces or punctuation and with capitalized words. + * The format indicates the first word starting with EITHER case, + * then the following words having an initial uppercase letter. + */ + public static final StringOperator asCamelCase = operator() + .andThen(s->_Strings_CamelCase.camelCase(s, firstToken->firstToken)); + + public static final StringOperator asCamelCaseDecapitalized = operator() + .andThen(s->_Strings_CamelCase.camelCase(s, firstToken->_Strings.decapitalize(firstToken))); + + public static final StringOperator asCamelCaseCapitalized = operator() + .andThen(s->_Strings_CamelCase.camelCase(s, firstToken->_Strings.capitalize(firstToken))); + public static final StringOperator asPascalCase = asCamelCaseCapitalized; // synonym public static final String asFileNameWithExtension(final @NonNull String fileName, final @NonNull String fileExtension) { return suffix(fileName, prefix(fileExtension, ".")); diff --git a/commons/src/main/java/org/apache/causeway/commons/internal/base/_Strings_CamelCase.java b/commons/src/main/java/org/apache/causeway/commons/internal/base/_Strings_CamelCase.java new file mode 100644 index 0000000000..46ccaf5e34 --- /dev/null +++ b/commons/src/main/java/org/apache/causeway/commons/internal/base/_Strings_CamelCase.java @@ -0,0 +1,60 @@ +/* + * 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.causeway.commons.internal.base; + +import java.util.StringTokenizer; +import java.util.function.UnaryOperator; + +import org.springframework.lang.Nullable; + +import lombok.val; +import lombok.experimental.UtilityClass; + +/** + * package private utility for {@link _Strings} + */ +@UtilityClass +class _Strings_CamelCase { + + @Nullable + String camelCase(final @Nullable String input, final UnaryOperator<String> firstTokenMapper) { + + if(input==null) return null; + if(input.length()==0) return input; + + val sb = new StringBuffer(input.length()); + val tokenizer = new StringTokenizer(input); + int tokenCount = 0; + + while (tokenizer.hasMoreTokens()) { + final String token = tokenizer.nextToken(); + ++tokenCount; + + if(tokenCount==1) { + // convert first token/word using firstTokenMapper + sb.append(firstTokenMapper.apply(token)); + } else { + // convert token/word to capitalized + sb.append(token.substring(0, 1).toUpperCase()); + sb.append(token.substring(1)); + } + } + return sb.toString(); + } +} diff --git a/commons/src/main/java/org/apache/causeway/commons/internal/base/_Strings_NaturalNames.java b/commons/src/main/java/org/apache/causeway/commons/internal/base/_Strings_NaturalName.java similarity index 99% rename from commons/src/main/java/org/apache/causeway/commons/internal/base/_Strings_NaturalNames.java rename to commons/src/main/java/org/apache/causeway/commons/internal/base/_Strings_NaturalName.java index 86c1467449..513c6e7d1b 100644 --- a/commons/src/main/java/org/apache/causeway/commons/internal/base/_Strings_NaturalNames.java +++ b/commons/src/main/java/org/apache/causeway/commons/internal/base/_Strings_NaturalName.java @@ -26,7 +26,7 @@ import lombok.experimental.UtilityClass; * package private utility for {@link _Strings} */ @UtilityClass -class _Strings_NaturalNames { +class _Strings_NaturalName { private static final char SPACE = ' '; /** diff --git a/commons/src/test/java/org/apache/causeway/commons/internal/base/StringsTest.java b/commons/src/test/java/org/apache/causeway/commons/internal/base/StringsTest.java index 84777878fd..7763f30a97 100644 --- a/commons/src/test/java/org/apache/causeway/commons/internal/base/StringsTest.java +++ b/commons/src/test/java/org/apache/causeway/commons/internal/base/StringsTest.java @@ -309,14 +309,6 @@ class StringsTest { // -- SPECIAL COMPOSITES - @Test - void asLowerDashed() throws Exception { - assertThat( - _Strings.asLowerDashed - .apply(" 12 aBc"), - is("-12-abc")); - } - @Test void asNormalized() throws Exception { assertThat( @@ -333,4 +325,27 @@ class StringsTest { is("Next Available Date")); } + @Test + void asCamelCaseDecapitalized() { + assertThat(asCamelCaseDecapitalized("An Upper Case"), is("anUpperCase")); + assertThat(asCamelCaseDecapitalized("a Lower Case"), is("aLowerCase")); + assertThat(asCamelCaseDecapitalized("AnUpperCase"), is("anUpperCase")); + assertThat(asCamelCaseDecapitalized("aLowerCase"), is("aLowerCase")); + assertThat(asCamelCaseDecapitalized("a Lower Case"), is("aLowerCase")); + } + private String asCamelCaseDecapitalized(final String string) { + return _Strings.asCamelCaseDecapitalized.apply(string); + } + + @Test + void asLowerDashed() { + assertThat(asLowerDashed(" 12 aBc"), is("-12-abc")); + assertThat(asLowerDashed("An Upper Case"), is("an-upper-case")); + assertThat(asLowerDashed("An Upper Case"), is("an-upper-case")); + assertThat(asLowerDashed("An\nUpper\tCase"), is("an-upper-case")); + } + private String asLowerDashed(final String string) { + return _Strings.asLowerDashed.apply(string); + } + } diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/commons/StringExtensions.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/commons/StringExtensions.java index 5f9e9bc9d4..780bb8edab 100644 --- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/commons/StringExtensions.java +++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/commons/StringExtensions.java @@ -21,7 +21,6 @@ package org.apache.causeway.core.metamodel.commons; import java.util.Arrays; import java.util.Collections; import java.util.List; -import java.util.StringTokenizer; import org.springframework.lang.Nullable; @@ -35,48 +34,6 @@ import lombok.val; public final class StringExtensions { - private StringExtensions() {} - - // //////////////////////////////////////////////////////////// - // naturalName, naturalize, simpleName, camel, memberIdFor - // //////////////////////////////////////////////////////////// - - public static String asCamel(final String extendee) { - final StringBuffer b = new StringBuffer(extendee.length()); - final StringTokenizer t = new StringTokenizer(extendee); - b.append(t.nextToken()); - while (t.hasMoreTokens()) { - final String token = t.nextToken(); - b.append(token.substring(0, 1).toUpperCase()); // replace spaces - // with - // camelCase - b.append(token.substring(1)); - } - return b.toString(); - } - - // TODO: combine with camel - public static String asCamelLowerFirst(final String extendee) { - final StringBuffer b = new StringBuffer(extendee.length()); - final StringTokenizer t = new StringTokenizer(extendee); - b.append(_Strings.decapitalize(t.nextToken())); - while (t.hasMoreTokens()) { - final String token = t.nextToken(); - b.append(token.substring(0, 1).toUpperCase()); // replace spaces - // with camelCase - b.append(token.substring(1).toLowerCase()); - } - return b.toString(); - } - - public static String asLowerDashed(final String extendee) { - return _Strings.asLowerDashed.apply(extendee); - } - - public static String asPascal(final String extendee) { - return _Strings.capitalize(asCamel(extendee)); - } - // //////////////////////////////////////////////////////////// // in, combinePaths, splitOnCommas // //////////////////////////////////////////////////////////// diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/FacetedMethod.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/FacetedMethod.java index 353bcd39dc..680bc0b344 100644 --- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/FacetedMethod.java +++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/FacetedMethod.java @@ -24,11 +24,11 @@ import java.util.List; import org.apache.causeway.applib.Identifier; import org.apache.causeway.applib.id.LogicalType; import org.apache.causeway.commons.collections.Can; +import org.apache.causeway.commons.internal.base._Strings; import org.apache.causeway.commons.internal.collections._Lists; import org.apache.causeway.commons.internal.reflection._MethodFacades; import org.apache.causeway.commons.internal.reflection._MethodFacades.MethodFacade; import org.apache.causeway.core.config.progmodel.ProgrammingModelConstants; -import org.apache.causeway.core.metamodel.commons.StringExtensions; import org.apache.causeway.core.metamodel.context.MetaModelContext; import org.apache.causeway.core.metamodel.facetapi.FacetUtil; import org.apache.causeway.core.metamodel.facetapi.FeatureType; @@ -129,7 +129,7 @@ extends TypedHolderAbstract { final Class<?> declaringType, final String propertyName) { try { - final Method method = declaringType.getMethod("set" + StringExtensions.asPascal(propertyName), String.class); + final Method method = declaringType.getMethod("set" + _Strings.asPascalCase.apply(propertyName), String.class); return FacetedMethod.createForProperty(mmc, declaringType, method); } catch (final SecurityException | NoSuchMethodException e) { throw new RuntimeException(e); @@ -141,7 +141,7 @@ extends TypedHolderAbstract { final Class<?> declaringType, final String propertyName) { try { - final Method method = declaringType.getMethod("get" + StringExtensions.asPascal(propertyName)); + final Method method = declaringType.getMethod("get" + _Strings.asPascalCase.apply(propertyName)); return FacetedMethod.createForProperty(mmc, declaringType, method); } catch (final SecurityException | NoSuchMethodException e) { throw new RuntimeException(e); @@ -156,7 +156,7 @@ extends TypedHolderAbstract { final Class<?> declaringType, final String collectionName) { try { - final Method method = declaringType.getMethod("get" + StringExtensions.asPascal(collectionName)); + final Method method = declaringType.getMethod("get" + _Strings.asPascalCase.apply(collectionName)); return FacetedMethod.createForCollection(mmc, declaringType, method); } catch (final SecurityException | NoSuchMethodException e) { throw new RuntimeException(e); diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/specloader/specimpl/_MixedInMemberNamingStrategy.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/specloader/specimpl/_MixedInMemberNamingStrategy.java index 9016ce306b..74a8392a5e 100644 --- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/specloader/specimpl/_MixedInMemberNamingStrategy.java +++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/specloader/specimpl/_MixedInMemberNamingStrategy.java @@ -21,7 +21,6 @@ package org.apache.causeway.core.metamodel.specloader.specimpl; import java.util.Objects; import org.apache.causeway.commons.internal.base._Strings; -import org.apache.causeway.core.metamodel.commons.StringExtensions; import lombok.NonNull; import lombok.experimental.UtilityClass; @@ -50,7 +49,7 @@ class _MixedInMemberNamingStrategy { } String mixinMemberId(final @NonNull String mixinClassSimpleName) { - return StringExtensions.asCamelLowerFirst(compress(suffix(mixinClassSimpleName))); + return _Strings.asCamelCaseDecapitalized.apply(compress(suffix(mixinClassSimpleName))); } // -- HELPER diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/commons/StringUtils_camelLowerFirst.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/commons/StringUtils_camelLowerFirst.java deleted file mode 100644 index 6de575e221..0000000000 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/commons/StringUtils_camelLowerFirst.java +++ /dev/null @@ -1,37 +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.causeway.core.metamodel.commons; - -import org.junit.jupiter.api.Test; - -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.MatcherAssert.assertThat; - -class StringUtils_camelLowerFirst { - - @Test - void camelLowerFirst() { - assertThat(StringExtensions.asCamelLowerFirst("An Upper Case"), is("anUpperCase")); - assertThat(StringExtensions.asCamelLowerFirst("a Lower Case"), is("aLowerCase")); - assertThat(StringExtensions.asCamelLowerFirst("AnUpperCase"), is("anUpperCase")); - assertThat(StringExtensions.asCamelLowerFirst("aLowerCase"), is("aLowerCase")); - assertThat(StringExtensions.asCamelLowerFirst("a Lower Case"), is("aLowerCase")); - } - -} diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/commons/StringUtils_toLowerDashed.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/commons/StringUtils_toLowerDashed.java deleted file mode 100644 index 14ea0b64b2..0000000000 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/commons/StringUtils_toLowerDashed.java +++ /dev/null @@ -1,35 +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.causeway.core.metamodel.commons; - -import org.junit.jupiter.api.Test; - -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.MatcherAssert.assertThat; - -class StringUtils_toLowerDashed { - - @Test - public void toLowerDashed() { - assertThat(StringExtensions.asLowerDashed("An Upper Case"), is("an-upper-case")); - assertThat(StringExtensions.asLowerDashed("An Upper Case"), is("an-upper-case")); - assertThat(StringExtensions.asLowerDashed("An\nUpper\tCase"), is("an-upper-case")); - } - -} diff --git a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/mementos/PageParameterNames.java b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/mementos/PageParameterNames.java index 96eb053a8a..375316a981 100644 --- a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/mementos/PageParameterNames.java +++ b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/mementos/PageParameterNames.java @@ -24,8 +24,8 @@ import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.util.string.StringValue; import org.apache.causeway.applib.services.bookmark.Bookmark; +import org.apache.causeway.commons.internal.base._Strings; import org.apache.causeway.commons.internal.collections._Lists; -import org.apache.causeway.core.metamodel.commons.StringExtensions; public enum PageParameterNames { @@ -82,35 +82,33 @@ public enum PageParameterNames { ACTION_ARGS; /** - * Returns the {@link #name()} formatted as - * {@link StringExtensions#asCamel(String) camel case}. - * + * Returns the {@link #name()} formatted as <i>Camel Case</i>. * <p> * For example, <tt>ACTION_TYPE</tt> becomes <tt>actionType</tt>. */ @Override public String toString() { - return StringExtensions.toCamelCase(name()); + return _Strings.asCamelCase.apply(name()); } public String getStringFrom(final PageParameters pageParameters) { return getStringFrom(pageParameters, null); } - public String getStringFrom(PageParameters pageParameters, String defaultValue) { + public String getStringFrom(final PageParameters pageParameters, final String defaultValue) { if(pageParameters == null) { return defaultValue; } return pageParameters.get(this.toString()).toString(defaultValue); } - public <T extends Enum<T>> T getEnumFrom(PageParameters pageParameters, Class<T> enumClass) { + public <T extends Enum<T>> T getEnumFrom(final PageParameters pageParameters, final Class<T> enumClass) { String value = getStringFrom(pageParameters); return value != null? Enum.valueOf(enumClass, value): null; } - public List<String> getListFrom(PageParameters pageParameters) { - return _Lists.map(pageParameters.getValues(this.toString()), (StringValue input)->input.toString()); + public List<String> getListFrom(final PageParameters pageParameters) { + return _Lists.map(pageParameters.getValues(this.toString()), (final StringValue input)->input.toString()); } public void addStringTo(final PageParameters pageParameters, final String value) { @@ -124,7 +122,7 @@ public enum PageParameterNames { /** * @param pageParameters */ - public void removeFrom(PageParameters pageParameters) { + public void removeFrom(final PageParameters pageParameters) { pageParameters.remove(this.toString()); } diff --git a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/CollectionContentsAsFactory.java b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/CollectionContentsAsFactory.java index 07d5668df3..14b722cea3 100644 --- a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/CollectionContentsAsFactory.java +++ b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/CollectionContentsAsFactory.java @@ -20,7 +20,7 @@ package org.apache.causeway.viewer.wicket.ui; import org.apache.wicket.model.IModel; -import org.apache.causeway.core.metamodel.commons.StringExtensions; +import org.apache.causeway.commons.internal.base._Strings; /** * <p> @@ -31,7 +31,7 @@ import org.apache.causeway.core.metamodel.commons.StringExtensions; * <p> * If the {@link org.apache.causeway.viewer.wicket.ui.ComponentFactory} doesn't implement this interface or the implementation * of any of its methods return {@code null} then {@link ComponentFactory#getName()} will be used as title and its - * {@link StringExtensions#asLowerDashed(java.lang.String) dashed representation} + * {@link _Strings#asLowerDashed dashed representation} * as CSS class for the optional image. * </p> */ diff --git a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/collection/selector/CollectionPresentationSelectorPanel.java b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/collection/selector/CollectionPresentationSelectorPanel.java index 457c0de0cd..8b1279054c 100644 --- a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/collection/selector/CollectionPresentationSelectorPanel.java +++ b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/collection/selector/CollectionPresentationSelectorPanel.java @@ -28,7 +28,7 @@ import org.apache.wicket.markup.html.link.DownloadLink; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; -import org.apache.causeway.core.metamodel.commons.StringExtensions; +import org.apache.causeway.commons.internal.base._Strings; import org.apache.causeway.core.metamodel.interactions.managed.nonscalar.DataTableModel; import org.apache.causeway.viewer.commons.model.components.UiComponentType; import org.apache.causeway.viewer.wicket.model.hints.CausewaySelectorEvent; @@ -183,7 +183,7 @@ extends PanelAbstract<DataTableModel, EntityCollectionModel> { } if (cssClass == null) { String name = componentFactory.getName(); - cssClass = Model.of(StringExtensions.asLowerDashed(name)); + cssClass = Model.of(_Strings.asLowerDashed.apply(name)); // Small hack: if there is no specific CSS class then we assume that background-image is used // the span.ViewItemLink should have some content to show it // FIX: find a way to do this with CSS (width and height don't seems to help)
