/* * * Copyright 2013 LinkedIn Corp. All rights reserved * * 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.linkedin.databus.core.util; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.Reader; import java.io.Writer; import java.nio.ByteBuffer; import java.nio.charset.Charset; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.codec.binary.Hex; /** * Miscellaneous string utility functions */ public class StringUtils { private static final Pattern ORA_JDBC_URI_PATTERN = Pattern.compile("(jdbc:oracle:thin:)([^/@]*)(/[^@]*)(@.*)"); private static final Pattern MYSQL_JDBC_PATTERN1 = Pattern.compile("\\((user=|password=)([^)]*)\\)"); private static final Pattern MYSQL_JDBC_PATTERN2 = Pattern.compile("(user=|password=)([^&]*)"); public static final String DEFAULT_ENCODING_NAME = "UTF-8"; public static final Charset DEFAULT_CHARSET = Charset.forName(DEFAULT_ENCODING_NAME); public static String bytesToString(byte[] bytes) { return new String(bytes, DEFAULT_CHARSET); } public static Reader createFileReader(File file) throws FileNotFoundException { return new InputStreamReader(new FileInputStream(file), StringUtils.DEFAULT_CHARSET); } public static Reader createFileReader(String fileName) throws FileNotFoundException { return new InputStreamReader(new FileInputStream(fileName), StringUtils.DEFAULT_CHARSET); } public static Writer createFileWriter(File file) throws FileNotFoundException { return new OutputStreamWriter(new FileOutputStream(file), StringUtils.DEFAULT_CHARSET); } public static Writer createFileWriter(String fileName) throws FileNotFoundException { return new OutputStreamWriter(new FileOutputStream(fileName), StringUtils.DEFAULT_CHARSET); } /** * Dumps as a hex string the contents of a buffer around a position * @param buf the ByteBuffer to dump * @param bufOfs starting offset in the buffer * @param length the number of bytes to print * @return the hexstring */ public static String hexdumpByteBufferContents(ByteBuffer buf, int bufOfs, int length) { if (length < 0) { return ""; } final int endOfs = Math.min(buf.limit(), bufOfs + length + 1); final byte[] bytes = new byte[endOfs - bufOfs]; buf = buf.duplicate(); buf.position(bufOfs); buf.get(bytes); return new String(Hex.encodeHex(bytes)); } /** * Strip username/password information from the JDBC DB uri to be used for logging * @param uri the JDBC URI to sanitize * @return the sanitized DB URI */ public static String sanitizeDbUri(String uri) { String result = uri; Matcher m = ORA_JDBC_URI_PATTERN.matcher(uri); if (m.matches()) { result = m.group(1) + "*/*" + m.group(4); } else if (uri.startsWith("jdbc:mysql:")) { Matcher m1 = MYSQL_JDBC_PATTERN1.matcher(result); Matcher m2 = MYSQL_JDBC_PATTERN2.matcher(result); if (m1.find()) { result = m1.replaceAll("($1*)"); } else if (m2.find()) { result = m2.replaceAll("$1*"); } } return result; } }