/* * Copyright 2017 ThoughtWorks, Inc. * * Licensed 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 com.thoughtworks.go.util; import org.apache.commons.io.IOUtils; import org.apache.commons.lang.StringUtils; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; public final class StringUtil { private static final int DEFAULT_BUFFER_SIZE = 1024 * 4; private static final String DELIMITER = "_"; private static final String DELIMITER_MATCHER = DELIMITER; private static final String DELIMITER_ESCAPE_SEQ = DELIMITER + DELIMITER; private StringUtil() { } public static String quote(String s) { return "\"" + s + "\""; } public static String quoteJavascriptString(String s) { s = s.replaceAll("\\\\", "\\\\\\\\").replaceAll("\"", "\\\\\""); return quote(s); } public static String stripSpacesAndNewLines(String content) { return content.replaceAll("\\s+", ""); } public static String md5Digest(byte[] bytes) { try { MessageDigest md = MessageDigest.getInstance("MD5"); return Base64.getEncoder().encodeToString(md.digest(bytes)); } catch (NoSuchAlgorithmException nsae) { throw ExceptionUtils.bomb(nsae); } } public static String sha1Digest(byte[] bytes) { try { MessageDigest md = MessageDigest.getInstance("SHA1"); return Base64.getEncoder().encodeToString(md.digest(bytes)); } catch (NoSuchAlgorithmException nsae) { throw ExceptionUtils.bomb(nsae); } } public static String sha1Digest(File file) { InputStream input = null; byte[] buffer = new byte[DEFAULT_BUFFER_SIZE]; try { MessageDigest digest = MessageDigest.getInstance("SHA1"); input = new BufferedInputStream(new FileInputStream(file)); int n; while (-1 != (n = input.read(buffer))) { digest.update(buffer, 0, n); } return Base64.getEncoder().encodeToString(digest.digest()); } catch (Exception nsae) { throw ExceptionUtils.bomb(nsae); } finally { IOUtils.closeQuietly(input); } } public static String stripLineSeparator(String s) { return s.replaceAll("\\n", "").replaceAll("\\r", ""); } public static String matchPattern(String regEx, String s) { Pattern pattern = Pattern.compile(regEx); Matcher matcher = pattern.matcher(s); if (matcher.find()) { return matcher.group(1); } return null; } public static String removeTrailingSlash(String s) { if (s.endsWith("/")) { return s.substring(0, s.length() - 1); } return s; } public static String wrapConfigVariable(String var) { return String.format("${%s}", var); } public static List<String> splitLines(String str) { return str.isEmpty() ? new ArrayList<>() : Arrays.asList(str.split("\n")); } public static String passwordToString(String password) { if (password == null) { return "not-set"; } StringBuilder buffer = new StringBuilder(); for (int i = 0; i < password.length(); i++) { buffer.append('*'); } return buffer.toString(); } public static String shortUUID() { return UUID.randomUUID().toString().substring(0, 8); } public static boolean isInteger(String s) { try { Integer.parseInt(s); return true; } catch (NumberFormatException e) { return false; } } public static String humanize(String s) { String[] strings = StringUtils.splitByCharacterTypeCamelCase(s); for (int i = 0; i < strings.length; i++) { String string = strings[i]; strings[i] = string.toLowerCase(); } return StringUtils.join(strings, " "); } public static boolean isBlank(String string) { return string == null || string.trim().isEmpty(); } public static String nullToBlank(String str) { return (str == null) ? "" : str; } public static String escapeAndJoinStrings(Object... items) { StringBuilder builder = new StringBuilder(); for (int i = 0; i < items.length; i++) { Object item = items[i]; if (item != null) { builder.append(item.toString().replaceAll(DELIMITER_MATCHER, DELIMITER_ESCAPE_SEQ)); } if (i + 1 < items.length) { builder.append(DELIMITER); } } return builder.toString(); } public static String joinForDisplay(final Collection<?> objects) { return ListUtil.join(objects, " | ").trim(); } public static String stripTrailingSlash(String url) { if (isBlank(url)) { return url; } int length = url.length(); return url.charAt(length - 1) == '/' ? url.substring(0, length - 1) : url; } public static Boolean matches(String regEx, String string) { return Pattern.matches(regEx, string); } public static String stripTillLastOccurrenceOf(String input, String pattern) { if (!isBlank(input) && !isBlank(pattern)) { int index = input.lastIndexOf(pattern); if (index > 0) { input = input.substring(index + pattern.length()); } } return input; } public static String unQuote(String string) { return string == null ? null: string.replaceAll("^\"|\"$", ""); } }