This commit is contained in:
Looly 2020-04-04 01:34:54 +08:00
parent 6b13cb5263
commit 24a300e348
36 changed files with 228 additions and 380 deletions

View File

@ -24,6 +24,7 @@
### Bug修复 ### Bug修复
* 【extra 】 修复SpringUtil使用devtools重启报错问题 * 【extra 】 修复SpringUtil使用devtools重启报错问题
* 【http 】 修复HttpUtil.encodeParams针对无参数URL问题issue#817@Github * 【http 】 修复HttpUtil.encodeParams针对无参数URL问题issue#817@Github
* 【extra 】 修复模板中无效引用的问题
------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------

View File

@ -184,7 +184,6 @@ public abstract class AbstractCache<K, V> implements Cache<K, V> {
// ---------------------------------------------------------------- get end // ---------------------------------------------------------------- get end
@SuppressWarnings("NullableProblems")
@Override @Override
public Iterator<V> iterator() { public Iterator<V> iterator() {
CacheObjIterator<K, V> copiedIterator = (CacheObjIterator<K, V>) this.cacheObjIterator(); CacheObjIterator<K, V> copiedIterator = (CacheObjIterator<K, V>) this.cacheObjIterator();

View File

@ -1,17 +1,16 @@
package cn.hutool.captcha; package cn.hutool.captcha;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.util.concurrent.ThreadLocalRandom;
import cn.hutool.core.img.GraphicsUtil; import cn.hutool.core.img.GraphicsUtil;
import cn.hutool.core.img.ImgUtil; import cn.hutool.core.img.ImgUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.RandomUtil;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.util.concurrent.ThreadLocalRandom;
/** /**
* 圆圈干扰验证码 * 圆圈干扰验证码
* *
@ -73,7 +72,7 @@ public class CircleCaptcha extends AbstractCaptcha {
/** /**
* 绘制字符串 * 绘制字符串
* *
* @param g {@link Graphics}画笔 * @param g {@link Graphics2D}画笔
* @param code 验证码 * @param code 验证码
*/ */
private void drawString(Graphics2D g, String code) { private void drawString(Graphics2D g, String code) {

View File

@ -1,14 +1,5 @@
package cn.hutool.core.bean; package cn.hutool.core.bean;
import java.io.Serializable;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.Map;
import cn.hutool.core.annotation.Alias;
import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.Assert;
import cn.hutool.core.map.CaseInsensitiveMap; import cn.hutool.core.map.CaseInsensitiveMap;
import cn.hutool.core.util.BooleanUtil; import cn.hutool.core.util.BooleanUtil;
@ -18,6 +9,14 @@ import cn.hutool.core.util.ReflectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.hutool.core.util.TypeUtil; import cn.hutool.core.util.TypeUtil;
import java.io.Serializable;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.Map;
/** /**
* Bean信息描述做为BeanInfo替代方案此对象持有JavaBean中的setters和getters等相关信息描述<br> * Bean信息描述做为BeanInfo替代方案此对象持有JavaBean中的setters和getters等相关信息描述<br>
* 查找Getter和Setter方法时会 * 查找Getter和Setter方法时会
@ -322,7 +321,7 @@ public class BeanDesc implements Serializable{
} }
/** /**
* 获取字段名如果存在{@link Alias}注解读取注解的值作为名称 * 获取字段名如果存在Alias注解读取注解的值作为名称
* *
* @return 字段名 * @return 字段名
*/ */

View File

@ -2,8 +2,6 @@ package cn.hutool.core.bean.copier;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import cn.hutool.core.convert.Convert;
/** /**
* 值提供者用于提供Bean注入时参数对应值得抽象接口<br> * 值提供者用于提供Bean注入时参数对应值得抽象接口<br>
* 继承或匿名实例化此接口<br> * 继承或匿名实例化此接口<br>
@ -17,7 +15,7 @@ public interface ValueProvider<T>{
/** /**
* 获取值<br> * 获取值<br>
* 返回值一般需要匹配被注入类型如果不匹配会调用默认转换 {@link Convert#convert(Type, Object)}实现转换 * 返回值一般需要匹配被注入类型如果不匹配会调用默认转换 Convert#convert(Type, Object)实现转换
* *
* @param key Bean对象中参数名 * @param key Bean对象中参数名
* @param valueType 被注入的值得类型 * @param valueType 被注入的值得类型

View File

@ -25,9 +25,9 @@ public class GenericEnumConverter<E extends Enum<E>> extends AbstractConverter<E
this.enumClass = enumClass; this.enumClass = enumClass;
} }
@SuppressWarnings("unchecked")
@Override @Override
protected E convertInternal(Object value) { protected E convertInternal(Object value) {
//noinspection unchecked
E enumValue = (E) EnumConverter.tryConvertEnum(value, this.enumClass); E enumValue = (E) EnumConverter.tryConvertEnum(value, this.enumClass);
if(null == enumValue && false == value instanceof String){ if(null == enumValue && false == value instanceof String){
// 最后尝试valueOf转换 // 最后尝试valueOf转换

View File

@ -1,5 +1,12 @@
package cn.hutool.core.io.file; package cn.hutool.core.io.file;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.lang.copier.SrcToDestCopier;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.StrUtil;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.nio.file.CopyOption; import java.nio.file.CopyOption;
@ -7,12 +14,6 @@ import java.nio.file.Files;
import java.nio.file.StandardCopyOption; import java.nio.file.StandardCopyOption;
import java.util.ArrayList; import java.util.ArrayList;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.lang.copier.SrcToDestCopier;
import cn.hutool.core.util.StrUtil;
/** /**
* 文件拷贝器<br> * 文件拷贝器<br>
* 支持以下几种情况 * 支持以下几种情况
@ -212,12 +213,14 @@ public class FileCopier extends SrcToDestCopier<File, FileCopier>{
if (false == dest.exists()) { if (false == dest.exists()) {
//目标为不存在路径创建为目录 //目标为不存在路径创建为目录
//noinspection ResultOfMethodCallIgnored
dest.mkdirs(); dest.mkdirs();
} else if (false == dest.isDirectory()) { } else if (false == dest.isDirectory()) {
throw new IORuntimeException(StrUtil.format("Src [{}] is a directory but dest [{}] is a file!", src.getPath(), dest.getPath())); throw new IORuntimeException(StrUtil.format("Src [{}] is a directory but dest [{}] is a file!", src.getPath(), dest.getPath()));
} }
final String[] files = src.list(); final String[] files = src.list();
if(ArrayUtil.isNotEmpty(files)){
File srcFile; File srcFile;
File destFile; File destFile;
for (String file : files) { for (String file : files) {
@ -231,6 +234,7 @@ public class FileCopier extends SrcToDestCopier<File, FileCopier>{
} }
} }
} }
}
/** /**
* 拷贝文件只用于内部不做任何安全检查<br> * 拷贝文件只用于内部不做任何安全检查<br>
@ -263,6 +267,7 @@ public class FileCopier extends SrcToDestCopier<File, FileCopier>{
} }
}else { }else {
//路径不存在则创建父目录 //路径不存在则创建父目录
//noinspection ResultOfMethodCallIgnored
dest.getParentFile().mkdirs(); dest.getParentFile().mkdirs();
} }
@ -275,7 +280,7 @@ public class FileCopier extends SrcToDestCopier<File, FileCopier>{
} }
try { try {
Files.copy(src.toPath(), dest.toPath(), optionList.toArray(new CopyOption[optionList.size()])); Files.copy(src.toPath(), dest.toPath(), optionList.toArray(new CopyOption[0]));
} catch (IOException e) { } catch (IOException e) {
throw new IORuntimeException(e); throw new IORuntimeException(e);
} }

View File

@ -1,11 +1,5 @@
package cn.hutool.core.net.multipart; package cn.hutool.core.net.multipart;
import cn.hutool.core.util.URLUtil;
import cn.hutool.log.Log;
import cn.hutool.setting.Setting;
import java.net.URL;
/** /**
* 上传文件设定文件 * 上传文件设定文件
* *
@ -13,10 +7,6 @@ import java.net.URL;
* *
*/ */
public class UploadSetting { public class UploadSetting {
private static final Log log = Log.get();
/** 默认的配置文件路径相对ClassPath */
public final static String DEFAULT_SETTING_PATH = "config/upload.setting";
/** 最大文件大小,默认无限制 */ /** 最大文件大小,默认无限制 */
protected int maxFileSize = -1; protected int maxFileSize = -1;
@ -117,32 +107,4 @@ public class UploadSetting {
this.isAllowFileExts = isAllowFileExts; this.isAllowFileExts = isAllowFileExts;
} }
// ---------------------------------------------------------------------- Setters and Getters end // ---------------------------------------------------------------------- Setters and Getters end
/**
* 加载全局设定<br>
* 使用默认的配置文件classpath/config/upload.setting
*/
public void load() {
load(DEFAULT_SETTING_PATH);
}
/**
* 加载全局设定
*
* @param settingPath 设定文件路径相对Classpath
*/
synchronized public void load(String settingPath) {
URL url = URLUtil.getURL(settingPath);
if (url == null) {
log.info("Can not find Upload setting file [{}], use default setting.", settingPath);
return;
}
Setting setting = new Setting(url, Setting.DEFAULT_CHARSET, true);
maxFileSize = setting.getInt("file.size.max");
memoryThreshold = setting.getInt("memory.threshold");
tmpUploadPath = setting.getStr("tmp.upload.path");
fileExts = setting.getStrings("file.exts");
isAllowFileExts = setting.getBool("file.exts.allow");
}
} }

View File

@ -1,10 +1,5 @@
package cn.hutool.crypto.asymmetric; package cn.hutool.crypto.asymmetric;
import java.io.InputStream;
import java.nio.charset.Charset;
import java.security.PrivateKey;
import java.security.PublicKey;
import cn.hutool.core.codec.BCD; import cn.hutool.core.codec.BCD;
import cn.hutool.core.codec.Base64; import cn.hutool.core.codec.Base64;
import cn.hutool.core.io.IORuntimeException; import cn.hutool.core.io.IORuntimeException;
@ -12,9 +7,13 @@ import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.HexUtil; import cn.hutool.core.util.HexUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.CryptoException;
import cn.hutool.crypto.SecureUtil; import cn.hutool.crypto.SecureUtil;
import java.io.InputStream;
import java.nio.charset.Charset;
import java.security.PrivateKey;
import java.security.PublicKey;
/** /**
* 抽象的非对称加密对象包装了加密和解密为Hex和Base64的封装 * 抽象的非对称加密对象包装了加密和解密为Hex和Base64的封装
* *
@ -201,7 +200,6 @@ public abstract class AbstractAsymmetricCrypto<T extends AbstractAsymmetricCrypt
* @param data 数据 * @param data 数据
* @param keyType 密钥类型 * @param keyType 密钥类型
* @return 加密后的密文 * @return 加密后的密文
* @throws CryptoException 加密异常
* @since 4.1.0 * @since 4.1.0
*/ */
public String encryptBcd(String data, KeyType keyType) { public String encryptBcd(String data, KeyType keyType) {
@ -215,7 +213,6 @@ public abstract class AbstractAsymmetricCrypto<T extends AbstractAsymmetricCrypt
* @param keyType 密钥类型 * @param keyType 密钥类型
* @param charset 加密前编码 * @param charset 加密前编码
* @return 加密后的密文 * @return 加密后的密文
* @throws CryptoException 加密异常
* @since 4.1.0 * @since 4.1.0
*/ */
public String encryptBcd(String data, KeyType keyType, Charset charset) { public String encryptBcd(String data, KeyType keyType, Charset charset) {

View File

@ -1,16 +1,5 @@
package cn.hutool.db; package cn.hutool.db;
import java.io.Closeable;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
import cn.hutool.core.convert.Convert; import cn.hutool.core.convert.Convert;
import cn.hutool.core.io.IoUtil; import cn.hutool.core.io.IoUtil;
import cn.hutool.db.dialect.Dialect; import cn.hutool.db.dialect.Dialect;
@ -22,6 +11,11 @@ import cn.hutool.log.LogFactory;
import cn.hutool.log.level.Level; import cn.hutool.log.level.Level;
import cn.hutool.setting.Setting; import cn.hutool.setting.Setting;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
import java.sql.Connection;
/** /**
* 数据库操作工具类 * 数据库操作工具类
* *
@ -156,33 +150,14 @@ public final class DbUtil {
* *
* @param objsToClose 需要关闭的对象 * @param objsToClose 需要关闭的对象
*/ */
@SuppressWarnings("ConstantConditions")
public static void close(Object... objsToClose) { public static void close(Object... objsToClose) {
for (Object obj : objsToClose) { for (Object obj : objsToClose) {
if (obj instanceof AutoCloseable) { if (obj instanceof AutoCloseable) {
IoUtil.close((AutoCloseable) obj); IoUtil.close((AutoCloseable) obj);
} else if (obj instanceof Closeable) {
IoUtil.close((Closeable) obj);
} else {
try {
if (obj != null) {
if (obj instanceof ResultSet) {
((ResultSet) obj).close();
} else if (obj instanceof Statement) {
((Statement) obj).close();
} else if (obj instanceof PreparedStatement) {
((PreparedStatement) obj).close();
} else if (obj instanceof Connection) {
((Connection) obj).close();
} else { } else {
log.warn("Object {} not a ResultSet or Statement or PreparedStatement or Connection!", obj.getClass().getName()); log.warn("Object {} not a ResultSet or Statement or PreparedStatement or Connection!", obj.getClass().getName());
} }
} }
} catch (SQLException e) {
// ignore
}
}
}
} }
/** /**

View File

@ -1,13 +1,5 @@
package cn.hutool.db; package cn.hutool.db;
import java.io.Closeable;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Savepoint;
import javax.sql.DataSource;
import cn.hutool.core.lang.func.VoidFunc0;
import cn.hutool.core.lang.func.VoidFunc1; import cn.hutool.core.lang.func.VoidFunc1;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.hutool.db.dialect.Dialect; import cn.hutool.db.dialect.Dialect;
@ -17,6 +9,12 @@ import cn.hutool.db.sql.Wrapper;
import cn.hutool.log.Log; import cn.hutool.log.Log;
import cn.hutool.log.LogFactory; import cn.hutool.log.LogFactory;
import javax.sql.DataSource;
import java.io.Closeable;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Savepoint;
/** /**
* 数据库SQL执行会话<br> * 数据库SQL执行会话<br>
* 会话通过共用Connection而可以实现JDBC事务<br> * 会话通过共用Connection而可以实现JDBC事务<br>
@ -246,7 +244,7 @@ public class Session extends AbstractDb implements Closeable {
} }
/** /**
* 在事务中执行操作通过实现{@link VoidFunc0}接口的call方法执行多条SQL语句从而完成事务 * 在事务中执行操作通过实现{@link VoidFunc1}接口的call方法执行多条SQL语句从而完成事务
* *
* @param func 函数抽象在函数中执行多个SQL操作多个操作会被合并为同一事务 * @param func 函数抽象在函数中执行多个SQL操作多个操作会被合并为同一事务
* @throws SQLException SQL异常 * @throws SQLException SQL异常
@ -264,7 +262,7 @@ public class Session extends AbstractDb implements Closeable {
} }
/** /**
* 在事务中执行操作通过实现{@link VoidFunc0}接口的call方法执行多条SQL语句从而完成事务 * 在事务中执行操作通过实现{@link VoidFunc1}接口的call方法执行多条SQL语句从而完成事务
* *
* @param func 函数抽象在函数中执行多个SQL操作多个操作会被合并为同一事务 * @param func 函数抽象在函数中执行多个SQL操作多个操作会被合并为同一事务
* @since 3.2.3 * @since 3.2.3

View File

@ -148,7 +148,6 @@ public class HandleHelper {
* @since 3.3.1 * @since 3.3.1
*/ */
public static <T extends Entity> T handleRow(T row, int columnCount, ResultSetMetaData meta, ResultSet rs, boolean withMetaInfo) throws SQLException { public static <T extends Entity> T handleRow(T row, int columnCount, ResultSetMetaData meta, ResultSet rs, boolean withMetaInfo) throws SQLException {
String columnLabel;
int type; int type;
for (int i = 1; i <= columnCount; i++) { for (int i = 1; i <= columnCount; i++) {
type = meta.getColumnType(i); type = meta.getColumnType(i);

View File

@ -353,17 +353,6 @@ public class MongoDS implements Closeable {
log.debug("MongoDB connectionsPerHost: {}", connectionsPerHost); log.debug("MongoDB connectionsPerHost: {}", connectionsPerHost);
} }
// multiplier for connectionsPerHost for # of threads that can block if connectionsPerHost is 10, and threadsAllowedToBlockForConnectionMultiplier is 5, then 50 threads can block more than
// that and an exception will be throw --int
Integer threadsAllowedToBlockForConnectionMultiplier = setting.getInt(group + "threadsAllowedToBlockForConnectionMultiplier");
if (StrUtil.isBlank(group) == false && threadsAllowedToBlockForConnectionMultiplier == null) {
threadsAllowedToBlockForConnectionMultiplier = setting.getInt("threadsAllowedToBlockForConnectionMultiplier");
}
if (threadsAllowedToBlockForConnectionMultiplier != null) {
builder.threadsAllowedToBlockForConnectionMultiplier(threadsAllowedToBlockForConnectionMultiplier);
log.debug("MongoDB threadsAllowedToBlockForConnectionMultiplier: {}", threadsAllowedToBlockForConnectionMultiplier);
}
// 被阻塞线程从连接池获取连接的最长等待时间ms --int // 被阻塞线程从连接池获取连接的最长等待时间ms --int
Integer connectTimeout = setting.getInt(group + "connectTimeout"); Integer connectTimeout = setting.getInt(group + "connectTimeout");
if (StrUtil.isBlank(group) == false && connectTimeout == null) { if (StrUtil.isBlank(group) == false && connectTimeout == null) {

View File

@ -265,7 +265,7 @@ public class ServletUtil {
public static MultipartFormData getMultipart(ServletRequest request, UploadSetting uploadSetting) throws IORuntimeException { public static MultipartFormData getMultipart(ServletRequest request, UploadSetting uploadSetting) throws IORuntimeException {
final MultipartFormData formData = new MultipartFormData(uploadSetting); final MultipartFormData formData = new MultipartFormData(uploadSetting);
try { try {
formData.parseRequestStream(request.getInputStream(), request.getCharacterEncoding()); formData.parseRequestStream(request.getInputStream(), CharsetUtil.charset(request.getCharacterEncoding()));
} catch (IOException e) { } catch (IOException e) {
throw new IORuntimeException(e); throw new IORuntimeException(e);
} }

View File

@ -19,7 +19,6 @@ public class SpringUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext; private static ApplicationContext applicationContext;
@SuppressWarnings("NullableProblems")
@Override @Override
public void setApplicationContext(ApplicationContext applicationContext) { public void setApplicationContext(ApplicationContext applicationContext) {
SpringUtil.applicationContext = applicationContext; SpringUtil.applicationContext = applicationContext;
@ -43,8 +42,8 @@ public class SpringUtil implements ApplicationContextAware {
* @param name Bean名称 * @param name Bean名称
* @return Bean * @return Bean
*/ */
@SuppressWarnings("unchecked")
public static <T> T getBean(String name) { public static <T> T getBean(String name) {
//noinspection unchecked
return (T) applicationContext.getBean(name); return (T) applicationContext.getBean(name);
} }

View File

@ -1,10 +1,8 @@
package cn.hutool.extra.template.engine.beetl; package cn.hutool.extra.template.engine.beetl;
import java.io.IOException; import cn.hutool.core.io.FileUtil;
import java.io.Writer; import cn.hutool.core.io.IORuntimeException;
import java.nio.charset.Charset; import cn.hutool.core.util.CharsetUtil;
import java.util.Map;
import org.beetl.core.Configuration; import org.beetl.core.Configuration;
import org.beetl.core.GroupTemplate; import org.beetl.core.GroupTemplate;
import org.beetl.core.ResourceLoader; import org.beetl.core.ResourceLoader;
@ -16,9 +14,10 @@ import org.beetl.core.resource.Matcher;
import org.beetl.core.resource.StringTemplateResourceLoader; import org.beetl.core.resource.StringTemplateResourceLoader;
import org.beetl.core.resource.WebAppResourceLoader; import org.beetl.core.resource.WebAppResourceLoader;
import cn.hutool.core.io.FileUtil; import java.io.IOException;
import cn.hutool.core.io.IORuntimeException; import java.io.Writer;
import cn.hutool.core.util.CharsetUtil; import java.nio.charset.Charset;
import java.util.Map;
/** /**
* Beetl模板引擎工具类<br> * Beetl模板引擎工具类<br>
@ -26,7 +25,9 @@ import cn.hutool.core.util.CharsetUtil;
* 文档http://ibeetl.com/guide/beetl.html * 文档http://ibeetl.com/guide/beetl.html
* *
* @author Looly * @author Looly
* @deprecated 使用TemplateUtil替代
*/ */
@Deprecated
public final class BeetlUtil { public final class BeetlUtil {
/** /**

View File

@ -8,7 +8,6 @@ import cn.hutool.extra.template.TemplateConfig;
import cn.hutool.extra.template.TemplateConfig.ResourceMode; import cn.hutool.extra.template.TemplateConfig.ResourceMode;
import cn.hutool.extra.template.TemplateEngine; import cn.hutool.extra.template.TemplateEngine;
import com.jfinal.template.source.FileSourceFactory; import com.jfinal.template.source.FileSourceFactory;
import org.beetl.core.GroupTemplate;
/** /**
* Enjoy库的引擎包装 * Enjoy库的引擎包装
@ -80,7 +79,7 @@ public class EnjoyEngine implements TemplateEngine {
* 创建引擎 * 创建引擎
* *
* @param config 模板配置 * @param config 模板配置
* @return {@link GroupTemplate} * @return {@link com.jfinal.template.Engine}
*/ */
private static com.jfinal.template.Engine createEngine(TemplateConfig config) { private static com.jfinal.template.Engine createEngine(TemplateConfig config) {
final com.jfinal.template.Engine engine = com.jfinal.template.Engine.create("Hutool-Enjoy-Engine-" + IdUtil.fastSimpleUUID()); final com.jfinal.template.Engine engine = com.jfinal.template.Engine.create("Hutool-Enjoy-Engine-" + IdUtil.fastSimpleUUID());

View File

@ -1,11 +1,10 @@
package cn.hutool.extra.template.engine.freemarker; package cn.hutool.extra.template.engine.freemarker;
import java.io.IOException; import freemarker.cache.TemplateLoader;
import java.io.Reader; import java.io.Reader;
import java.io.StringReader; import java.io.StringReader;
import freemarker.cache.TemplateLoader;
/** /**
* {@link TemplateLoader} 字符串实现形式<br> * {@link TemplateLoader} 字符串实现形式<br>
* 用于直接获取字符串模板 * 用于直接获取字符串模板
@ -16,7 +15,7 @@ import freemarker.cache.TemplateLoader;
public class SimpleStringTemplateLoader implements TemplateLoader { public class SimpleStringTemplateLoader implements TemplateLoader {
@Override @Override
public Object findTemplateSource(String name) throws IOException { public Object findTemplateSource(String name) {
return name; return name;
} }
@ -26,12 +25,12 @@ public class SimpleStringTemplateLoader implements TemplateLoader {
} }
@Override @Override
public Reader getReader(Object templateSource, String encoding) throws IOException { public Reader getReader(Object templateSource, String encoding) {
return new StringReader((String) templateSource); return new StringReader((String) templateSource);
} }
@Override @Override
public void closeTemplateSource(Object templateSource) throws IOException { public void closeTemplateSource(Object templateSource) {
// ignore // ignore
} }

View File

@ -1,15 +1,14 @@
package cn.hutool.extra.template.engine.rythm; package cn.hutool.extra.template.engine.rythm;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.lang.TypeReference;
import cn.hutool.extra.template.AbstractTemplate;
import java.io.OutputStream; import java.io.OutputStream;
import java.io.Serializable; import java.io.Serializable;
import java.io.Writer; import java.io.Writer;
import java.util.Map; import java.util.Map;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.lang.TypeReference;
import cn.hutool.extra.template.AbstractTemplate;
import cn.hutool.extra.template.engine.beetl.BeetlTemplate;
/** /**
* Rythm模板包装 * Rythm模板包装
* *
@ -25,7 +24,7 @@ public class RythmTemplate extends AbstractTemplate implements Serializable {
* 包装Rythm模板 * 包装Rythm模板
* *
* @param template Rythm的模板对象 {@link org.rythmengine.template.ITemplate} * @param template Rythm的模板对象 {@link org.rythmengine.template.ITemplate}
* @return {@link BeetlTemplate} * @return {@link RythmTemplate}
*/ */
public static RythmTemplate wrap(org.rythmengine.template.ITemplate template) { public static RythmTemplate wrap(org.rythmengine.template.ITemplate template) {
return (null == template) ? null : new RythmTemplate(template); return (null == template) ? null : new RythmTemplate(template);

View File

@ -1,5 +1,16 @@
package cn.hutool.extra.template.engine.velocity; package cn.hutool.extra.template.engine.velocity;
import cn.hutool.core.exceptions.NotInitedException;
import cn.hutool.core.exceptions.UtilException;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.IdUtil;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.app.VelocityEngine;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.io.StringWriter; import java.io.StringWriter;
import java.io.Writer; import java.io.Writer;
@ -9,30 +20,23 @@ import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.Properties; import java.util.Properties;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.app.VelocityEngine;
import cn.hutool.core.exceptions.NotInitedException;
import cn.hutool.core.exceptions.UtilException;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.IdUtil;
/** /**
* Velocity模板引擎工具类<br> * Velocity模板引擎工具类<br>
* 使用前必须初始化工具类 * 使用前必须初始化工具类
* *
* @author xiaoleilu * @author xiaoleilu
* * @deprecated 使用TemplateUtil替代
*/ */
@Deprecated
public class VelocityUtil { public class VelocityUtil {
/** 是否初始化了默认引擎 */ /**
* 是否初始化了默认引擎
*/
private static boolean isInited; private static boolean isInited;
/** 全局上下文,当设定值时,对于每个模板都有效 */ /**
* 全局上下文当设定值时对于每个模板都有效
*/
private static Map<String, Object> globalContext = new HashMap<>(); private static Map<String, Object> globalContext = new HashMap<>();
/** /**
@ -309,6 +313,7 @@ public class VelocityUtil {
} }
// -------------------------------------------------------------------------- Private method start // -------------------------------------------------------------------------- Private method start
/** /**
* 新建一个初始化后的属性对象 * 新建一个初始化后的属性对象
* *

View File

@ -49,7 +49,6 @@ public abstract class AbstractResult implements Result{
throw new UnsupportedOperationException("Jcseg result not allow to remove !"); throw new UnsupportedOperationException("Jcseg result not allow to remove !");
} }
@SuppressWarnings("NullableProblems")
@Override @Override
public Iterator<Word> iterator() { public Iterator<Word> iterator() {
return this; return this;

View File

@ -63,7 +63,6 @@ public class JcsegResult implements Result{
throw new UnsupportedOperationException("Jcseg result not allow to remove !"); throw new UnsupportedOperationException("Jcseg result not allow to remove !");
} }
@SuppressWarnings("NullableProblems")
@Override @Override
public Iterator<Word> iterator() { public Iterator<Word> iterator() {
return this; return this;

View File

@ -1,12 +1,6 @@
package cn.hutool.extra.tokenizer; package cn.hutool.extra.tokenizer;
import java.util.Iterator; import cn.hutool.core.collection.IterUtil;
import org.junit.Assert;
import org.junit.Ignore;
import org.junit.Test;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.extra.tokenizer.engine.analysis.SmartcnEngine; import cn.hutool.extra.tokenizer.engine.analysis.SmartcnEngine;
import cn.hutool.extra.tokenizer.engine.hanlp.HanLPEngine; import cn.hutool.extra.tokenizer.engine.hanlp.HanLPEngine;
import cn.hutool.extra.tokenizer.engine.ikanalyzer.IKAnalyzerEngine; import cn.hutool.extra.tokenizer.engine.ikanalyzer.IKAnalyzerEngine;
@ -15,6 +9,11 @@ import cn.hutool.extra.tokenizer.engine.jieba.JiebaEngine;
import cn.hutool.extra.tokenizer.engine.mmseg.MmsegEngine; import cn.hutool.extra.tokenizer.engine.mmseg.MmsegEngine;
import cn.hutool.extra.tokenizer.engine.mynlp.MynlpEngine; import cn.hutool.extra.tokenizer.engine.mynlp.MynlpEngine;
import cn.hutool.extra.tokenizer.engine.word.WordEngine; import cn.hutool.extra.tokenizer.engine.word.WordEngine;
import org.junit.Assert;
import org.junit.Ignore;
import org.junit.Test;
import java.util.Iterator;
/** /**
* 模板引擎单元测试 * 模板引擎单元测试
@ -38,7 +37,7 @@ public class TokenizerUtilTest {
public void hanlpTest() { public void hanlpTest() {
TokenizerEngine engine = new HanLPEngine(); TokenizerEngine engine = new HanLPEngine();
Result result = engine.parse(text); Result result = engine.parse(text);
String resultStr = CollUtil.join((Iterator<Word>)result, " "); String resultStr = IterUtil.join((Iterator<Word>)result, " ");
Assert.assertEquals("这 两 个 方法 的 区别 在于 返回 值", resultStr); Assert.assertEquals("这 两 个 方法 的 区别 在于 返回 值", resultStr);
} }
@ -46,7 +45,7 @@ public class TokenizerUtilTest {
public void ikAnalyzerTest() { public void ikAnalyzerTest() {
TokenizerEngine engine = new IKAnalyzerEngine(); TokenizerEngine engine = new IKAnalyzerEngine();
Result result = engine.parse(text); Result result = engine.parse(text);
String resultStr = CollUtil.join((Iterator<Word>)result, " "); String resultStr = IterUtil.join((Iterator<Word>)result, " ");
Assert.assertEquals("这两个 方法 的 区别 在于 返回值", resultStr); Assert.assertEquals("这两个 方法 的 区别 在于 返回值", resultStr);
} }
@ -61,7 +60,7 @@ public class TokenizerUtilTest {
public void jiebaTest() { public void jiebaTest() {
TokenizerEngine engine = new JiebaEngine(); TokenizerEngine engine = new JiebaEngine();
Result result = engine.parse(text); Result result = engine.parse(text);
String resultStr = CollUtil.join((Iterator<Word>)result, " "); String resultStr = IterUtil.join((Iterator<Word>)result, " ");
Assert.assertEquals("这 两个 方法 的 区别 在于 返回值", resultStr); Assert.assertEquals("这 两个 方法 的 区别 在于 返回值", resultStr);
} }
@ -76,7 +75,7 @@ public class TokenizerUtilTest {
public void smartcnTest() { public void smartcnTest() {
TokenizerEngine engine = new SmartcnEngine(); TokenizerEngine engine = new SmartcnEngine();
Result result = engine.parse(text); Result result = engine.parse(text);
String resultStr = CollUtil.join((Iterator<Word>)result, " "); String resultStr = IterUtil.join((Iterator<Word>)result, " ");
Assert.assertEquals("这 两 个 方法 的 区别 在于 返回 值", resultStr); Assert.assertEquals("这 两 个 方法 的 区别 在于 返回 值", resultStr);
} }
@ -84,7 +83,7 @@ public class TokenizerUtilTest {
public void wordTest() { public void wordTest() {
TokenizerEngine engine = new WordEngine(); TokenizerEngine engine = new WordEngine();
Result result = engine.parse(text); Result result = engine.parse(text);
String resultStr = CollUtil.join((Iterator<Word>)result, " "); String resultStr = IterUtil.join((Iterator<Word>)result, " ");
Assert.assertEquals("这两个 方法 的 区别 在于 返回值", resultStr); Assert.assertEquals("这两个 方法 的 区别 在于 返回值", resultStr);
} }
@ -94,12 +93,12 @@ public class TokenizerUtilTest {
// 此单元测试需要JDK8默认忽略 // 此单元测试需要JDK8默认忽略
TokenizerEngine engine = new MynlpEngine(); TokenizerEngine engine = new MynlpEngine();
Result result = engine.parse(text); Result result = engine.parse(text);
String resultStr = CollUtil.join((Iterator<Word>)result, " "); String resultStr = IterUtil.join((Iterator<Word>)result, " ");
Assert.assertEquals("这 两个 方法 的 区别 在于 返回 值", resultStr); Assert.assertEquals("这 两个 方法 的 区别 在于 返回 值", resultStr);
} }
private void checkResult(Result result) { private void checkResult(Result result) {
String resultStr = CollUtil.join((Iterator<Word>)result, " "); String resultStr = IterUtil.join((Iterator<Word>)result, " ");
Assert.assertEquals("这 两个 方法 的 区别 在于 返回 值", resultStr); Assert.assertEquals("这 两个 方法 的 区别 在于 返回 值", resultStr);
} }
} }

View File

@ -1,9 +1,7 @@
package cn.hutool.http.ssl; package cn.hutool.http.ssl;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.X509TrustManager; import javax.net.ssl.X509TrustManager;
import java.security.cert.X509Certificate;
/** /**
* 证书管理 * 证书管理

View File

@ -1,11 +1,5 @@
package cn.hutool.http.test; package cn.hutool.http.test;
import java.util.List;
import java.util.Map;
import org.junit.Ignore;
import org.junit.Test;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.core.date.TimeInterval; import cn.hutool.core.date.TimeInterval;
import cn.hutool.core.lang.Console; import cn.hutool.core.lang.Console;
@ -13,6 +7,11 @@ import cn.hutool.core.util.CharsetUtil;
import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse; import cn.hutool.http.HttpResponse;
import cn.hutool.http.ssl.SSLSocketFactoryBuilder; import cn.hutool.http.ssl.SSLSocketFactoryBuilder;
import org.junit.Ignore;
import org.junit.Test;
import java.util.List;
import java.util.Map;
/** /**
* {@link HttpRequest}单元测试 * {@link HttpRequest}单元测试
@ -37,6 +36,7 @@ public class HttpRequestTest {
HttpResponse res = HttpRequest.get("https://www.oschina.net/").execute(); HttpResponse res = HttpRequest.get("https://www.oschina.net/").execute();
String body = res.body(); String body = res.body();
Console.log(res.getCookies()); Console.log(res.getCookies());
Console.log(body);
} }
@Test @Test

View File

@ -1,5 +1,12 @@
package cn.hutool.json; package cn.hutool.json;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.CharUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import java.io.IOException; import java.io.IOException;
import java.io.Writer; import java.io.Writer;
import java.time.temporal.TemporalAccessor; import java.time.temporal.TemporalAccessor;
@ -9,13 +16,6 @@ import java.util.Date;
import java.util.Iterator; import java.util.Iterator;
import java.util.Map; import java.util.Map;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.CharUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
/** /**
* 内部JSON工具类仅用于JSON内部使用 * 内部JSON工具类仅用于JSON内部使用
* *
@ -197,11 +197,11 @@ final class InternalJSONUtil {
JSONObject nextTarget = target.getJSONObject(segment); JSONObject nextTarget = target.getJSONObject(segment);
if (nextTarget == null) { if (nextTarget == null) {
nextTarget = new JSONObject(); nextTarget = new JSONObject();
target.put(segment, nextTarget); target.set(segment, nextTarget);
} }
target = nextTarget; target = nextTarget;
} }
target.put(path[last], value); target.set(path[last], value);
return jsonObject; return jsonObject;
} }

View File

@ -1,12 +1,5 @@
package cn.hutool.log; package cn.hutool.log;
import cn.hutool.log.dialect.commons.ApacheCommonsLogFactory;
import cn.hutool.log.dialect.console.ConsoleLogFactory;
import cn.hutool.log.dialect.jdk.JdkLogFactory;
import cn.hutool.log.dialect.log4j.Log4jLogFactory;
import cn.hutool.log.dialect.log4j2.Log4j2LogFactory;
import cn.hutool.log.dialect.slf4j.Slf4jLogFactory;
/** /**
* 全局日志工厂类<br> * 全局日志工厂类<br>
* 用于减少日志工厂创建减少日志库探测 * 用于减少日志工厂创建减少日志库探测
@ -37,12 +30,12 @@ public class GlobalLogFactory {
/** /**
* 自定义日志实现 * 自定义日志实现
* *
* @see Slf4jLogFactory * @see cn.hutool.log.dialect.slf4j.Slf4jLogFactory
* @see Log4jLogFactory * @see cn.hutool.log.dialect.log4j.Log4jLogFactory
* @see Log4j2LogFactory * @see cn.hutool.log.dialect.log4j2.Log4j2LogFactory
* @see ApacheCommonsLogFactory * @see cn.hutool.log.dialect.commons.ApacheCommonsLogFactory
* @see JdkLogFactory * @see cn.hutool.log.dialect.jdk.JdkLogFactory
* @see ConsoleLogFactory * @see cn.hutool.log.dialect.console.ConsoleLogFactory
* *
* @param logFactoryClass 日志工厂类 * @param logFactoryClass 日志工厂类
* @return 自定义的日志工厂类 * @return 自定义的日志工厂类
@ -58,12 +51,12 @@ public class GlobalLogFactory {
/** /**
* 自定义日志实现 * 自定义日志实现
* *
* @see Slf4jLogFactory * @see cn.hutool.log.dialect.slf4j.Slf4jLogFactory
* @see Log4jLogFactory * @see cn.hutool.log.dialect.log4j.Log4jLogFactory
* @see Log4j2LogFactory * @see cn.hutool.log.dialect.log4j2.Log4j2LogFactory
* @see ApacheCommonsLogFactory * @see cn.hutool.log.dialect.commons.ApacheCommonsLogFactory
* @see JdkLogFactory * @see cn.hutool.log.dialect.jdk.JdkLogFactory
* @see ConsoleLogFactory * @see cn.hutool.log.dialect.console.ConsoleLogFactory
* *
* @param logFactory 日志工厂类对象 * @param logFactory 日志工厂类对象
* @return 自定义的日志工厂类 * @return 自定义的日志工厂类

View File

@ -3,14 +3,8 @@ package cn.hutool.log;
import cn.hutool.core.io.resource.ResourceUtil; import cn.hutool.core.io.resource.ResourceUtil;
import cn.hutool.core.lang.caller.CallerUtil; import cn.hutool.core.lang.caller.CallerUtil;
import cn.hutool.core.util.ServiceLoaderUtil; import cn.hutool.core.util.ServiceLoaderUtil;
import cn.hutool.log.dialect.commons.ApacheCommonsLogFactory;
import cn.hutool.log.dialect.console.ConsoleLogFactory; import cn.hutool.log.dialect.console.ConsoleLogFactory;
import cn.hutool.log.dialect.jboss.JbossLogFactory;
import cn.hutool.log.dialect.jdk.JdkLogFactory; import cn.hutool.log.dialect.jdk.JdkLogFactory;
import cn.hutool.log.dialect.log4j.Log4jLogFactory;
import cn.hutool.log.dialect.log4j2.Log4j2LogFactory;
import cn.hutool.log.dialect.slf4j.Slf4jLogFactory;
import cn.hutool.log.dialect.tinylog.TinyLogFactory;
import java.net.URL; import java.net.URL;
import java.util.Map; import java.util.Map;
@ -20,14 +14,6 @@ import java.util.concurrent.ConcurrentHashMap;
* 日志工厂类 * 日志工厂类
* *
* @author Looly * @author Looly
* @see Slf4jLogFactory
* @see Log4j2LogFactory
* @see Log4jLogFactory
* @see ApacheCommonsLogFactory
* @see TinyLogFactory
* @see JbossLogFactory
* @see ConsoleLogFactory
* @see JdkLogFactory
*/ */
public abstract class LogFactory { public abstract class LogFactory {
@ -131,14 +117,6 @@ public abstract class LogFactory {
* *
* @param logFactoryClass 日志工厂类 * @param logFactoryClass 日志工厂类
* @return 自定义的日志工厂类 * @return 自定义的日志工厂类
* @see Slf4jLogFactory
* @see Log4j2LogFactory
* @see Log4jLogFactory
* @see ApacheCommonsLogFactory
* @see TinyLogFactory
* @see JbossLogFactory
* @see ConsoleLogFactory
* @see JdkLogFactory
*/ */
public static LogFactory setCurrentLogFactory(Class<? extends LogFactory> logFactoryClass) { public static LogFactory setCurrentLogFactory(Class<? extends LogFactory> logFactoryClass) {
return GlobalLogFactory.set(logFactoryClass); return GlobalLogFactory.set(logFactoryClass);
@ -149,14 +127,6 @@ public abstract class LogFactory {
* *
* @param logFactory 日志工厂类对象 * @param logFactory 日志工厂类对象
* @return 自定义的日志工厂类 * @return 自定义的日志工厂类
* @see Slf4jLogFactory
* @see Log4j2LogFactory
* @see Log4jLogFactory
* @see ApacheCommonsLogFactory
* @see TinyLogFactory
* @see JbossLogFactory
* @see ConsoleLogFactory
* @see JdkLogFactory
*/ */
public static LogFactory setCurrentLogFactory(LogFactory logFactory) { public static LogFactory setCurrentLogFactory(LogFactory logFactory) {
return GlobalLogFactory.set(logFactory); return GlobalLogFactory.set(logFactory);
@ -195,14 +165,6 @@ public abstract class LogFactory {
* 依次按照顺序检查日志库的jar是否被引入如果未引入任何日志库则检查ClassPath下的logging.properties存在则使用JdkLogFactory否则使用ConsoleLogFactory * 依次按照顺序检查日志库的jar是否被引入如果未引入任何日志库则检查ClassPath下的logging.properties存在则使用JdkLogFactory否则使用ConsoleLogFactory
* *
* @return 日志实现类 * @return 日志实现类
* @see Slf4jLogFactory
* @see Log4j2LogFactory
* @see Log4jLogFactory
* @see ApacheCommonsLogFactory
* @see TinyLogFactory
* @see JbossLogFactory
* @see ConsoleLogFactory
* @see JdkLogFactory
*/ */
public static LogFactory create() { public static LogFactory create() {
final LogFactory factory = doCreate(); final LogFactory factory = doCreate();
@ -216,14 +178,6 @@ public abstract class LogFactory {
* 依次按照顺序检查日志库的jar是否被引入如果未引入任何日志库则检查ClassPath下的logging.properties存在则使用JdkLogFactory否则使用ConsoleLogFactory * 依次按照顺序检查日志库的jar是否被引入如果未引入任何日志库则检查ClassPath下的logging.properties存在则使用JdkLogFactory否则使用ConsoleLogFactory
* *
* @return 日志实现类 * @return 日志实现类
* @see Slf4jLogFactory
* @see Log4j2LogFactory
* @see Log4jLogFactory
* @see ApacheCommonsLogFactory
* @see TinyLogFactory
* @see JbossLogFactory
* @see ConsoleLogFactory
* @see JdkLogFactory
*/ */
private static LogFactory doCreate() { private static LogFactory doCreate() {
final LogFactory factory = ServiceLoaderUtil.loadFirstAvailable(LogFactory.class); final LogFactory factory = ServiceLoaderUtil.loadFirstAvailable(LogFactory.class);

View File

@ -1,20 +1,5 @@
package cn.hutool.poi.excel; package cn.hutool.poi.excel;
import java.io.File;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.extractor.ExcelExtractor;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.extractor.XSSFExcelExtractor;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.IterUtil; import cn.hutool.core.collection.IterUtil;
@ -25,7 +10,20 @@ import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.hutool.poi.excel.cell.CellEditor; import cn.hutool.poi.excel.cell.CellEditor;
import cn.hutool.poi.excel.cell.CellUtil; import cn.hutool.poi.excel.cell.CellUtil;
import cn.hutool.poi.excel.editors.TrimEditor; import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.extractor.ExcelExtractor;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.extractor.XSSFExcelExtractor;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.File;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/** /**
* Excel读取器<br> * Excel读取器<br>
@ -153,7 +151,6 @@ public class ExcelReader extends ExcelBase<ExcelReader> {
* *
* @param cellEditor 单元格值处理接口 * @param cellEditor 单元格值处理接口
* @return this * @return this
* @see TrimEditor
*/ */
public ExcelReader setCellEditor(CellEditor cellEditor) { public ExcelReader setCellEditor(CellEditor cellEditor) {
this.cellEditor = cellEditor; this.cellEditor = cellEditor;

View File

@ -15,7 +15,6 @@ import cn.hutool.poi.excel.sax.handler.RowHandler;
import java.io.BufferedInputStream; import java.io.BufferedInputStream;
import java.io.File; import java.io.File;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream;
/** /**
* Excel工具类 * Excel工具类
@ -348,7 +347,7 @@ public class ExcelUtil {
// ------------------------------------------------------------------------------------------------ getWriter // ------------------------------------------------------------------------------------------------ getWriter
/** /**
* 获得{@link ExcelWriter}默认写出到第一个sheet<br> * 获得{@link ExcelWriter}默认写出到第一个sheet<br>
* 不传入写出的Excel文件路径只能调用{@link ExcelWriter#flush(OutputStream)}方法写出到流<br> * 不传入写出的Excel文件路径只能调用ExcelWriter#flush(OutputStream)方法写出到流<br>
* 若写出到文件还需调用{@link ExcelWriter#setDestFile(File)}方法自定义写出的文件然后调用{@link ExcelWriter#flush()}方法写出到文件 * 若写出到文件还需调用{@link ExcelWriter#setDestFile(File)}方法自定义写出的文件然后调用{@link ExcelWriter#flush()}方法写出到文件
* *
* @return {@link ExcelWriter} * @return {@link ExcelWriter}
@ -364,7 +363,7 @@ public class ExcelUtil {
/** /**
* 获得{@link ExcelWriter}默认写出到第一个sheet<br> * 获得{@link ExcelWriter}默认写出到第一个sheet<br>
* 不传入写出的Excel文件路径只能调用{@link ExcelWriter#flush(OutputStream)}方法写出到流<br> * 不传入写出的Excel文件路径只能调用ExcelWriter#flush(OutputStream)方法写出到流<br>
* 若写出到文件还需调用{@link ExcelWriter#setDestFile(File)}方法自定义写出的文件然后调用{@link ExcelWriter#flush()}方法写出到文件 * 若写出到文件还需调用{@link ExcelWriter#setDestFile(File)}方法自定义写出的文件然后调用{@link ExcelWriter#flush()}方法写出到文件
* *
* @param isXlsx 是否为xlsx格式 * @param isXlsx 是否为xlsx格式
@ -455,7 +454,7 @@ public class ExcelUtil {
// ------------------------------------------------------------------------------------------------ getBigWriter // ------------------------------------------------------------------------------------------------ getBigWriter
/** /**
* 获得{@link BigExcelWriter}默认写出到第一个sheet<br> * 获得{@link BigExcelWriter}默认写出到第一个sheet<br>
* 不传入写出的Excel文件路径只能调用{@link BigExcelWriter#flush(OutputStream)}方法写出到流<br> * 不传入写出的Excel文件路径只能调用ExcelWriter#flush(OutputStream)方法写出到流<br>
* 若写出到文件还需调用{@link BigExcelWriter#setDestFile(File)}方法自定义写出的文件然后调用{@link BigExcelWriter#flush()}方法写出到文件 * 若写出到文件还需调用{@link BigExcelWriter#setDestFile(File)}方法自定义写出的文件然后调用{@link BigExcelWriter#flush()}方法写出到文件
* *
* @return {@link BigExcelWriter} * @return {@link BigExcelWriter}
@ -471,7 +470,7 @@ public class ExcelUtil {
/** /**
* 获得{@link BigExcelWriter}默认写出到第一个sheet<br> * 获得{@link BigExcelWriter}默认写出到第一个sheet<br>
* 不传入写出的Excel文件路径只能调用{@link BigExcelWriter#flush(OutputStream)}方法写出到流<br> * 不传入写出的Excel文件路径只能调用ExcelWriter#flush(OutputStream)方法写出到流<br>
* 若写出到文件还需调用{@link BigExcelWriter#setDestFile(File)}方法自定义写出的文件然后调用{@link BigExcelWriter#flush()}方法写出到文件 * 若写出到文件还需调用{@link BigExcelWriter#setDestFile(File)}方法自定义写出的文件然后调用{@link BigExcelWriter#flush()}方法写出到文件
* *
* @param rowAccessWindowSize 在内存中的行数 * @param rowAccessWindowSize 在内存中的行数

View File

@ -41,10 +41,6 @@ public class Excel07SaxReader extends AbstractExcelSaxReader<Excel07SaxReader> i
* Cell中的行列号(Reference)行模式下此为行号属性名列模式下为列号属性名 * Cell中的行列号(Reference)行模式下此为行号属性名列模式下为列号属性名
*/ */
private static final String R_ATTR = "r"; private static final String R_ATTR = "r";
/**
* Cell类型
*/
private static final String T_ELEMENT = "t";
/** /**
* SSTSharedStringsTable 的索引样式index * SSTSharedStringsTable 的索引样式index
*/ */

View File

@ -1,18 +1,18 @@
package cn.hutool.setting; package cn.hutool.setting;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.StrUtil;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.Map; import java.util.Map;
import java.util.Set;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.Set;
import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock; import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock;
import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.StrUtil;
/** /**
* 基于分组的Map<br> * 基于分组的Map<br>
* 此对象方法线程安全 * 此对象方法线程安全
@ -226,7 +226,6 @@ public class GroupedMap extends LinkedHashMap<String, LinkedHashMap<String, Stri
return this; return this;
} }
@SuppressWarnings("NullableProblems")
@Override @Override
public Set<String> keySet() { public Set<String> keySet() {
readLock.lock(); readLock.lock();
@ -277,7 +276,6 @@ public class GroupedMap extends LinkedHashMap<String, LinkedHashMap<String, Stri
return Collections.emptyList(); return Collections.emptyList();
} }
@SuppressWarnings("NullableProblems")
@Override @Override
public Set<java.util.Map.Entry<String, LinkedHashMap<String, String>>> entrySet() { public Set<java.util.Map.Entry<String, LinkedHashMap<String, String>>> entrySet() {
readLock.lock(); readLock.lock();

View File

@ -1,18 +1,5 @@
package cn.hutool.setting; package cn.hutool.setting;
import java.io.File;
import java.net.URL;
import java.nio.charset.Charset;
import java.nio.file.Path;
import java.nio.file.WatchEvent;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import java.util.function.Consumer;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert; import cn.hutool.core.convert.Convert;
import cn.hutool.core.io.IoUtil; import cn.hutool.core.io.IoUtil;
@ -31,6 +18,19 @@ import cn.hutool.core.util.StrUtil;
import cn.hutool.log.StaticLog; import cn.hutool.log.StaticLog;
import cn.hutool.setting.dialect.Props; import cn.hutool.setting.dialect.Props;
import java.io.File;
import java.net.URL;
import java.nio.charset.Charset;
import java.nio.file.Path;
import java.nio.file.WatchEvent;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import java.util.function.Consumer;
/** /**
* 设置工具类 用于支持设置配置文件<br> * 设置工具类 用于支持设置配置文件<br>
* BasicSetting用于替换Properties类提供功能更加强大的配置文件同时对Properties文件向下兼容 * BasicSetting用于替换Properties类提供功能更加强大的配置文件同时对Properties文件向下兼容
@ -638,7 +638,6 @@ public class Setting extends AbsSetting implements Map<String, String> {
* *
* @param m Map * @param m Map
*/ */
@SuppressWarnings("NullableProblems")
@Override @Override
public void putAll(Map<? extends String, ? extends String> m) { public void putAll(Map<? extends String, ? extends String> m) {
this.groupedMap.putAll(DEFAULT_GROUP, m); this.groupedMap.putAll(DEFAULT_GROUP, m);
@ -657,7 +656,6 @@ public class Setting extends AbsSetting implements Map<String, String> {
* *
* @return 默认分组空分组中的所有键列表 * @return 默认分组空分组中的所有键列表
*/ */
@SuppressWarnings("NullableProblems")
@Override @Override
public Set<String> keySet() { public Set<String> keySet() {
return this.groupedMap.keySet(DEFAULT_GROUP); return this.groupedMap.keySet(DEFAULT_GROUP);
@ -668,7 +666,6 @@ public class Setting extends AbsSetting implements Map<String, String> {
* *
* @return 默认分组空分组中的所有值列表 * @return 默认分组空分组中的所有值列表
*/ */
@SuppressWarnings("NullableProblems")
@Override @Override
public Collection<String> values() { public Collection<String> values() {
return this.groupedMap.values(DEFAULT_GROUP); return this.groupedMap.values(DEFAULT_GROUP);
@ -679,7 +676,6 @@ public class Setting extends AbsSetting implements Map<String, String> {
* *
* @return 默认分组空分组中的所有键值对列表 * @return 默认分组空分组中的所有键值对列表
*/ */
@SuppressWarnings("NullableProblems")
@Override @Override
public Set<Entry<String, String>> entrySet() { public Set<Entry<String, String>> entrySet() {
return this.groupedMap.entrySet(DEFAULT_GROUP); return this.groupedMap.entrySet(DEFAULT_GROUP);

View File

@ -56,7 +56,6 @@ public class SettingUtil {
* @since 5.1.3 * @since 5.1.3
*/ */
public static Setting getFirstFound(String... names) { public static Setting getFirstFound(String... names) {
Setting setting;
for (String name : names) { for (String name : names) {
try { try {
return get(name); return get(name);

View File

@ -57,7 +57,6 @@ public class PropsUtil {
* @return 当前环境下配置文件 * @return 当前环境下配置文件
*/ */
public static Props getFirstFound(String... names) { public static Props getFirstFound(String... names) {
Props props;
for (String name : names) { for (String name : names) {
try { try {
return get(name); return get(name);

View File

@ -72,7 +72,6 @@ public class PropsTest {
@Test @Test
public void toBeanWithNullPrefixTest(){ public void toBeanWithNullPrefixTest(){
Props configProp = new Props(); Props configProp = new Props();
Boolean isInit = configProp.getBool("isInit");
configProp.setProperty("createTime", Objects.requireNonNull(DateUtil.parse("2020-01-01"))); configProp.setProperty("createTime", Objects.requireNonNull(DateUtil.parse("2020-01-01")));
configProp.setProperty("isInit", true); configProp.setProperty("isInit", true);