Skip to content

Commit

Permalink
fix bugs
Browse files Browse the repository at this point in the history
  • Loading branch information
looly committed Jun 26, 2018
1 parent 731f01a commit 52e68c8
Show file tree
Hide file tree
Showing 10 changed files with 149 additions and 20 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
## 4.1.2

### 新特性
* 【core】 MapUtil增加getDate方法(感谢@【帝都】宁静)
* 【json】 putByPath方法增加容错性,支持下标越界识别为追加(issue#IKNM6@Gitee)

### Bug修复
* 【core】 修复JSONUtil.formatJsonStr引号换行问题(issue#IKMMK@Gitee)
Expand Down
4 changes: 2 additions & 2 deletions hutool-core/src/main/java/cn/hutool/core/bean/BeanPath.java
Original file line number Diff line number Diff line change
Expand Up @@ -94,8 +94,8 @@ public Object get(Object bean) {
* 注意:
*
* <pre>
* 1. 如果为List,则设置值得下标不能大于已有List的长度
* 2. 如果为数组,不能超过其长度
* 1. 如果为List,如果下标不大于List长度,则替换原有值,否则追加值
* 2. 如果为数组,如果下标不大于数组长度,则替换原有值,否则追加值
* </pre>
*
* @param bean Bean、Map或List
Expand Down
5 changes: 2 additions & 3 deletions hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
import java.beans.PropertyDescriptor;
import java.beans.PropertyEditor;
import java.beans.PropertyEditorManager;
import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Collection;
Expand Down Expand Up @@ -225,9 +224,9 @@ public static void setFieldValue(Object bean, String fieldNameOrIndex, Object va
if (bean instanceof Map) {
((Map) bean).put(fieldNameOrIndex, value);
} else if (bean instanceof List) {
((List) bean).set(Convert.toInt(fieldNameOrIndex), value);
CollUtil.setOrAppend((List) bean, Convert.toInt(fieldNameOrIndex), value);
} else if (ArrayUtil.isArray(bean)) {
Array.set(bean, Convert.toInt(fieldNameOrIndex), value);
ArrayUtil.setOrAppend(bean, Convert.toInt(fieldNameOrIndex), value);
} else {
// 普通Bean对象
ReflectUtil.setFieldValue(bean, fieldNameOrIndex, value);
Expand Down
21 changes: 21 additions & 0 deletions hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -2012,6 +2012,7 @@ public static <K, V> void forEach(Map<K, V> map, KVConsumer<K, V> kvConsumer) {
/**
* 分组,按照{@link Hash}接口定义的hash算法,集合中的元素放入hash值对应的子列表中
*
* @param <T> 元素类型
* @param collection 被分组的集合
* @param hash Hash值算法,决定元素放在第几个分组的规则
* @return 分组后的集合
Expand Down Expand Up @@ -2055,6 +2056,7 @@ public int hash(T t) {
/**
* 根据元素的指定字段名分组,非Bean都放在第一个分组中
*
* @param <T> 元素类型
* @param collection 集合
* @param fieldName 元素Bean中的字段名,非Bean都放在第一个分组中
* @return 分组列表
Expand Down Expand Up @@ -2084,6 +2086,7 @@ public int hash(T t) {
/**
* 反序给定List,会在原List基础上直接修改
*
* @param <T> 元素类型
* @param list 被反转的List
* @return 反转后的List
* @since 4.0.6
Expand All @@ -2096,6 +2099,7 @@ public static <T> List<T> reverse(List<T> list) {
/**
* 反序给定List,会创建一个新的List,原List数据不变
*
* @param <T> 元素类型
* @param list 被反转的List
* @return 反转后的List
* @since 4.0.6
Expand All @@ -2104,6 +2108,23 @@ public static <T> List<T> reverseNew(List<T> list) {
final List<T> list2 = ObjectUtil.clone(list);
return reverse(list2);
}

/**
* 设置或增加元素。当index小于List的长度时,替换指定位置的值,否则在尾部追加
* @param list List列表
* @param index 位置
* @param element 新元素
* @return 原List
* @since 4.1.2
*/
public static <T> List<T> setOrAppend(List<T> list, int index, T element){
if(index < list.size()) {
list.set(index, element);
}else {
list.add(element);
}
return list;
}

// ---------------------------------------------------------------------------------------------- Interface start
/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ public ClassPathResource(String pathBaseClassLoader, ClassLoader classLoader, Cl
this.path = normalizePath(pathBaseClassLoader);
this.classLoader = (classLoader != null) ? classLoader : ClassUtil.getClassLoader();
this.clazz = clazz;
this.name = FileUtil.file(this.path).getName();
this.name = StrUtil.isBlank(this.path) ? null : FileUtil.file(this.path).getName();
initUrl();
}
// -------------------------------------------------------------------------------------- Constructor end
Expand Down
18 changes: 15 additions & 3 deletions hutool-core/src/main/java/cn/hutool/core/map/MapUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,15 @@
import java.util.AbstractMap;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeMap;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.convert.Convert;
Expand All @@ -20,9 +23,6 @@
import cn.hutool.core.util.ReflectUtil;
import cn.hutool.core.util.StrUtil;

import java.util.Set;
import java.util.TreeMap;

/**
* Map相关工具类
*
Expand Down Expand Up @@ -791,6 +791,18 @@ public static Long getLong(Map<?, ?> map, Object key) {
return get(map, key, Long.class);
}

/**
* 获取Map指定key的值,并转换为{@link Date}
*
* @param map Map
* @param key 键
* @return 值
* @since 4.1.2
*/
public static Date getDate(Map<?, ?> map, Object key) {
return get(map, key, Date.class);
}

/**
* 获取Map指定key的值,并转换为指定类型
*
Expand Down
91 changes: 81 additions & 10 deletions hutool-core/src/main/java/cn/hutool/core/util/ArrayUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -371,7 +371,7 @@ public static Object[] cast(Class<?> type, Object arrayObj) throws NullPointerEx
System.arraycopy(array, 0, result, 0, array.length);
return result;
}

/**
* 将新元素添加到已有数组中<br>
* 添加新元素会生成一个新的数组,不影响原数组
Expand All @@ -388,6 +388,58 @@ public static <T> T[] append(T[] buffer, T... newElements) {
}
return insert(buffer, buffer.length, newElements);
}

/**
* 将新元素添加到已有数组中<br>
* 添加新元素会生成一个新的数组,不影响原数组
*
* @param <T> 数组元素类型
* @param array 已有数组
* @param newElements 新元素
* @return 新数组
*/
@SafeVarargs
public static <T> Object append(Object array, T... newElements) {
if(isEmpty(array)) {
return newElements;
}
return insert(array, length(array), newElements);
}

/**
* 将元素值设置为数组的某个位置,当给定的index大于数组长度,则追加
*
* @param <T> 数组元素类型
* @param buffer 已有数组
* @param newElements 新元素
* @return 新数组或原有数组
* @since 4.1.2
*/
public static <T> T[] setOrAppend(T[] buffer, int index, T value) {
if(index < buffer.length) {
Array.set(buffer, index, value);
return buffer;
}else {
return append(buffer, value);
}
}

/**
* 将元素值设置为数组的某个位置,当给定的index大于数组长度,则追加
*
* @param array 已有数组
* @param newElements 新元素
* @return 新数组或原有数组
* @since 4.1.2
*/
public static Object setOrAppend(Object array, int index, Object value) {
if(index < length(array)) {
Array.set(array, index, value);
return array;
}else {
return append(array, value);
}
}

/**
* 将新元素插入到到已有数组中的某个位置<br>
Expand All @@ -401,23 +453,42 @@ public static <T> T[] append(T[] buffer, T... newElements) {
* @return 新数组
* @since 4.0.8
*/
@SafeVarargs
@SuppressWarnings("unchecked")
public static <T> T[] insert(T[] buffer, int index, T... newElements) {
return (T[]) insert((Object)buffer, index, newElements);
}

/**
* 将新元素插入到到已有数组中的某个位置<br>
* 添加新元素会生成一个新的数组,不影响原数组<br>
* 如果插入位置为为负数,从原数组从后向前计数,若大于原数组长度,则空白处用null填充
*
* @param <T> 数组元素类型
* @param array 已有数组
* @param index 插入位置,此位置为对应此位置元素之前的空档
* @param newElements 新元素
* @return 新数组
* @since 4.0.8
*/
@SuppressWarnings("unchecked")
public static <T> Object insert(Object array, int index, T... newElements) {
if (isEmpty(newElements)) {
return buffer;
return array;
}
if(isEmpty(buffer)) {
if(isEmpty(array)) {
return newElements;
}

final int len = length(array);
if (index < 0) {
index = (index % buffer.length) + buffer.length;
index = (index % len) + len;
}

final T[] result = newArray(buffer.getClass().getComponentType(), Math.max(buffer.length, index) + newElements.length);
System.arraycopy(buffer, 0, result, 0, Math.min(buffer.length, index));
final T[] result = newArray(array.getClass().getComponentType(), Math.max(len, index) + newElements.length);
System.arraycopy(array, 0, result, 0, Math.min(len, index));
System.arraycopy(newElements, 0, result, index, newElements.length);
if (index < buffer.length) {
System.arraycopy(buffer, index, result, index + newElements.length, buffer.length - index);
if (index < len) {
System.arraycopy(array, index, result, index + newElements.length, len - index);
}
return result;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,13 @@ public void readStringTest() throws IOException{
Assert.assertTrue(StrUtil.isNotEmpty(content));
}

@Test
public void readStringTest2() throws IOException{
ClassPathResource resource = new ClassPathResource("/");
String content = resource.readUtf8Str();
Assert.assertTrue(StrUtil.isNotEmpty(content));
}

@Test
public void readTest() throws IOException{
ClassPathResource resource = new ClassPathResource("test.properties");
Expand Down
17 changes: 17 additions & 0 deletions hutool-crypto/src/test/java/cn/hutool/crypto/test/SignTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -70,4 +70,21 @@ private void signAndVerify(SignAlgorithm signAlgorithm) {
boolean verify = sign.verify(data, signed);
Assert.assertTrue(verify);
}

/**
* 测试MD5withRSA算法的签名和验证签名
*/
@Test
public void signAndVerify2() {
String str = "wx2421b1c4370ec43b 支付测试 JSAPI支付测试 10000100 1add1a30ac87aa2db72f57a2375d8fec http://wxpay.wxutil.com/pub_v2/pay/notify.v2.php oUpF8uMuAJO_M2pxb1Q9zNjWeS6o 1415659990 14.23.150.211 1 JSAPI 0CB01533B8C1EF103065174F50BCA001";
byte[] data = StrUtil.utf8Bytes(str);
Sign sign = SecureUtil.sign(SignAlgorithm.MD5withRSA);

// 签名
byte[] signed = sign.sign(data);

// 验证签名
boolean verify = sign.verify(data, signed);
Assert.assertTrue(verify);
}
}
2 changes: 1 addition & 1 deletion hutool-json/src/main/java/cn/hutool/json/JSON.java
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ public interface JSON extends Serializable{
/**
* 设置表达式指定位置(或filed对应)的值<br>
* 若表达式指向一个JSONArray则设置其坐标对应位置的值,若指向JSONObject则put对应key的值<br>
* 注意:如果为JSONArray,则设置值得下标不能大于已有JSONArray的长度<br>
* 注意:如果为JSONArray,设置值下标小于其长度,将替换原有值,否则追加新值<br>
* <ol>
* <li>.表达式,可以获取Bean对象中的属性(字段)值或者Map中key对应的值</li>
* <li>[]表达式,可以获取集合等对象中对应index的值</li>
Expand Down

0 comments on commit 52e68c8

Please sign in to comment.