/* * 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.brooklyn.util.text; import static com.google.common.base.Preconditions.checkNotNull; import javax.annotation.Nullable; import com.google.common.base.CaseFormat; import com.google.common.base.CharMatcher; import com.google.common.base.Function; import com.google.common.base.Functions; import com.google.common.base.Preconditions; import com.google.common.collect.Iterables; public class StringFunctions { /** @deprecated since 0.9.0 kept only to allow conversion of anonymous inner classes */ @SuppressWarnings("unused") @Deprecated private static Function<String,String> appendOld(final String suffix) { // TODO PERSISTENCE WORKAROUND return new Function<String, String>() { @Override @Nullable public String apply(@Nullable String input) { if (input==null) return null; return input + suffix; } }; } /** @deprecated since 0.9.0 kept only to allow conversion of anonymous inner classes */ @SuppressWarnings("unused") @Deprecated private static Function<String,String> prependOld(final String prefix) { // TODO PERSISTENCE WORKAROUND return new Function<String, String>() { @Override @Nullable public String apply(@Nullable String input) { if (input==null) return null; return prefix + input; } }; } /** @deprecated since 0.9.0 kept only to allow conversion of anonymous inner classes */ @SuppressWarnings("unused") @Deprecated private static Function<Object, String> formatterOld(final String pattern) { // TODO PERSISTENCE WORKAROUND return new Function<Object, String>() { public String apply(@Nullable Object input) { return String.format(pattern, input); } }; } /** @deprecated since 0.9.0 kept only to allow conversion of anonymous inner classes */ @SuppressWarnings("unused") @Deprecated private static Function<Object[], String> formatterForArrayOld(final String pattern) { // TODO PERSISTENCE WORKAROUND return new Function<Object[], String>() { public String apply(@Nullable Object[] input) { return String.format(pattern, input); } }; } /** @deprecated since 0.9.0 kept only to allow conversion of anonymous inner classes */ @SuppressWarnings("unused") @Deprecated private static Function<Iterable<?>, String> joinerOld(final String separator) { // TODO PERSISTENCE WORKAROUND return new Function<Iterable<?>, String>() { public String apply(@Nullable Iterable<?> input) { return Strings.join(input, separator); } }; } /** @deprecated since 0.9.0 kept only to allow conversion of anonymous inner classes */ @SuppressWarnings("unused") @Deprecated private static Function<Object[], String> joinerForArrayOld(final String separator) { // TODO PERSISTENCE WORKAROUND return new Function<Object[], String>() { public String apply(@Nullable Object[] input) { if (input == null) return Strings.EMPTY; return Strings.join(input, separator); } }; } /** @deprecated since 0.9.0 kept only to allow conversion of anonymous inner classes */ @SuppressWarnings("unused") @Deprecated private static Function<String,Integer> lengthOld() { // TODO PERSISTENCE WORKAROUND return new Function<String,Integer>() { @Override public Integer apply(@Nullable String input) { if (input == null) return -1; return input.length(); } }; } /** @deprecated since 0.9.0 kept only to allow conversion of anonymous inner classes */ @SuppressWarnings("unused") @Deprecated private static Function<String,String> surroundOld(final String prefix, final String suffix) { // TODO PERSISTENCE WORKAROUND return new Function<String,String>() { @Override public String apply(@Nullable String input) { if (input == null) return null; return prefix+input+suffix; } }; } /** @deprecated since 0.9.0 kept only to allow conversion of anonymous inner classes */ @SuppressWarnings("unused") @Deprecated private static Function<String, String> trimOld() { // TODO PERSISTENCE WORKAROUND return new Function<String, String>() { @Override public String apply(@Nullable String input) { if (input == null) return null; if (Strings.isBlank(input)) return Strings.EMPTY; return CharMatcher.BREAKING_WHITESPACE.trimFrom(input); } }; } /** @deprecated since 0.9.0 kept only to allow conversion of anonymous inner classes */ @SuppressWarnings("unused") @Deprecated private static Function<String, String> toLowerCaseOld() { // TODO PERSISTENCE WORKAROUND return new Function<String, String>() { @Override public String apply(String input) { return input.toLowerCase(); } }; } /** @deprecated since 0.9.0 kept only to allow conversion of anonymous inner classes */ @SuppressWarnings("unused") @Deprecated private static Function<String, String> toUpperCaseOld() { // TODO PERSISTENCE WORKAROUND return new Function<String, String>() { @Override public String apply(String input) { return input.toUpperCase(); } }; } /** @deprecated since 0.9.0 kept only to allow conversion of anonymous inner classes */ @SuppressWarnings("unused") @Deprecated private static Function<String, String> convertCaseOld(final CaseFormat src, final CaseFormat target) { // TODO PERSISTENCE WORKAROUND return new Function<String, String>() { @Override public String apply(String input) { return src.to(target, input); } }; } public static Function<String,String> append(final String suffix) { return new AppendFunction(checkNotNull(suffix, "suffix")); } private static class AppendFunction implements Function<String, String> { private final String suffix; public AppendFunction(String suffix) { this.suffix = suffix; } @Override @Nullable public String apply(@Nullable String input) { if (input==null) return null; return input + suffix; } }; public static Function<String,String> prepend(final String prefix) { return new PrependFunction(checkNotNull(prefix, "prefix")); } protected static class PrependFunction implements Function<String, String> { private final String prefix; public PrependFunction(String prefix) { this.prefix = prefix; } @Override @Nullable public String apply(@Nullable String input) { if (input==null) return null; return prefix + input; } } /** given e.g. "hello %s" returns a function which will insert a string into that pattern */ public static Function<Object, String> formatter(final String pattern) { return new FormatterFunction(pattern); } protected static class FormatterFunction implements Function<Object, String> { private final String pattern; FormatterFunction(String pattern) { this.pattern = pattern; } public String apply(@Nullable Object input) { return String.format(pattern, input); } }; /** given e.g. "hello %s %s" returns a function which will insert an array of two strings into that pattern */ public static Function<Object[], String> formatterForArray(final String pattern) { return new FormatterForArrayFunction(checkNotNull(pattern, "pattern")); } protected static class FormatterForArrayFunction implements Function<Object[], String> { private final String pattern; public FormatterForArrayFunction(String pattern) { this.pattern = pattern; } public String apply(@Nullable Object[] input) { return String.format(pattern, input); } } /** * Given e.g. "hello %s %s" returns a function which will insert an Iterable of two strings into that pattern * * @since 0.9.0 */ public static Function<Iterable<?>, String> formatterForIterable(final String pattern) { return new FormatterForIterableFunction(pattern); } protected static class FormatterForIterableFunction implements Function<Iterable<?>, String> { final String pattern; public FormatterForIterableFunction(String pattern) { this.pattern = pattern; } public String apply(@Nullable Iterable<?> input) { Object[] arr = (input == null) ? null : Iterables.toArray(input, Object.class); return String.format(pattern, arr); } } /** joins the given objects in a collection as a toString with the given separator */ public static Function<Iterable<?>, String> joiner(final String separator) { return new JoinerFunction(separator); } private static class JoinerFunction implements Function<Iterable<?>, String> { private final String separator; public JoinerFunction(String separator) { this.separator = separator; } public String apply(@Nullable Iterable<?> input) { return Strings.join(input, separator); } } /** joins the given objects as a toString with the given separator, but expecting an array of objects, not a collection */ public static Function<Object[], String> joinerForArray(final String separator) { return new JoinerForArrayFunction(checkNotNull(separator, "separator")); } private static class JoinerForArrayFunction implements Function<Object[], String> { private final String separator; protected JoinerForArrayFunction(String separator) { this.separator = separator; } public String apply(@Nullable Object[] input) { if (input == null) return Strings.EMPTY; return Strings.join(input, separator); } } /** provided here as a convenience; prefer {@link Functions#toStringFunction()} */ public static Function<Object,String> toStringFunction() { return Functions.toStringFunction(); } /** returns function which gives length of input, with -1 for nulls */ public static Function<String,Integer> length() { return new LengthFunction(); } protected static class LengthFunction implements Function<String,Integer> { @Override public Integer apply(@Nullable String input) { if (input == null) return -1; return input.length(); } } /** Surrounds an input string with the given prefix and suffix */ public static Function<String,String> surround(final String prefix, final String suffix) { Preconditions.checkNotNull(prefix); Preconditions.checkNotNull(suffix); return new SurroundFunction(prefix, suffix); } protected static class SurroundFunction implements Function<String,String> { private final String prefix; private final String suffix; public SurroundFunction(String prefix, String suffix) { this.prefix = prefix; this.suffix = suffix; } @Override public String apply(@Nullable String input) { if (input == null) return null; return prefix+input+suffix; } } public static Function<String, String> trim() { return new TrimFunction(); } protected static class TrimFunction implements Function<String, String> { @Override public String apply(@Nullable String input) { if (input == null) return null; if (Strings.isBlank(input)) return Strings.EMPTY; return CharMatcher.BREAKING_WHITESPACE.trimFrom(input); } } public static Function<String, String> toLowerCase() { return new LowerCaseFunction(); } protected static class LowerCaseFunction implements Function<String, String> { @Override public String apply(String input) { return input.toLowerCase(); } } public static Function<String, String> toUpperCase() { return new UpperCaseFunction(); } protected static class UpperCaseFunction implements Function<String, String> { @Override public String apply(String input) { return input.toUpperCase(); } } public static Function<String, String> convertCase(final CaseFormat src, final CaseFormat target) { return new ConvertCaseFunction(checkNotNull(src, "src"), checkNotNull(target, "target")); } protected static class ConvertCaseFunction implements Function<String, String> { private final CaseFormat src; private final CaseFormat target; public ConvertCaseFunction(CaseFormat src, CaseFormat target) { this.src = src; this.target = target; } @Override public String apply(String input) { return src.to(target, input); } } public static class RegexReplacer implements Function<String, String> { private final String pattern; private final String replacement; public RegexReplacer(String pattern, String replacement) { this.pattern = pattern; this.replacement = replacement; } @Nullable @Override public String apply(@Nullable String s) { return Strings.replaceAllRegex(s, pattern, replacement); } } }