/******************************************************************************* * Copyright © 2012-2015 eBay Software Foundation * This program is dual licensed under the MIT and Apache 2.0 licenses. * Please see LICENSE for more information. *******************************************************************************/ package com.ebay.jetstream.util; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.PrintWriter; import java.io.StringWriter; import java.util.Collection; import java.util.EnumSet; import java.util.Map; import java.util.Map.Entry; /** * @author jvembunarayanan */ public class CommonUtils { public static <T extends Enum<T>> T findEnumIgnoreCase(Class<T> enumClass, String string, T defValue) { for (T value : EnumSet.allOf(enumClass)) if (value.toString().equalsIgnoreCase(string)) return value; return defValue; } public static Class<?> getCallingClass(int callerIndex) { try { return Class.forName(new Throwable().getStackTrace()[callerIndex + 1].getClassName()); } catch (ClassNotFoundException e) { throw runtimeException(e); } } @SuppressWarnings( { "unchecked", "cast" }) public static <T> T getDeepCopy(T object) throws InstantiationException, IllegalAccessException { T newObject = object; if (object instanceof Map) { newObject = (T) object.getClass().newInstance(); for (Entry<Object, Object> entry : ((Map<Object, Object>) object).entrySet()) { ((Map) newObject).put(getDeepCopy(entry.getKey()), getDeepCopy(entry.getValue())); } } else if (object instanceof Collection) { newObject = (T) object.getClass().newInstance(); for (Object item : (Collection<Object>) object) { ((Collection<Object>) newObject).add(getDeepCopy(item)); } } return newObject; } public static Object getObjectFromString(Class<?> propertyType, String propertyValue) throws Exception { if (propertyType.isPrimitive()) { propertyType = typeNameToClass(propertyType.getName()); } // Option A: constructor takes a string Exception exception = null; try { return propertyType.getConstructor(String.class).newInstance(propertyValue); } catch (Exception e) { exception = e; } // Option B: static valueOf takes a string try { return propertyType.getMethod("valueOf", String.class).invoke(null, propertyValue); } catch (NoSuchMethodException e) { exception = e; } throw new IllegalArgumentException(propertyType.getCanonicalName() + " does not seem to support direct conversion from String: " + exception); } public static String getResourceAsString(Class<?> clazz, String name, String newLine) throws IOException { InputStream is = clazz.getResourceAsStream(name); try{ return CommonUtils.getStreamAsString(is, newLine); }finally{ if(is != null) is.close(); } } public static String getStreamAsString(InputStream is, String newLine) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(is)); StringBuilder text = new StringBuilder(); for (String nl; (nl = reader.readLine()) != null;) { text.append(nl); if (newLine != null) text.append(newLine); } return text.toString(); } public static boolean isEmpty(Collection<?> c) { return c == null || c.size() == 0; } public static boolean isEmptyTrimmed(String s) { return s == null || s.trim().length() == 0; } @SuppressWarnings("unchecked") public static <T> T loadClass(Class<T> clazz) throws ClassNotFoundException { return (T) Class.forName(clazz.getName(), true, clazz.getClassLoader()); } public static String redirectPrintStackTraceToString(Throwable cause) { StringWriter stringWriter = new StringWriter(); if (cause != null) cause.printStackTrace(new PrintWriter(stringWriter)); // NOPMD return stringWriter.toString(); } public static RuntimeException runtimeException(Throwable cause) { // Errors are bad news, throw immediately if (cause instanceof Error) throw (Error) cause; return cause instanceof RuntimeException ? (RuntimeException) cause : new RuntimeException(cause); } public static Class<?> typeNameToClass(String typeName) { typeName = typeName.intern(); if (typeName == "boolean") return Boolean.class; if (typeName == "byte") return Byte.class; if (typeName == "char") return Character.class; if (typeName == "short") return Short.class; if (typeName == "int") return Integer.class; if (typeName == "long") return Long.class; if (typeName == "float") return Float.class; if (typeName == "double") return Double.class; if (typeName == "void") return Void.class; return null; } }