/* * Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com * The software in this package is published under the terms of the CPAL v1.0 * license, a copy of which has been included with this distribution in the * LICENSE.txt file. */ package org.mule.runtime.core.util; import java.util.ArrayList; import java.util.List; import java.util.function.Consumer; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.lang.CharUtils; /** * <code>StringUtils</code> contains useful methods for manipulating Strings. */ // @ThreadSafe public class StringUtils extends org.apache.commons.lang.StringUtils { public static final String WHITE_SPACE = " "; public static final String DASH = "-"; /** * Like {@link StringUtils#split(String, String)}, but additionally trims whitespace from the result * tokens. */ public static String[] splitAndTrim(String string, String delim) { if (string == null) { return null; } if (StringUtils.isEmpty(string)) { return ArrayUtils.EMPTY_STRING_ARRAY; } String[] rawTokens = StringUtils.split(string, delim); List<String> tokens = new ArrayList<String>(); if (rawTokens != null) { for (int i = 0; i < rawTokens.length; i++) { String token = StringUtils.trim(rawTokens[i]); if (StringUtils.isNotEmpty(token)) { tokens.add(token); } } } return (String[]) ArrayUtils.toArrayOfComponentType(tokens.toArray(), String.class); } /** * Convert a hexadecimal string into its byte representation. * * @param hex The hexadecimal string. * @return The converted bytes or <code>null</code> if the hex String is null. */ public static byte[] hexStringToByteArray(String hex) { if (hex == null) { return null; } int stringLength = hex.length(); if (stringLength % 2 != 0) { throw new IllegalArgumentException("Hex String must have even number of characters!"); } byte[] result = new byte[stringLength / 2]; int j = 0; for (int i = 0; i < result.length; i++) { char hi = Character.toLowerCase(hex.charAt(j++)); char lo = Character.toLowerCase(hex.charAt(j++)); result[i] = (byte) ((Character.digit(hi, 16) << 4) | Character.digit(lo, 16)); } return result; } /** * Like {@link #repeat(String, int)} but with a single character as argument. */ public static String repeat(char c, int len) { return StringUtils.repeat(CharUtils.toString(c), len); } /** * @see #toHexString(byte[]) */ public static String toHexString(byte[] bytes) { return StringUtils.toHexString(bytes, false); } /** * Convert a byte array to a hexadecimal string. * * @param bytes The bytes to format. * @param uppercase When <code>true</code> creates uppercase hex characters instead of lowercase (the default). * @return A hexadecimal representation of the specified bytes. */ public static String toHexString(byte[] bytes, boolean uppercase) { if (bytes == null) { return null; } int numBytes = bytes.length; StringBuilder str = new StringBuilder(numBytes * 2); String table = (uppercase ? HEX_CHARACTERS_UC : HEX_CHARACTERS); for (int i = 0; i < numBytes; i++) { str.append(table.charAt(bytes[i] >>> 4 & 0x0f)); str.append(table.charAt(bytes[i] & 0x0f)); } return str.toString(); } /** * Matches the given value to the given pattern. Then returns the group at matchIndex. * * @param pattern the pattern to use as regexp * @param value the value to evaluate * @param matchIndex the group index to be returned * @return the value of the group at the given index. <code>null</code> if no match found * @throws IllegalArgumentException if pattern or value are null. */ public static String match(Pattern pattern, String value, int matchIndex) throws IllegalArgumentException { if (value == null || pattern == null) { throw new IllegalArgumentException("pattern and value cannot be null"); } Matcher matcher = pattern.matcher(value); if (matcher.find() && (matcher.groupCount() >= matchIndex)) { return matcher.group(matchIndex); } return null; } /** * If {@code value} is not {@link #isBlank(String)}, then it feeds the value * into the {@code consumer} * * @param value a value * @param consumer a String {@link Consumer} */ public static void ifNotBlank(String value, Consumer<String> consumer) { if (!isBlank(value)) { consumer.accept(value); } } // lookup tables needed for toHexString(byte[], boolean) private static final String HEX_CHARACTERS = "0123456789abcdef"; private static final String HEX_CHARACTERS_UC = HEX_CHARACTERS.toUpperCase(); }