org.killbill.commons.utils.Strings Maven / Gradle / Ivy
/*
* Copyright (C) 2021 Apache Software Foundation
* Copyright (C) 2010 The Guava Authors
* Copyright 2020-2022 Equinix, Inc
* Copyright 2014-2022 The Billing Project, LLC
*
* The Billing Project 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.killbill.commons.utils;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import javax.annotation.CheckForNull;
/**
* Verbatim copy to guava's Strings (v.31.0.1). See more
* about this.
*/
public final class Strings {
public static boolean isNullOrEmpty(final String string) {
return string == null || string.isEmpty();
}
/**
* Returns the given string if it is nonempty; {@code null} otherwise.
*
* @param string the string to test and possibly return
* @return {@code string} itself if it is nonempty; {@code null} if it is empty or null
*/
public static String emptyToNull(final String string) {
return isNullOrEmpty(string) ? null : string;
}
/**
* Do what {@link String#split(String)} do, additionally filter empty/blank string and trim it.
* A replacement for Guava's Splitter.on(',').omitEmptyStrings().trimResults();
*/
public static List split(final String string, final String separator) {
if (isNullOrEmpty(string)) {
return Collections.emptyList();
}
return Stream.of(string.split(separator))
.filter(s -> !s.isBlank())
.map(String::trim)
.collect(Collectors.toUnmodifiableList());
}
/**
* Returns the given string if it is non-null; the empty string otherwise.
*
* @param string the string to test and possibly return
* @return {@code string} itself if it is non-null; {@code ""} if it is null
*/
public static String nullToEmpty(@CheckForNull final String string) {
return (string == null) ? "" : string;
}
/**
* Return true if {@code str} contains upper-case.
*/
public static boolean containsUpperCase(final String str) {
if (isNullOrEmpty(str)) {
return false;
}
return !str.equals(str.toLowerCase());
}
/**
* Convert string to camel case, based on {@code delimiter}. Taken from apache common-text
* CaseUtils
*/
public static String toCamelCase(String str, final boolean capitalizeFirstLetter, final char... delimiters) {
if (str == null || str.isBlank()) {
return str;
}
str = str.toLowerCase();
final int strLen = str.length();
final int[] newCodePoints = new int[strLen];
int outOffset = 0;
final Set delimiterSet = toDelimiterSet(delimiters);
boolean capitalizeNext = capitalizeFirstLetter;
for (int index = 0; index < strLen; ) {
final int codePoint = str.codePointAt(index);
if (delimiterSet.contains(codePoint)) {
capitalizeNext = outOffset != 0;
index += Character.charCount(codePoint);
} else if (capitalizeNext || outOffset == 0 && capitalizeFirstLetter) {
final int titleCaseCodePoint = Character.toTitleCase(codePoint);
newCodePoints[outOffset++] = titleCaseCodePoint;
index += Character.charCount(titleCaseCodePoint);
capitalizeNext = false;
} else {
newCodePoints[outOffset++] = codePoint;
index += Character.charCount(codePoint);
}
}
return new String(newCodePoints, 0, outOffset);
}
private static Set toDelimiterSet(final char[] delimiters) {
final Set delimiterHashSet = new HashSet<>();
delimiterHashSet.add(Character.codePointAt(new char[]{' '}, 0));
if (delimiters == null || delimiters.length == 0) {
return delimiterHashSet;
}
for (int index = 0; index < delimiters.length; index++) {
delimiterHashSet.add(Character.codePointAt(delimiters, index));
}
return delimiterHashSet;
}
/**
* Replace string from camel case to snake case, eg: "thisIsASentence" to "this_is_a_sentence".
*/
// https://stackoverflow.com/a/57632022
public static String toSnakeCase(final String str) {
final StringBuilder result = new StringBuilder();
boolean lastUppercase = false;
for (int i = 0; i < str.length(); i++) {
char ch = str.charAt(i);
final char lastEntry = i == 0 ? 'X' : result.charAt(result.length() - 1);
// ch == ' ' || ch == '_' || ch == '-' || ch == '.'
if (ch == '_') {
lastUppercase = false;
if (lastEntry == '_') {
continue;
} else {
ch = '_';
}
} else if (Character.isUpperCase(ch)) {
ch = Character.toLowerCase(ch);
// is start?
if (i > 0) {
if (lastUppercase) {
// test if end of acronym
if (i + 1 < str.length()) {
char next = str.charAt(i + 1);
if (!Character.isUpperCase(next) && Character.isAlphabetic(next)) {
// end of acronym
if (lastEntry != '_') {
result.append('_');
}
} else {
result.append('_');
}
}
} else {
// last was lowercase, insert _
if (lastEntry != '_') {
result.append('_');
}
}
}
lastUppercase = true;
} else {
lastUppercase = false;
}
result.append(ch);
}
return result.toString();
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy