/**
* Copyright 2016 benjobs
* <p>
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* 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 org.opencron.common.utils;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.io.File;
import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.*;
/**
*
* @author <a href="mailto:benjobs@qq.com">benjobs@qq.com</a>
* @name:CommonUtil
* @version: 1.0.0
* @company: org.opencron
* @description: 常用工具类
* @date: 2012-10-9 pa 18:03 于大麦<br/><br/>
*
* <b style="color:RED">呵呵</b><br/><br/>
* 我说我喜欢你,你说呵呵,<br/>
* 我问你喜欢我不,你说呵呵,<br/>
* 然后你便悄然离线,<br/>
* 灰色头像不再跳闪,<br/>
* 空留我傻傻的感叹。<br/>
* 聊天就这样止步于呵呵,<br/>
* 我们能不能不说呵呵,<br/>
* 我已经怕了这个词了, <br/>
* 请你不要敷衍我,<br/>
* 我爱你那么多, <br/>
* 你也喜欢下我好么?<br/><br/>
*
* 记得上次我们一起唱的歌,<br/>
* 我小声唱,你也跟着合,<br/>
* 看着你脸上醉人的酒窝,<br/>
* 我心里有说不出的快乐.<br/>
* 我问你喜欢和我在一起么?<br/>
* 你低头不语,笑着不说。<br/>
* 原来只是我一厢情愿,<br/>
* 回想起以往的缠绵,<br/>
* 痛苦在我身上蔓延,<br/>
* 眼泪慢慢模糊视线, <br/>
* 你的影子在我脑海盘旋,<br/>
* 是我对你太依恋,<br/>
* 我只想陪你走完这一段, <br/>
* 只要你在我身边, <br/>
* 沿途风景,即便再美,我也不会留恋,<br/>
* 为什么我们不能把这场恋爱谈完?<br/><br/>
*
* 往日温柔的你现在何处,<br/>
* 我的心只想向你倾诉,<br/>
* 你怎忍心一人远走, <br/>
* 让我承受思念之苦, <br/>
* 你可知我在为你守候, <br/>
* 我多想为你分担痛苦, <br/>
* 时刻陪伴在你的左右, <br/>
* 感受你的感受,去除你的烦忧,<br/>
* 分享你的快乐,擦干你的泪珠。<br/>
* 梦想着能和你在未来的旅途, <br/>
* 一起嬉戏,没了忧愁, <br/>
* 执子之手,相约白头! <br/><br/>
*
* 后来你打电话说已经有了男朋友,<br/>
* 一起过的很幸福。 <br/>
* 我说了声:呵呵,祝你幸福! <br/>
* 你问:你怎么也说呵呵呢? <br/>
* 我还想说啥已说不出, <br/>
* 眼泪已经止不住的流。<br/>
* 你决定要走, <br/>
* 寻找属于你的归宿, <br/>
* 我也不能挽留, <br/>
* 只能真心的祝你幸福! <br/><br/>
*
* 我用尽一生的思念,<br/>
* 只为等待你的出现,<br/>
* 如今你已越走越远, <br/>
* 而我只能独自感叹, <br/>
* 情话给谁听,眉毛为谁画? <br/>
* 翘首企盼谁,携谁走天涯? <br/>
* 愿得谁之心,白首不相离?<br/>
* 该执谁之手,相守到白发? <br/>
* <hr style="color:RED"/>
*/
@SuppressWarnings({"rawtypes", "unchecked"})
public abstract class CommonUtils implements Serializable {
private static final long serialVersionUID = 6458428317155311192L;
/**
* 非空判断
*
* @param objs 要判断,处理的对象
* @return Boolean
* @author <a href="mailto:benjobs@qq.com">Ben</a>
* @see <b>对象为Null返回true,集合的大小为0也返回true,迭代器没有下一个也返回true..</b>
* @since 1.0
*/
public static Boolean isEmpty(Object... objs) {
if (objs == null) {
return Boolean.TRUE;
}
if (objs.length == 0) return Boolean.TRUE;
for (Object obj : objs) {
if (obj == null) {
return true;
}
// 字符序列集
if ((obj instanceof CharSequence) && "".equals(obj.toString().trim())) {
return true;
}
// 单列集合
if (obj instanceof Collection) {
if (((Collection<?>) obj).isEmpty()) {
return true;
}
}
// 双列集合
if (obj instanceof Map) {
if (((Map<?, ?>) obj).isEmpty()) {
return true;
}
}
if (obj instanceof Iterable) {
if (((Iterable<?>) obj).iterator() == null || !((Iterable<?>) obj).iterator().hasNext()) {
return true;
}
}
// 迭代器
if (obj instanceof Iterator) {
if (!((Iterator<?>) obj).hasNext()) {
return true;
}
}
// 文件类型
if (obj instanceof File) {
if (!((File) obj).exists()) {
return true;
}
}
if ((obj instanceof Object[]) && ((Object[]) obj).length == 0) {
return true;
}
}
return false;
}
/**
* 空判断
*
* @param obj 要判断,处理的对象
* @return Boolean
* @author <a href="mailto:benjobs@qq.com">Ben</a>
* @see <b>与非空相反</b>
* @since 1.0
*/
public static Boolean notEmpty(Object... obj) {
return !isEmpty(obj);
}
public static Map<String, Object> object2Map(Object obj) {
if (isEmpty(obj))
return Collections.EMPTY_MAP;
Map<String, Object> resultMap = new HashMap<String, Object>(0);
// 拿到属性器数组
try {
PropertyDescriptor[] pds = Introspector.getBeanInfo(obj.getClass()).getPropertyDescriptors();
for (int index = 0; pds.length > 1 && index < pds.length; index++) {
if (Class.class == pds[index].getPropertyType() || pds[index].getReadMethod() == null) {
continue;
}
Object value = pds[index].getReadMethod().invoke(obj);
// 只处理简单类型,对于对象类型,集合不处理
if (notEmpty(value)) {
if (isPrototype(pds[index].getPropertyType())//java里的原始类型(去除自己定义类型)
|| pds[index].getPropertyType().isPrimitive()//基本类型
|| ReflectUitls.isPrimitivePackageType(pds[index].getPropertyType())
|| pds[index].getPropertyType() == String.class) {
resultMap.put(pds[index].getName(), value.toString());
}else {
resultMap.put(pds[index].getName(), object2Map(value) );
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return resultMap;
}
public static Long toLong(Object val, Long defVal) {
if (isEmpty(val)) {
return defVal;
}
try {
return Long.parseLong(val.toString());
} catch (NumberFormatException e) {
return defVal;
}
}
public static Long toLong(Object val) {
return toLong(val, null);
}
public static Integer toInt(Object val, Integer defVal) {
if (isEmpty(val)) {
return defVal;
}
try {
return Integer.parseInt(val.toString());
} catch (NumberFormatException e) {
return defVal;
}
}
public static float toFloat(Object val, float defVal) {
if (isEmpty(val)) {
return defVal;
}
try {
return Float.parseFloat(val.toString());
} catch (NumberFormatException e) {
return defVal;
}
}
public static Boolean toBoolean(String text,Boolean defVal) {
if (isEmpty(text)) {
return false;
}
try {
return Boolean.parseBoolean(text);
} catch (NumberFormatException e) {
return defVal;
}
}
public static Boolean toBoolean(String text) {
return toBoolean(text,false);
}
public static Integer toInt(Object val) {
return toInt(val, null);
}
public static Float toFloat(Object val) {
return toFloat(val, 0f);
}
/**
* 对Null作预处理
*
* @param obj 待处理的对象
* @param clazz 该对象的类型
* @return T 返回处理后的不为Null的该对象
* @author <a href="mailto:benjobs@qq.com">Ben</a>
* @see <b>对Null作预处理,有效避免NullPointerException</b>
* @since 1.0
*/
public static <T> T preparedNull(T obj, Class<?> clazz) {
if (notEmpty(obj)) {
return obj;
}
AssertUtils.notNull(clazz, "this class must be not null!");
Object val = null;
// 单列集合
if (List.class.isAssignableFrom(clazz)) {
val = new ArrayList<Object>(0);
} else if (Set.class.isAssignableFrom(clazz)) {
val = new HashSet<Object>(0);
} else if (Map.class.isAssignableFrom(clazz)) {
val = new HashMap<Object, Object>(0);
} else {
try {
val = clazz.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
}
return (T) val;
}
public static List arrayToList(Object source) {
return Arrays.asList(ObjectUtils.toObjectArray(source));
}
public static boolean contains(Iterator iterator, Object element) {
if (iterator != null) {
while (iterator.hasNext()) {
Object candidate = iterator.next();
if (ObjectUtils.safeEquals(candidate, element)) {
return true;
}
}
}
return false;
}
/**
* Check whether the given Enumeration contains the given element.
* @param enumeration the Enumeration to check
* @param element the element to look for
* @return <code>true</code> if found, <code>false</code> else
*/
public static boolean contains(Enumeration enumeration, Object element) {
if (enumeration != null) {
while (enumeration.hasMoreElements()) {
Object candidate = enumeration.nextElement();
if (ObjectUtils.safeEquals(candidate, element)) {
return true;
}
}
}
return false;
}
/**
* Check whether the given Collection contains the given element instance.
* <p>Enforces the given instance to be present, rather than returning
* <code>true</code> for an equal element as well.
* @param collection the Collection to check
* @param element the element to look for
* @return <code>true</code> if found, <code>false</code> else
*/
public static boolean containsInstance(Collection collection, Object element) {
if (collection != null) {
for (Object candidate : collection) {
if (candidate == element) {
return true;
}
}
}
return false;
}
public static <A, E extends A> A[] toArray(Enumeration<E> enumeration, A[] array) {
ArrayList<A> elements = new ArrayList<A>();
while (enumeration.hasMoreElements()) {
elements.add(enumeration.nextElement());
}
return elements.toArray(array);
}
/**
* Adapt an enumeration to an iterator.
* @param enumeration the enumeration
* @return the iterator
*/
public static <E> Iterator<E> toIterator(Enumeration<E> enumeration) {
@SuppressWarnings("hiding")
class EnumerationIterator<E> implements Iterator<E> {
private Enumeration<E> enumeration;
public EnumerationIterator(Enumeration<E> enumeration) {
this.enumeration = enumeration;
}
public boolean hasNext() {
return this.enumeration.hasMoreElements();
}
public E next() {
return this.enumeration.nextElement();
}
public void remove() throws UnsupportedOperationException {
throw new UnsupportedOperationException("Not supported");
}
}
return new EnumerationIterator<E>(enumeration);
}
//获取系统名字
public static String getOsName() {
return System.getProperties().getProperty("os.name");
}
public static boolean isLinuxOs() {
return getOsName().toUpperCase().startsWith("LIN");
}
//是否为Window系统
public static boolean isWindowOs() {
return getOsName().toUpperCase().startsWith("WIN");
}
//判断类型是否为jdk里自带的原始类型
public static boolean isPrototype(Class clazz) {
return clazz.getClassLoader() == null;
}
//获取泛型上的具体类型(第一个)
public static Class<?> getGenericType(Class<?> clazz) {
return getGenericType(clazz, 0);
}
//获取泛型上的具体类型(指定哪个类型)
public static Class<?> getGenericType(Class<?> clazz, int i) {
Type type = clazz.getGenericSuperclass();
if (type instanceof ParameterizedType) {
Type[] types = ((ParameterizedType) type).getActualTypeArguments();
return (Class<?>) types[i];
}
return null;
}
/**
* 将String数组转化为Long数组
* @Title: strArr2LongArr
* @param strArr String数组
* @return Long数组
* @author: wanghajie 2012-12-13上午10:15:42
*/
public static Long[] string2LongArray(String[] strArr) {
if (CommonUtils.isEmpty(strArr)) {
return null;
}
Long longArray[] = new Long[strArr.length];
for (int i = 0; i < longArray.length; i++) {
longArray[i] = StringUtils.parseLong(strArr[i]);
}
return longArray;
}
/**
* 将将String数组转化为LongList
* @Title: strArr2LongList
* @param strArr String数组
* @return LongList
* @author: wanghajie 2012-12-13上午11:09:10
*/
public static List<Long> string2LongList(String[] strArr) {
// 将String数组转化为Long数组
Long[] longArr = string2LongArray(strArr);
return longArr == null ? ((List<Long>) Collections.EMPTY_LIST) : Arrays.asList(longArr);
}
public static <K, V extends Comparable<? super V>> Map<K, V> sortMapByValue(Map<K, V> map) {
List<Map.Entry<K, V>> list = new LinkedList<Map.Entry<K, V>>(map.entrySet());
Collections.sort(list, new Comparator<Map.Entry<K, V>>() {
public int compare(Map.Entry<K, V> o1, Map.Entry<K, V> o2) {
return (o1.getValue()).compareTo(o2.getValue());
}
});
Map<K, V> result = new LinkedHashMap<K, V>();
for (Map.Entry<K, V> entry : list) {
result.put(entry.getKey(), entry.getValue());
}
return result;
}
public static <T>T[] arrayRemoveElements(T[] array,T... elem) {
AssertUtils.notNull(array);
List<T> arrayList = new ArrayList<T>(0);
Collections.addAll(arrayList,array);
if (isEmpty(elem)) return array;
for(T el:elem) arrayList.remove(el);
return Arrays.copyOf(arrayList.toArray(array), arrayList.size());
}
public static <T>T[] arrayRemoveIndex(T[] array,int... index) {
AssertUtils.notNull(array);
for(int j:index) {
if (j < 0 || j > array.length - 1) throw new IndexOutOfBoundsException("index error.@"+j);
}
List<T> arrayList = new ArrayList<T>(0);
Collections.addAll(arrayList, array);
int i=0;
for(int j:index) {
arrayList.remove(j-i);
++i;
}
return Arrays.copyOf(arrayList.toArray(array), arrayList.size());
}
public static String uuid() {
return UUID.randomUUID().toString().replaceAll("-","");
}
/**
* 生成指定长度的uuid
* @param len
* @return
*/
public static String uuid(int len) {
StringBuffer sb = new StringBuffer();
while (sb.length()<len) {
sb.append(uuid());
}
return sb.toString().substring(0,len);
}
}