作为成长的记忆,也作为不断追求卓越的见证,分享自己工作一年来的优秀代码片段。
思考:两年,三年,甚至更远,进步能有几何???
期望:年年岁岁花相似,岁岁年年码不同~
/** * Comprehensive Assert API, for extensible ,you can use inheritance machanism, * naming your class as Assert2 or AssertUtils and so on. * * <pre> * notice: I strongly recommend the isTrue method,very versatile. * </pre> * * @see com.biz.service.util.ToolKits * @author vongosling */ public abstract class Assert { /** * Assert that an object is <code>null</code> . * * <pre class="code"> * Assert.isNull(value, "The value must be null"); * </pre> * * @param object the object to check * @param message the exception message to use if the assertion fails * @throws IllegalArgumentException if the object is not <code>null</code> */ public static void isNull(Object object, String message) { if (object != null) { throw new IllegalArgumentException(message); } } /** * Assert that an object is <code>null</code> . * * <pre class="code"> * Assert.isNull(value); * </pre> * * @param object the object to check * @throws IllegalArgumentException if the object is not <code>null</code> */ public static void isNull(Object object) { isNull(object, "the argument must be null"); } /** * Assert that an object is not <code>null</code> . * * <pre class="code"> * Assert.notNull(clazz, "The class must not be null"); * </pre> * * @param object the object to check * @param message the exception message to use if the assertion fails * @throws IllegalArgumentException if the object is <code>null</code> */ public static void notNull(Object object, String message) { if (object == null) { throw new IllegalArgumentException(message); } } /** * Assert that an object is not <code>null</code> . * * <pre class="code"> * Assert.notNull(clazz); * </pre> * * @param object the object to check * @throws IllegalArgumentException if the object is <code>null</code> */ public static void notNull(Object object) { notNull(object, "this argument is required; it must not be null"); } /** * Assert that the given String is not empty; that is, it must not be * <code>null</code> and not the empty String. * * <pre class="code"> * Assert.hasLength(name, "Name must not be empty"); * </pre> * * @param text the String to check * @param message the exception message to use if the assertion fails */ public static void hasLength(String text, String message) { if (text == null || "".equals(text.trim())) { throw new IllegalArgumentException(message); } } /** * Assert that the given String is not empty; that is, it must not be * <code>null</code> and not the empty String. * * <pre class="code"> * Assert.hasLength(name); * </pre> * * @param text the String to check */ public static void hasLength(String text) { hasLength(text, "this String argument must have length; it must not be null or empty"); } /** * Assert that a collection has elements; that is, it must not be * <code>null</code> and must have at least one element. * * <pre class="code"> * Assert.notEmpty(collection, "Collection must have elements"); * </pre> * * @param collection the collection to check * @param message the exception message to use if the assertion fails * @throws IllegalArgumentException if the collection is <code>null</code> * or has no elements */ public static <T> void notEmpty(Collection<T> collection, String message) { if (collection == null || collection.isEmpty()) { throw new IllegalArgumentException(message); } } /** * Assert that a collection has elements; that is, it must not be * <code>null</code> and must have at least one element. * * <pre class="code"> * Assert.notEmpty(collection, "Collection must have elements"); * </pre> * * @param collection the collection to check * @throws IllegalArgumentException if the collection is <code>null</code> * or has no elements */ public static <T> void notEmpty(Collection<T> collection) { notEmpty(collection, "this collection must not be empty: it must contain at least 1 element"); } /** * Assert that a map has elements; that is, it must not be <code>null</code> * and must have at least one element. * * <pre class="code"> * Assert.notEmpty(map, "Map must have elements"); * </pre> * * @param map the Map to check * @return whether the given Map is empty * @throws IllegalArgumentException if the map is <code>null</code> or has * no elements */ public static <T, K> void notEmpty(Map<T, K> map, String message) { if (map == null || map.isEmpty()) { throw new IllegalArgumentException(message); } } /** * Assert that a Map has entries; that is, it must not be <code>null</code> * and must have at least one entry. * * <pre class="code"> * Assert.notEmpty(map); * </pre> * * @param map the map to check * @throws IllegalArgumentException if the map is <code>null</code> or has * no entries */ public static <T, K> void notEmpty(Map<T, K> map) { notEmpty(map, "this map must not be empty; it must contain at least one entry"); } /** * Assert that the given String is not empty. * * <pre class="code"> * Assert.notEmpty(name, "Name must not be empty"); * </pre> * * @param text the sting to check * @param message the exception message to use if the assertion fails * @throws IllegalArgumentException if the string is empty. * @see #hasLength */ public static void notEmpty(String text, String message) { hasLength(text, message); } /** * Assert that an array has elements; that is, it must not be * <code>null</code> and must have at least one element. * * <pre class="code"> * Assert.notEmpty(array, "The array must have elements"); * </pre> * * @param array the array to check * @param message the exception message to use if the assertion fails * @throws IllegalArgumentException if the object array is <code>null</code> * or has no elements */ public static void notEmpty(Object[] array, String message) { if (array == null || array.length == 0) { throw new IllegalArgumentException(message); } } /** * Assert that an array has elements; that is, it must not be * <code>null</code> and must have at least one element. * * <pre class="code"> * Assert.notEmpty(array); * </pre> * * @param array the array to check * @throws IllegalArgumentException if the object array is <code>null</code> * or has no elements */ public static void notEmpty(Object[] array) { notEmpty(array, "this array must not be empty: it must contain at least 1 element"); } /** * Assert that an array has no null elements. * * <pre class="code"> * Assert.noNullElements(array, "The array must have non-null elements"); * </pre> * * @param array the array to check * @param message the exception message to use if the assertion fails * @throws IllegalArgumentException if the object array contains a * <code>null</code> element */ public static void noNullElements(Object[] array, String message) { notEmpty(array); for (int i = 0; i < array.length; i++) { if (array[i] == null) { throw new IllegalArgumentException(message); } } } /** * Assert that an array has no null elements. Note: Does not complain if the * array is empty! * * <pre class="code"> * Assert.noNullElements(array); * </pre> * * @param array the array to check * @throws IllegalArgumentException if the object array contains a * <code>null</code> element */ public static void noNullElements(Object[] array) { noNullElements(array, "this array must not contain any null elements"); } /** * Assert that an collection has no null elements. * * <pre class="code"> * Assert.noNullElements(collection, "The collection must have non-null elements"); * </pre> * * @param collection the collection to check * @param message the exception message to use if the assertion fails * @throws IllegalArgumentException if the collection contains a * <code>null</code> element */ public static <T> void noNullElements(Collection<T> collection, String message) { notEmpty(collection); for (Iterator<T> it = collection.iterator(); it.hasNext();) { if (it.next() == null) { throw new IllegalArgumentException(message); } } } /** * Assert that an collection has no null elements. * * <pre class="code"> * Assert.noNullElements(collection); * </pre> * * @param collection the collection to check * @param message the exception message to use if the assertion fails * @throws IllegalArgumentException if the collection contains a * <code>null</code> element */ public static <T> void noNullElements(Collection<T> collection) { notEmpty(collection); int i = 0; for (Iterator<T> it = collection.iterator(); it.hasNext(); i++) { if (it.next() == null) { throw new IllegalArgumentException( "The validated collection contains null element at index: " + i); } } } /** * Assert the less than operation validity. * * <pre class="code"> * Assert.lessThan(number, compareNumber, "number must be less Than compareNumber"); * </pre> * * @param number * @param compareNumber * @param message */ public static void lessThan(Number number, Number compareNumber, String message) { if (number == null || compareNumber == null) { throw new IllegalArgumentException("one of the arguments is null"); } if (number.longValue() > compareNumber.longValue()) { throw new IllegalArgumentException(message); } } /** * Assert the less than operation validity. * * <pre class="code"> * Assert.lessThan(number, compareNumber); * </pre> * * @param number * @param compareNumber * @param message */ public static void lessThan(Number number, Number compareNumber) { if (number == null || compareNumber == null) { throw new IllegalArgumentException("one of the arguments is null"); } if (number.longValue() > compareNumber.longValue()) { throw new IllegalArgumentException("less than operation not satisfied"); } } /** * Assert the more than operation validity. * * <pre class="code"> * Assert.moreThan(number, compareNumber, "number must be more Than compareNumber"); * </pre> * * @param number * @param compareNumber * @param message */ public static void moreThan(Number number, Number compareNumber, String message) { if (number == null || compareNumber == null) { throw new IllegalArgumentException("one of the arguments is null"); } if (number.longValue() < compareNumber.longValue()) { throw new IllegalArgumentException(message); } } /** * Assert the more than operation validity. * * <pre class="code"> * Assert.moreThan(number, compareNumber); * </pre> * * @param number * @param compareNumber * @param message */ public static void moreThan(Number number, Number compareNumber) { if (number == null || compareNumber == null) { throw new IllegalArgumentException("one of the arguments is null"); } if (number.longValue() < compareNumber.longValue()) { throw new IllegalArgumentException("more than operation not satisfied"); } } /** * Assert that the provided object is an instance of the provided class. * * <pre class="code"> * Assert.instanceOf(Foo.class, foo); * </pre> * * @param clazz the required class * @param obj the object to check * @throws IllegalArgumentException if the object is not an instance of * clazz * @see Class#isInstance */ public static <T> void isInstanceOf(Class<T> clazz, Object obj) { isInstanceOf(clazz, obj, ""); } /** * Assert that the provided object is an instance of the provided class. * * <pre class="code"> * Assert.instanceOf(Foo.class, foo, "object must be an instance of class Foo"); * </pre> * * @param type the type to check against * @param obj the object to check * @param message a message which will be prepended to the message produced * by the function itself, and which may be used to provide * context. It should normally end in a ": " or ". " so that the * function generate message looks ok when prepended to it. * @throws IllegalArgumentException if the object is not an instance of * clazz * @see Class#isInstance */ public static <T> void isInstanceOf(Class<T> type, Object obj, String message) { notNull(type, "Type to check must not be null"); if (!type.isInstance(obj)) { throw new IllegalArgumentException(message + "Object of class [" + (obj != null ? obj.getClass().getName() : "null") + "] must be an instance of " + type); } } /** * Assert that <code>superType.isAssignableFrom(subType)</code> is * <code>true</code>. * * <pre class="code"> * Assert.isAssignable(Number.class, myClass); * </pre> * * @param superType the super type to check * @param subType the sub type to check * @throws IllegalArgumentException if the classes are not assignable */ public static <T, P> void isAssignable(Class<T> superType, Class<P> subType) { isAssignable(superType, subType, ""); } /** * Assert that <code>superType.isAssignableFrom(subType)</code> is * <code>true</code>. * * <pre class="code"> * Assert.isAssignable(Number.class, myClass, "subType must be assignable to superType"); * </pre> * * @param superType the super type to check against * @param subType the sub type to check * @param message a message which will be prepended to the message produced * by the function itself, and which may be used to provide * context. It should normally end in a ": " or ". " so that the * function generate message looks ok when prepended to it. * @throws IllegalArgumentException if the classes are not assignable */ public static <T, P> void isAssignable(Class<T> superType, Class<P> subType, String message) { notNull(superType, "Type to check against must not be null"); if (subType == null || !superType.isAssignableFrom(subType)) { throw new IllegalArgumentException(message + subType + " is not assignable to " + superType); } } /** * Assert a boolean expression, throwing * <code>IllegalArgumentException</code> if the test result is * <code>false</code>. * * <pre class="code"> * Assert.isTrue(i > 0, "The value must be greater than zero"); * </pre> * * @param expression a boolean expression * @param message the exception message to use if the assertion fails * @throws IllegalArgumentException if expression is <code>false</code> */ public static void isTrue(boolean expression, String message) { if (!expression) { throw new IllegalArgumentException(message); } } /** * Assert a boolean expression, throwing * <code>IllegalArgumentException</code> if the test result is * <code>false</code>. * * <pre class="code"> * Assert.isTrue(i > 0); * </pre> * * @param expression a boolean expression * @throws IllegalArgumentException if expression is <code>false</code> */ public static void isTrue(boolean expression) { isTrue(expression, "this expression must be true"); } }
/** * ToolKits,dedicated to XXX project * * @author vongosling */ public class ToolKits { private static ToolKits instance; private static Object o = ToolKits.class; private ToolKits() { } static { synchronized (o) { if (instance == null) { instance = new ToolKits(); } } } /** * @return {@code ToolKits singleton instance} */ public static ToolKits getInstance() { return instance; } /** * Return <code>true</code> if the supplied Collection is <code>null</code> * or empty. Otherwise, return <code>false</code>. * * @param collection the Collection to check * @return whether the given Collection is empty */ public static <T> boolean checkCollection(Collection<T> collection) { return collection == null || collection.isEmpty(); } /** * Return <code>true</code> if the supplied Map is <code>null</code> or * empty. Otherwise, return <code>false</code>. * * @param map the Map to check * @return whether the given Map is empty */ public static <T, K> boolean checkMap(Map<T, K> map) { return map == null || map.isEmpty(); } /** * Returns a new {@link Collection} containing <tt><i>a</i> - <i>b</i></tt>. * The cardinality of each element <i>e</i> in the returned * {@link Collection} will be the cardinality of <i>e</i> in <i>a</i> minus * the cardinality of <i>e</i> in <i>b</i>, or zero, whichever is greater. * * @param a the collection to subtract from, must not be null * @param b the collection to subtract, must not be null * @return a new collection with the results * @see Collection#removeAll */ public static <T> Collection<T> subtract(final Collection<T> a, final Collection<T> b) { ArrayList<T> list = new ArrayList<T>(a); for (Iterator<T> it = b.iterator(); it.hasNext();) { list.remove(it.next()); } return list; } /** * Ensures that object references passed as a parameter to the calling * method are all not empty(include null). necessarily , when reference * refers to Collection,its size can not empty. * * @param elements the elements that the checker should precondition, in * order * @return <p> * <b>false</b> if one of the variable parameters is null or is * empty. */ @SuppressWarnings("unchecked") public static <T> boolean anyOneIsNotEmpty(T... elements) { if (elements == null) { return false; } if (elements.length == 1 && elements instanceof String[]) { return (elements != null) && (((String) elements[0]).trim().length() != 0); } for (T obj : elements) { if (obj == null) { return false; } if (obj instanceof String) { if (((String) obj).trim().length() == 0) { return false; } else { continue; } } else if (obj instanceof Collection) { if (((Collection) obj).isEmpty()) { return false; } else { continue; } } else if (obj instanceof Map) { if (((Map) obj).isEmpty()) { return false; } else { continue; } }else{ //fault-tolerant return true; } } return true; }
/** * Cache client adatper * * @see https://github.com/memcached/memcached/blob/master/doc/protocol.txt * @author vongosling */ public interface CacheClientAdapter { /** * Store this data, only if it does not already exist. New items are at the * top of the LRU. If an item already exists and an add fails, it promotes * the item to the front of the LRU anyway. * * @param <T> * @param key * @param exp * @param value * @return */ <T> boolean add(String key, int exp, T value); /** * Store this data, possibly overwriting any existing data. New items are at * the top of the LRU. * * @param <T> * @param key * @param exp * @param value * @return */ <T> boolean set(String key, int exp, T value); /** * Retrieving data. Takes one keys and returns the found item. * * @param <T> * @param key * @return */ <T> T get(String key); /** * Retrieving data. Takes more keys and returns all found items. * * @param <T> * @param keyCollections * @return */ <T> Map<String, T> get(Collection<String> keyCollections); /** * Removes an item from the cache, if it exists. * * @param key * @return */ boolean delete(String key); /** * Increment and Decrement. If an item stored is the string representation * of a 64bit integer, you may run incr or decr commands to modify that * number. You can incr by positive or negative values, so decr is included * for completeness. If a value does not already exist, incr/decr will fail. * * @param key * @param step * @return */ long incr(String key, int step); /** * @see {@link #incr} * @param key * @param step * @return */ long decr(String key, int step); /** * wthether the cache switch is open * * @return */ boolean isEnable(); /** * @param enable */ void setEnable(boolean enable); /** * Basic stats command * * @return */ Map<InetSocketAddress, Map<String, String>> getStats(); /** * Stats command Materialization,such as: </br> stats items|stats * slabs|stats sizes * * @param itemName {@literal items|slabs|sizes} * @return */ Map<InetSocketAddress, Map<String, String>> getStatsByItem(String itemName); /** * @throws IOException */ void shutdown() throws IOException; }
private boolean checkIsInBlackList(JSONObject result) { //1. special case1 if (result == null || "{}".equals(result.toJSONString())) return false; //2. special case2 if (!"200".equals(result.getString("respCode"))) { logger.warn("warning,please refer to {} and concult 360 platform.", result); return false; } //3. in blacklist or in Must blacklist or ACP(exclude whitelist)? try { JSONObject JsonObj = result.getJSONObject("content").getJSONObject("blackCustomerInfo") .getJSONObject("returnValue"); //FIXME too deep when I get what I wanted,trace 360 platform improvement... String value = JsonObj.getString(getFields()); if (value.contains("1") || value.contains("2") || value.matches("((([#]|[\\s])5)|(5))[^(_inactive)]*")) { return true; } } catch (Exception e) { logger.error("Error occur!", e); return false; } return false; }
/** * @author vongosling */ public interface IVisitor { String getVisitorKey(); void visit(CustomerParam customerParam); }
/** * @author vongosling */ public abstract class AbstractVisitor implements IVisitor { protected final Logger log = LoggerFactory.getLogger(AbstractVisitor.class); public final void visit(CustomerParam customerParam) { this.init(customerParam); } public String getVisitorKey() { return this.getClass().getSimpleName(); } protected abstract void init(CustomerParam customerParam); }
/** * Holder pattern * * @author vongosling */ public class VisitorHolder { private static final Logger LOG = LoggerFactory.getLogger(VisitorHolder.class); private Map<String, IVisitor> holder = Maps.newHashMap(); private List<IVisitor> visitorList; public IVisitor getVisitor(String key) { if (StringUtils.isBlank(key)) { return null; } return holder.get(key); } public void setVisitorList(List<IVisitor> visitorList) { holder.clear(); this.visitorList = visitorList; for (IVisitor visitor : visitorList) { holder.put(visitor.getVisitorKey(), visitor); } } public Map<String, IVisitor> getHolder() { return holder; } public void setHolder(Map<String, IVisitor> holder) { this.holder = holder; LOG.info("load visitor {}", holder); } public List<IVisitor> getVisitorList() { return visitorList; } }
/** * 如果正常拼接后得到的key转换为bytes的长度超过250(memcached的key长度上限), 则自动做一次sha256hex的转换。 * * @param cacheDomain 缓存的domain * @param valueId 缓存内容的主键 * @param version 版本 * @return * @see CacheDomain */ public static String getKey(CacheDomain cacheDomain, String valueId, int version) { String key = cacheDomain.getValue() + SPLIT + valueId + SPLIT + version; final byte[] bytes = key.getBytes(); if (bytes.length > 250) { key = DigestUtils.sha256Hex(key); } return key; }
/** * @author vongosling */ @ManagedResource(objectName = CacheClientMBean.MBEAN_NAME, description = "Cache Management Bean") @SuppressWarnings("deprecation") public class CacheClientMBean { private static final Logger LOG = LoggerFactory.getLogger(CacheClientMBean.class); public static final String MBEAN_NAME = "XXX:type=CacheClientMBean,name=cacheClientMBean"; private CacheClientAdapter cacheClientAdapter; private MemcachedClient memcachedClient; @ManagedAttribute(description = "Current active session host") public Set<String> getActiveSessionHost() { Set<Session> sessions = memcachedClient.getConnector().getSessionSet(); Set<String> hosts = Sets.newHashSet(); for (Session ses : sessions) { hosts.add(ses.toString()); } return hosts; } @ManagedAttribute(description = "Order Cache Version") public Integer getOrderCacheVersion() { String key = CacheDomain.ORDERITEM.getValue() + OrderCacheServiceBo.KEY_SPLIT + OrderCacheServiceBo.ORDER_CACHE_VERSION; LOG.debug("Order cache version key is {}", key); return cacheClientAdapter.get(key); } @ManagedAttribute(description = "Order Cache Black Version") public Integer getOrderBlackListCacheVersion() { String key = CacheDomain.ORDERITEM.getValue() + OrderCacheServiceBo.KEY_SPLIT + OrderCacheServiceBo.ORDER_BLACK_LIST_VERSION; return cacheClientAdapter.get(key); } @ManagedAttribute(description = "Product Cache Version") public Integer getPrdCacheVersion() { return cacheClientAdapter.get(PrdServiceCacheAdmin.PRDCONFIG_CACHE_VESION_KEY); } @SuppressWarnings("unchecked") @ManagedOperation(description = "Get value from memcached") @ManagedOperationParameters( { @ManagedOperationParameter(name = "key", description = "Cache Key") }) public String getValueFromCache(String key) { Object o = cacheClientAdapter.get(key); String s = null; if (o instanceof Map) { s = o.toString(); } else { s = ToStringBuilder.reflectionToString(o, ToStringStyle.MULTI_LINE_STYLE); } return s; } public void setCacheClientAdapter(CacheClientAdapter cacheClientAdapter) { this.cacheClientAdapter = cacheClientAdapter; } public MemcachedClient getMemcachedClient() { return memcachedClient; } public void setMemcachedClient(MemcachedClient memcachedClient) { this.memcachedClient = memcachedClient; } }
/** * @author vongosling */ public interface LoggingConfig { /** * @param filter returns only loggers, which contain the filter string * @return all available loggers */ public String[] getLoggers(String filter); /** * assigns the {@link Level#INFO} to the given class * * @param target the FQCN of the class */ public void assignInfoLevel(String target); /** * assigns the {@link Level#WARN} to the given class * * @param target the FQCN of the class */ public void assignWarnLevel(String target); /** * assigns the {@link Level#ERROR} to the given class * * @param target the FQCN of the class */ public void assignErrorLevel(String target); /** * assigns the {@link Level#DEBUG} to the given class * * @param target the FQCN of the class */ public void assignDebug(String target); /** * assigns the {@link Level#FATAL} to the given class * * @param target the FQCN of the class */ public void assignFatalLevel(String target); /** * assigns the {@link Level#TRACE} to the given class * * @param target the FQCN of the class */ public void assignTraceLevel(String target); /** * deactivates the logging of the given class * * @param target the FQCN of the class */ public void deactivateLogging(String target); /** * reloads the log4j configuration from the <code>log4j.properties</code> * file in the classpath */ public void resetConfiguration(); /** * @return the log4j configuration from the <code>log4j.properties</code> * file in the classpath */ public String printLog4jConfig(); }
/** * @author vongosling */ public class LoggingConfigImpl implements LoggingConfig, NotificationPublisherAware { private Map<NotificationType, Long> notificationTypeMap = new HashMap<NotificationType, Long>(); private NotificationPublisher publisher; public void setNotificationPublisher(NotificationPublisher notificationPublisher) { this.publisher = notificationPublisher; } public String[] getLoggers(String filter) { LoggerRepository loggerRepo = LogManager.getLoggerRepository(); Enumeration<?> enumList = loggerRepo.getCurrentLoggers(); Logger logger = null; List<String> resultList = new ArrayList<String>(); while (enumList.hasMoreElements()) { logger = (Logger) enumList.nextElement(); if (filter != null && logger.getName().contains(filter)) { resultList.add(logger.getName()); } } return (String[]) resultList.toArray(new String[] {}); } public void assignInfoLevel(String target) { assignLogLevel(target, Level.INFO); } public void assignWarnLevel(String target) { assignLogLevel(target, Level.WARN); } public void assignErrorLevel(String target) { assignLogLevel(target, Level.ERROR); } public void assignDebug(String target) { assignLogLevel(target, Level.DEBUG); } public void assignFatalLevel(String target) { assignLogLevel(target, Level.FATAL); } public void deactivateLogging(String target) { assignLogLevel(target, Level.OFF); } public void assignTraceLevel(String target) { assignLogLevel(target, Level.TRACE); } private void assignLogLevel(String target, Level level) { String message = level.toString() + " for '" + target + "'"; Logger existingLogger = LogManager.exists(target); if (existingLogger != null) { Level currentLevel = existingLogger.getLevel(); if (currentLevel == null) { message = "initial to " + message; } else { message = "from " + currentLevel.toString() + " to " + message; } } LogManager.getLogger(target).setLevel(level); sendNotification(NotificationType.CHANGE_LOG_LEVEL, message); } private synchronized void sendNotification(NotificationType notificationType, String message) { Long counter = 0L; if (!notificationTypeMap.containsKey(notificationType)) notificationTypeMap.put(notificationType, counter); counter = notificationTypeMap.get(notificationType); notificationTypeMap.put(notificationType, Long.valueOf(counter + 1)); Notification notification = new Notification(notificationType.toString(), this, counter); notification.setUserData(message); publisher.sendNotification(notification); } public void resetConfiguration() { ClassLoader cl = getClass().getClassLoader(); LogManager.resetConfiguration(); URL log4jprops = cl.getResource("log4j.xml"); if (log4jprops != null) { //PropertyConfigurator.configure(log4jprops); DOMConfigurator.configure(log4jprops); } sendNotification(NotificationType.RESET_CONFIGURATION, "used file: " + log4jprops.getFile()); } public String printLog4jConfig() { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); PropertyPrinter pp = new PropertyPrinter(pw); pp.print(pw); // System.out.println(sw.toString()); return sw.toString(); } }
/** * @author vongosling */ public enum NotificationType { CHANGE_LOG_LEVEL, RESET_CONFIGURATION; }
/** * @author vongosling */ public class Log4jMDC { private static final Logger log = LoggerFactory.getLogger(Log4jMDC.class); public static void main(String[] args) throws InterruptedException, ExecutionException { ScheduledExecutorService service = Executors.newScheduledThreadPool(10); Runnable mdcTask = new Runnable() { public void run() { MDC.put("first", RandomStringUtils.randomAlphabetic(10)); MDC.put("last", RandomStringUtils.randomAlphabetic(10)); log.debug("Mission launched..."); MDC.clear(); log.warn("MDC cleared..."); } }; final ScheduledFuture<?> future1 = service.scheduleAtFixedRate(mdcTask, 0, 1, TimeUnit.SECONDS); ScheduledFuture<?> future2 = service.schedule(new Callable<Boolean>() { public Boolean call() throws Exception { return future1.cancel(true); } }, 5, TimeUnit.SECONDS); System.out.println(future2.get()); service.shutdown(); } }
/** * @author vongosling */ public class OrderInterfacePerformance extends AbstractJavaSamplerClient { private OrderPortalService orderPortalService; private SampleResult results; /** * @param orderPortalService the orderPortalService to set */ public void setOrderPortalService(OrderPortalService orderPortalService) { this.orderPortalService = orderPortalService; } @Override public Arguments getDefaultParameters() { Arguments params = new Arguments(); params.addArgument("name", "kaka"); return params; } @Override protected Logger getLogger() { return super.getLogger(); } @Override public void setupTest(JavaSamplerContext context) { results = new SampleResult(); } @Override public void teardownTest(JavaSamplerContext context) { super.teardownTest(context); } public SampleResult runTest(JavaSamplerContext paramJavaSamplerContext) { String parameterValue = paramJavaSamplerContext.getParameter("name"); results.setSamplerData(parameterValue); ResultModel<ArrayList<OrderDto>> result = new ResultModel<ArrayList<OrderDto>>(); results.sampleStart(); try { //Invocation logical processing OrderDto order = new OrderDto(); List<String> statuses = new ArrayList<String>(); statuses.add("payment_part"); statuses.add("payment_none"); order.setUid("300208380"); order.setStatuses(statuses); result = orderPortalService.getOrders(order, 1, 10); results.sampleEnd(); if (result.isSuccessed()) { results.setSuccessful(true); } else { results.setSuccessful(false); } } catch (Exception e) { results.setSuccessful(false); System.err.println(e.getLocalizedMessage()); } finally { System.out.println(result); } return results; } }
/** * @author vongosling */ public class ServerMonitor implements ServerMonitorMBean { private final ServerImpl target; public ServerMonitor(ServerImpl target) { this.target = target; } public long getUpTime() { return System.nanoTime() - target.startTime; } }
/** * @author vongosling */ public class ServerMonitorDynamic implements DynamicMBean { private final ServerImpl target; private MBeanInfo mBeanInfo; public ServerMonitorDynamic(ServerImpl target) { this.target = target; } // 实现获取被管理的 ServerImpl的 upTime public long upTime() { return System.nanoTime() - target.startTime; } //javax.management.MBeanServer 会通过查询 getAttribute("Uptime") 获得 "Uptime" 属性值 public Object getAttribute(String attribute) throws AttributeNotFoundException, MBeanException, ReflectionException { if (attribute.equals("UpTime")) { return upTime(); } return null; } // 给出 ServerMonitor 的元信息。 public MBeanInfo getMBeanInfo() { if (mBeanInfo == null) { try { Class<?> cls = this.getClass(); // 用反射获得 "upTime" 属性的读方法 Method readMethod = cls.getMethod("upTime", new Class[0]); // 用反射获得构造方法 Constructor<?> constructor = cls.getConstructor(new Class[] { ServerImpl.class }); // 关于 "upTime" 属性的元信息 : 名称为 UpTime,只读属性 ( 没有写方法 )。 MBeanAttributeInfo upTimeMBeanAttributeInfo = new MBeanAttributeInfo("UpTime", "The time span since server start", readMethod, null); // 关于构造函数的元信息 MBeanConstructorInfo mBeanConstructorInfo = new MBeanConstructorInfo( "Constructor for ServerMonitor", constructor); //ServerMonitor 的元信息,为了简单起见,在这个例子里, // 没有提供 invocation 以及 listener 方面的元信息 mBeanInfo = new MBeanInfo(cls.getName(), "Monitor that controls the server", new MBeanAttributeInfo[] { upTimeMBeanAttributeInfo }, new MBeanConstructorInfo[] { mBeanConstructorInfo }, null, null); } catch (Exception e) { throw new Error(e); } } return mBeanInfo; } public AttributeList getAttributes(String[] arg0) { return null; } public Object invoke(String arg0, Object[] arg1, String[] arg2) throws MBeanException, ReflectionException { return null; } public void setAttribute(Attribute arg0) throws AttributeNotFoundException, InvalidAttributeValueException, MBeanException, ReflectionException { return; } public AttributeList setAttributes(AttributeList arg0) { return null; } }
/** * @author vongosling */ public class JmxRunner { private static ObjectName objectName_1; private static ObjectName objectName_2; private static MBeanServer server; public static void main(String[] args) throws Exception { init(); invoke(); } private static void init() throws Exception { ServerImpl serverImpl = new ServerImpl(); ServerMonitor serverMoniter = new ServerMonitor(serverImpl); ServerMonitorDynamic serverMoniterDynamic = new ServerMonitorDynamic(serverImpl); server = MBeanServerFactory.createMBeanServer(); objectName_1 = new ObjectName("com.von:name=von_server"); objectName_2 = new ObjectName("com.von:name=von_server_dynamic"); server.registerMBean(serverMoniter, objectName_1); server.registerMBean(serverMoniterDynamic, objectName_2); } private static void invoke() throws Exception { System.out.println(server.isRegistered(objectName_1)); System.out.println(server.isRegistered(objectName_2)); System.out.println(server.getAttribute(objectName_2, "UpTime")); System.out.println(server.getAttribute(objectName_1, "UpTime")); } }
/** * @author vongosling */ public class StringOperationPerfTest { public static void main(String[] args) { int OUTER_ITERATION = 5; int INNER_ITERATION = 5000; String addTestStr = ""; String concatTestStr = ""; StringBuffer concatTestSb = null; StringBuilder concatTestSbu = null; StopWatch stopWatch = new Slf4JStopWatch(); for (int outerIndex = 0; outerIndex < OUTER_ITERATION; outerIndex++) { addTestStr = ""; for (int innerIndex = 0; innerIndex < INNER_ITERATION; innerIndex++) addTestStr += "*"; stopWatch.lap("StringAddConcat"); } for (int outerIndex = 0; outerIndex < OUTER_ITERATION; outerIndex++) { concatTestStr = ""; for (int innerIndex = 0; innerIndex < INNER_ITERATION; innerIndex++) concatTestStr = concatTestStr.concat("*"); stopWatch.lap("StringConcat"); } for (int outerIndex = 0; outerIndex < OUTER_ITERATION; outerIndex++) { concatTestSb = new StringBuffer(); for (int innerIndex = 0; innerIndex < INNER_ITERATION; innerIndex++) concatTestSb.append("*"); stopWatch.lap("StringBufferConcat"); } for (int outerIndex = 0; outerIndex < OUTER_ITERATION; outerIndex++) { concatTestSbu = new StringBuilder(); for (int innerIndex = 0; innerIndex < INNER_ITERATION; innerIndex++) concatTestSbu.append("*"); stopWatch.stop("StringBuilderConcat"); } } }
/** * Serializable further research * * @author vongosling */ public class SerializableTest { public static class CaseOne implements Serializable { private static final long serialVersionUID = 1L; public static int staticVar = 5; public static void main(String[] args) { try { ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("result.obj")); out.writeObject(new CaseOne()); out.flush(); System.out.println(new File("result.obj").length()); out.writeObject(new CaseOne()); out.close(); System.out.println(new File("result.obj").length()); ObjectInputStream oin = new ObjectInputStream(new FileInputStream("result.obj")); CaseOne t1 = (CaseOne) oin.readObject(); CaseOne t2 = (CaseOne) oin.readObject(); oin.close(); System.out.println(t1 == t2); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } } }
/** * Commons-Collections Demo * * @author vongosling */ public class CommonCollectionsTest { @SuppressWarnings("unchecked") @Test public void IterableMapTest() { //1 IterableMap map = new HashedMap(); map.put("name", "kaka"); MapIterator it = map.mapIterator(); while (it.hasNext()) { Object key = it.next(); System.out.println(key); Object value = it.getValue(); System.out.println(value); it.setValue("messi"); } System.out.println(map); //2 OrderedMap orderedMap = new LinkedMap(); orderedMap.put("FIVE", "5"); orderedMap.put("SIX", "6"); orderedMap.put("SEVEN", "7"); System.out.println(orderedMap.firstKey()); System.out.println(orderedMap.nextKey("FIVE")); //3 BidiMap bidi = new TreeBidiMap(); bidi.put("SIX", "6"); bidi.put("SEVEN", "7"); bidi.get("SIX"); // returns "6" bidi.getKey("6"); // returns "SIX" bidi.removeValue("6"); // removes the mapping BidiMap inverse = bidi.inverseBidiMap(); // returns a map with keys and values swapped System.out.println(inverse); //4 Buffer buffer = new UnboundedFifoBuffer(); buffer.add("ONE"); buffer.add("TWO"); buffer.add("THREE"); buffer.remove(); // removes and returns the next in order, "ONE" as this is a FIFO buffer.remove(); // removes and returns the next in order, "TWO" as this is a FIFO //5 Iterator iter = new FilterIterator(); new UniqueFilterIterator(iter); //6 Bag bag = new HashBag(); bag.add("ONE", 6); // add 6 copies of "ONE" bag.remove("ONE", 2); // removes 2 copies of "ONE" bag.getCount("ONE"); // returns 4, the number of copies in the bag (6 - 2) } public static class Blocking implements Runnable { // Queue queue = new LinkedBlockingDeque(); Buffer queue = BlockingBuffer.decorate(new BoundedFifoBuffer()); @SuppressWarnings("unchecked") public static void main(String[] args) throws InterruptedException { Blocking blockThread = new Blocking(); Thread t = new Thread(blockThread); t.start(); blockThread.queue.add("Hello"); Thread.sleep(5000); blockThread.queue.add("Black Lee"); } public void run() { while (true) { try { String msg = (String) queue.remove(); System.out.println(msg); } catch (Exception e) { } } } } }
/** * @author vongosling */ public class Perf4jInterceptor implements MethodBeforeAdvice, AfterReturningAdvice { private Map<String, StopWatch> watches = new HashMap<String, StopWatch>(); public void before(Method method, Object[] args, Object target) throws Throwable { String completeMethodName = getCompleteMethodName(target, method); StopWatch stopWatch; if (watches.containsKey(completeMethodName)) { stopWatch = watches.get(completeMethodName); stopWatch.start(); } else { stopWatch = new Slf4JStopWatch(completeMethodName, Arrays.toString(args)); watches.put(completeMethodName, stopWatch); } } public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable { String completeMethodName = getCompleteMethodName(target, method); if (watches.containsKey(completeMethodName)) { StopWatch stopWatch = watches.get(completeMethodName); stopWatch.stop(); } } private String getCompleteMethodName(Object target, Method method) { String className = ""; if (target != null) { className = target.toString(); int loc = className.indexOf("@"); if (loc >= 0) { className = className.substring(0, loc); } } return className + "." + method.getName(); } }
/** * @author vongosling */ @Aspect public class ExceptionAspect implements Ordered { private final Logger logger = LoggerFactory.getLogger(ExceptionAspect.class); private int order = 100; @Pointcut("execution(public * com.service.*.*Impl.*(..)) && @annotation (com.service.aop.ServiceTrace)") public void serviceMethod() { } @Around("serviceMethod()") public Object doConcurrentOperation(ProceedingJoinPoint pjp) throws Throwable { logger.debug("exception aop beginning..."); ResultModel<String> result = new ResultModel<String>(); TraceUtils.beginTrace(); try { String remoteHost = DubboContext.getContext().getRemoteHost(); // 获取调用方IP logger.info("remoteHost = {}", remoteHost); Object nomralResult = pjp.proceed(); //JMX monitor some unexpected things if (logger.isDebugEnabled()) { ByteArrayOutputStream bo = new ByteArrayOutputStream(); ObjectOutputStream oo = new ObjectOutputStream(bo); oo.writeObject(nomralResult); byte[] array = bo.toByteArray(); logger.debug("result size is {}", array.length); logger.debug("result is {}", ToStringBuilder.reflectionToString(nomralResult, ToStringStyle.MULTI_LINE_STYLE)); oo.close(); } return nomralResult; } catch (DowjonesIllegalArgumentException ex) { return new ExceptionAspectProcessor() { @Override public void hookOn(ResultModel<String> result) { result.setErrorCode(ErrorCode.ILLEGAL_ARGUMENT); } }.doProcessBiz(result, ex); } catch (IllegalArgumentException ex) { return new ExceptionAspectProcessor() { @Override public void hookOn(ResultModel<String> result) { result.setErrorCode(ErrorCode.ILLEGAL_ARGUMENT); } }.doProcess(result, ex); } catch (Exception ex) { return new ExceptionAspectProcessor() { @Override public void hookOn(ResultModel<String> result) { result.setErrorCode(ErrorCode.UNKNOWN_ERROR); } }.doProcess(result, ex); } finally { TraceUtils.endTrace(); } } public int getOrder() { return order; } public void setOrder(int order) { this.order = order; } private abstract class ExceptionAspectProcessor { protected abstract void hookOn(ResultModel<String> result); public final Object doProcess(ResultModel<String> result, Exception ex) { logger.error("catch exception: ", ex); doProcessResult(result,ex) ; hookOn(result); logger.debug("return result {}", result); return result; }; public final Object doProcessBiz(ResultModel<String> result, Exception ex) { logger.warn("catch exception: ", ex); doProcessResult(result,ex) ; hookOn(result); logger.debug("return result {}", result); return result; }; private final void doProcessResult(ResultModel<String> result, Exception ex){ result.setSuccessed(false); result.setExceptionDesc(ex.getMessage());//will delete in future result.setErrorDesc(ex.getMessage()); } } }
/** * 使用JCA/JCE(SUN默认的Cryptographic Service Provider)对称密钥进行加密解密 * * @author vongosling Nov 7, 2011 2:31:24 PM */ public class DESEncryptUtils { /** * 解密 * * @param pwd * @param strKey * @return */ public static String decrypt(String pwd, String strKey) { if (StringUtils.isEmpty(pwd) || StringUtils.isEmpty(strKey)) { return null; } try { //1. byte[] rawKeyData = (new String(strKey)).getBytes(); byte[] encryptedData = Base64.decode(pwd); //2. Security.addProvider(new com.sun.crypto.provider.SunJCE()); //3. SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); DESKeySpec dks = new DESKeySpec(rawKeyData); SecretKey key = keyFactory.generateSecret(dks); //4. Cipher cipher = Cipher.getInstance("DES"); SecureRandom sr = new SecureRandom(); cipher.init(Cipher.DECRYPT_MODE, key, sr); byte[] decryptedData = cipher.doFinal(encryptedData); //5. return new String(decryptedData); } catch (Exception e) { e.printStackTrace(); } return null; } /** * 加密 * * @param pwd 加密串 * @param strKey 加密码 * @return */ public static String encrypt(String pwd, String strKey) { if (StringUtils.isEmpty(pwd) || StringUtils.isEmpty(strKey)) { return null; } try { //1. byte[] decryptData = pwd.getBytes(); byte[] rawKeyData = (new String(strKey)).getBytes(); //2.获得加密服务提供者 Security.addProvider(new com.sun.crypto.provider.SunJCE());//Sun默认提供者实现 //3. SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); DESKeySpec dks = new DESKeySpec(rawKeyData); SecretKey key = keyFactory.generateSecret(dks);//生成DES密钥 //4. Cipher cipher = Cipher.getInstance("DES");//创建Cipher对象 SecureRandom sr = new SecureRandom(); //5.初始化Cipher cipher.init(Cipher.ENCRYPT_MODE, key, sr); //6. byte[] encryptData = cipher.doFinal(decryptData); //7. return Base64.encode(encryptData); } catch (Exception e) { e.printStackTrace(); } return null; } }
/** * @author vongosling */ public class TraceUtils { public static final String TRACE_ID_KEY = "traceId"; public static final int TRACE_ID_LENGTH = 8; public static void beginTrace() { String traceId = RandomStringUtils.randomAlphanumeric(TRACE_ID_LENGTH); MDC.put(TRACE_ID_KEY, traceId); } public static void beginTrace(String traceId) { MDC.put(TRACE_ID_KEY, traceId); } public static void endTrace() { MDC.remove(TRACE_ID_KEY); } }
/** * Result List based cursor theory * * @author vongosling * @param <T> */ public class ResultCursorList<T> extends BaseDo { private static final long serialVersionUID = -6593448580923210640L; /** * Result list */ private List<T> values; /** * Total result */ private Long totalCount; /** * For forwarding query,it can be timestamp or offset,when * timestamp,previousCursor must be less than or equals nextCursor */ private Long previousCursor; /** * For backwarding query */ private Long nextCursor; /** * Init case * * @param clasz * @return */ public static <T> ResultCursorList<T> build(Class<T> clazz) { return new ResultCursorList<T>().setValues(new ArrayList<T>()).setTotalCount(0l) .setPreviousCursor(0l).setNextCursor(0l); } /** * Common case * * @param clasz * @param values * @param totalCount * @param previousCursor * @param nextCursor * @return */ public static <T> ResultCursorList<T> build(Class<T> clazz, List<T> values, Long totalCount, Long previousCursor, Long nextCursor) { if (values == null || values.isEmpty()) { return build(clazz); } return new ResultCursorList<T>().setValues(values).setTotalCount(totalCount) .setPreviousCursor(previousCursor).setNextCursor(nextCursor); } public List<T> getValues() { return values; } public ResultCursorList<T> setValues(List<T> values) { this.values = values; return this; } public Long getTotalCount() { return totalCount; } public ResultCursorList<T> setTotalCount(Long totalCount) { this.totalCount = totalCount; return this; } public Long getPreviousCursor() { return previousCursor; } public ResultCursorList<T> setPreviousCursor(Long previousCursor) { this.previousCursor = previousCursor; return this; } public Long getNextCursor() { return nextCursor; } public ResultCursorList<T> setNextCursor(Long nextCursor) { this.nextCursor = nextCursor; return this; } }
/** * @author vongosling */ public final class CacheHelper { public static final String SPLIT = ":"; private CacheHelper() { } public enum CacheDomain { /** 用户信息 */ USER("U"), /** 员工信息 */ STAFF("S"), /** 好友关系 */ FRIENDRELATION("R"), /** 权限集 */ PERMISSION("P"); private String value; private CacheDomain(String value) { this.value = value; } public String getValue() { return value; } } /** * @param cacheDomain * @param valueId * @param version * @see http://en.wikipedia.org/wiki/SHA-2 * @return */ public static String getKey(CacheDomain cacheDomain, String valueId, int version) { String key = cacheDomain.getValue() + SPLIT + valueId + SPLIT + version; final byte[] bytes = key.getBytes(); if (bytes.length > 250) { key = DigestUtils.sha256Hex(key); } return key; } }
/** * @author vongosling */ public class BaseDo implements Serializable { private static final long serialVersionUID = 8995346561768156845L; /** * @see java.lang.Object#toString */ public String toString() { return ToStringBuilder.reflectionToString(this, ToStringStyle.DEFAULT_STYLE); } /** * @see java.lang.Object#equals(Object) */ public boolean equals(Object object) { if (!(object instanceof BaseDo)) { return false; } return new EqualsBuilder().appendSuper(super.equals(object)).isEquals(); } /** * @see java.lang.Object#hashCode() */ public int hashCode() { return new HashCodeBuilder(208989125, 784658211).appendSuper(super.hashCode()).toHashCode(); } }