diff --git a/hutool-core/src/main/java/cn/hutool/core/util/IdcardUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/IdcardUtil.java
index b09afc98a..497e26b24 100755
--- a/hutool-core/src/main/java/cn/hutool/core/util/IdcardUtil.java
+++ b/hutool-core/src/main/java/cn/hutool/core/util/IdcardUtil.java
@@ -149,6 +149,19 @@ public class IdcardUtil {
return idCard18.toString();
}
+ /**
+ * 将18位身份证号码转换为15位
+ *
+ * @param idCard 18位身份编码
+ * @return 15位身份编码
+ */
+ public static String convert18To15(String idCard) {
+ if (StrUtil.isNotBlank(idCard) && IdcardUtil.isValidCard18(idCard)) {
+ return idCard.substring(0, 6) + idCard.substring(8, idCard.length() - 1);
+ }
+ return idCard;
+ }
+
/**
* 是否有效身份证号,忽略X的大小写
* 如果身份证号码中含有空格始终返回{@code false}
diff --git a/hutool-core/src/test/java/cn/hutool/core/util/IdcardUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/IdcardUtilTest.java
index 62aef6263..325665a23 100644
--- a/hutool-core/src/test/java/cn/hutool/core/util/IdcardUtilTest.java
+++ b/hutool-core/src/test/java/cn/hutool/core/util/IdcardUtilTest.java
@@ -46,6 +46,12 @@ public class IdcardUtilTest {
Assert.assertEquals("33010219200403064X", convert15To18Second);
}
+ @Test
+ public void convert18To15Test() {
+ String idcard15 = IdcardUtil.convert18To15("150102198807303035");
+ Assert.assertEquals(ID_15, idcard15);
+ }
+
@Test
public void getAgeTest() {
final DateTime date = DateUtil.parse("2017-04-10");
diff --git a/hutool-extra/src/main/java/cn/hutool/extra/ftp/Ftp.java b/hutool-extra/src/main/java/cn/hutool/extra/ftp/Ftp.java
index 174dcb4d5..7d02f8420 100755
--- a/hutool-extra/src/main/java/cn/hutool/extra/ftp/Ftp.java
+++ b/hutool-extra/src/main/java/cn/hutool/extra/ftp/Ftp.java
@@ -229,6 +229,7 @@ public class Ftp extends AbstractFtp {
}
this.client = client;
if (mode != null) {
+ //noinspection resource
setMode(mode);
}
return this;
@@ -375,7 +376,7 @@ public class Ftp extends AbstractFtp {
String pwd = null;
if (StrUtil.isNotBlank(path)) {
pwd = pwd();
- if (false == isDir(path)) {
+ if (false == cd(path)) {
throw new FtpException("Change dir to [{}] error, maybe path not exist!", path);
}
}
@@ -439,7 +440,7 @@ public class Ftp extends AbstractFtp {
final String pwd = pwd();
final String fileName = FileUtil.getName(path);
final String dir = StrUtil.removeSuffix(path, fileName);
- if (false == isDir(dir)) {
+ if (false == cd(dir)) {
throw new FtpException("Change dir to [{}] error, maybe dir not exist!", path);
}
@@ -557,7 +558,7 @@ public class Ftp extends AbstractFtp {
if (StrUtil.isNotBlank(destPath)) {
mkDirs(destPath);
- if (false == isDir(destPath)) {
+ if (false == cd(destPath)) {
throw new FtpException("Change dir to [{}] error, maybe dir not exist!", destPath);
}
}
@@ -665,7 +666,7 @@ public class Ftp extends AbstractFtp {
pwd = pwd();
}
- if (false == isDir(path)) {
+ if (false == cd(path)) {
throw new FtpException("Change dir to [{}] error, maybe dir not exist!", path);
}
diff --git a/hutool-extra/src/main/java/cn/hutool/extra/template/TemplateEngine.java b/hutool-extra/src/main/java/cn/hutool/extra/template/TemplateEngine.java
index e8bd24996..5126320e9 100644
--- a/hutool-extra/src/main/java/cn/hutool/extra/template/TemplateEngine.java
+++ b/hutool-extra/src/main/java/cn/hutool/extra/template/TemplateEngine.java
@@ -23,4 +23,11 @@ public interface TemplateEngine {
*/
Template getTemplate(String resource);
+ /**
+ * 获取原始引擎的钩子方法,用于自定义特殊属性,如插件等
+ *
+ * @return 对应模板实现的引擎对象
+ * @since 6.0.0
+ */
+ Object getRawEngine();
}
diff --git a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/beetl/BeetlEngine.java b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/beetl/BeetlEngine.java
index cdeff21ec..f82a14c25 100644
--- a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/beetl/BeetlEngine.java
+++ b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/beetl/BeetlEngine.java
@@ -72,6 +72,17 @@ public class BeetlEngine implements TemplateEngine {
return BeetlTemplate.wrap(engine.getTemplate(resource));
}
+ /**
+ * 获取原始引擎的钩子方法,用于自定义特殊属性,如插件等
+ *
+ * @return {@link GroupTemplate}
+ * @since 5.8.7
+ */
+ @Override
+ public GroupTemplate getRawEngine() {
+ return this.engine;
+ }
+
/**
* 创建引擎
*
diff --git a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/enjoy/EnjoyEngine.java b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/enjoy/EnjoyEngine.java
index 9910f1b46..b7dce0f16 100755
--- a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/enjoy/EnjoyEngine.java
+++ b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/enjoy/EnjoyEngine.java
@@ -77,6 +77,17 @@ public class EnjoyEngine implements TemplateEngine {
return EnjoyTemplate.wrap(this.engine.getTemplate(resource));
}
+ /**
+ * 获取原始引擎的钩子方法,用于自定义特殊属性,如插件等
+ *
+ * @return {@link com.jfinal.template.Engine}
+ * @since 5.8.7
+ */
+ @Override
+ public com.jfinal.template.Engine getRawEngine() {
+ return this.engine;
+ }
+
/**
* 创建引擎
*
diff --git a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/freemarker/FreemarkerEngine.java b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/freemarker/FreemarkerEngine.java
index 0952066ff..876638de0 100644
--- a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/freemarker/FreemarkerEngine.java
+++ b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/freemarker/FreemarkerEngine.java
@@ -15,7 +15,7 @@ import java.io.IOException;
/**
* FreeMarker模板引擎封装
- * 见:https://freemarker.apache.org/
+ * 见:https://freemarker.apache.org/
*
* @author looly
*/
@@ -82,6 +82,17 @@ public class FreemarkerEngine implements TemplateEngine {
}
}
+ /**
+ * 获取原始引擎的钩子方法,用于自定义特殊属性,如插件等
+ *
+ * @return {@link Configuration}
+ * @since 5.8.7
+ */
+ @Override
+ public Configuration getRawEngine() {
+ return this.cfg;
+ }
+
/**
* 创建配置项
*
diff --git a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/jetbrick/JetbrickEngine.java b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/jetbrick/JetbrickEngine.java
index 78666cbef..a453d447a 100755
--- a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/jetbrick/JetbrickEngine.java
+++ b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/jetbrick/JetbrickEngine.java
@@ -66,6 +66,17 @@ public class JetbrickEngine implements TemplateEngine {
return JetbrickTemplate.wrap(engine.getTemplate(resource));
}
+ /**
+ * 获取原始引擎的钩子方法,用于自定义特殊属性,如插件等
+ *
+ * @return {@link JetEngine}
+ * @since 5.8.7
+ */
+ @Override
+ public JetEngine getRawEngine() {
+ return this.engine;
+ }
+
/**
* 创建引擎
*
diff --git a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/rythm/RythmEngine.java b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/rythm/RythmEngine.java
index be4762a30..d202dbdff 100644
--- a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/rythm/RythmEngine.java
+++ b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/rythm/RythmEngine.java
@@ -1,11 +1,11 @@
package cn.hutool.extra.template.engine.rythm;
-import java.util.Properties;
-
import cn.hutool.extra.template.Template;
import cn.hutool.extra.template.TemplateConfig;
import cn.hutool.extra.template.TemplateEngine;
+import java.util.Properties;
+
/**
* Rythm模板引擎
* 文档:http://rythmengine.org/doc/index
@@ -67,6 +67,17 @@ public class RythmEngine implements TemplateEngine {
return RythmTemplate.wrap(this.engine.getTemplate(resource));
}
+ /**
+ * 获取原始引擎的钩子方法,用于自定义特殊属性,如插件等
+ *
+ * @return {@link org.rythmengine.RythmEngine}
+ * @since 5.8.7
+ */
+ @Override
+ public org.rythmengine.RythmEngine getRawEngine() {
+ return this.engine;
+ }
+
/**
* 创建引擎
*
diff --git a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/thymeleaf/ThymeleafEngine.java b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/thymeleaf/ThymeleafEngine.java
index cf4cb8bf5..dbd57ea3f 100644
--- a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/thymeleaf/ThymeleafEngine.java
+++ b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/thymeleaf/ThymeleafEngine.java
@@ -25,10 +25,12 @@ public class ThymeleafEngine implements TemplateEngine {
TemplateConfig config;
// --------------------------------------------------------------------------------- Constructor start
+
/**
* 默认构造
*/
- public ThymeleafEngine() {}
+ public ThymeleafEngine() {
+ }
/**
* 构造
@@ -51,7 +53,7 @@ public class ThymeleafEngine implements TemplateEngine {
@Override
public TemplateEngine init(TemplateConfig config) {
- if(null == config){
+ if (null == config) {
config = TemplateConfig.DEFAULT;
}
this.config = config;
@@ -61,20 +63,32 @@ public class ThymeleafEngine implements TemplateEngine {
/**
* 初始化引擎
+ *
* @param engine 引擎
*/
- private void init(final org.thymeleaf.TemplateEngine engine){
+ private void init(final org.thymeleaf.TemplateEngine engine) {
this.engine = engine;
}
@Override
public Template getTemplate(final String resource) {
- if(null == this.engine){
+ if (null == this.engine) {
init(TemplateConfig.DEFAULT);
}
return ThymeleafTemplate.wrap(this.engine, resource, (null == this.config) ? null : this.config.getCharset());
}
+ /**
+ * 获取原始引擎的钩子方法,用于自定义特殊属性,如插件等
+ *
+ * @return {@link org.thymeleaf.TemplateEngine}
+ * @since 5.8.7
+ */
+ @Override
+ public org.thymeleaf.TemplateEngine getRawEngine() {
+ return this.engine;
+ }
+
/**
* 创建引擎
*
@@ -88,33 +102,33 @@ public class ThymeleafEngine implements TemplateEngine {
final ITemplateResolver resolver;
switch (config.getResourceMode()) {
- case CLASSPATH:
- final ClassLoaderTemplateResolver classLoaderResolver = new ClassLoaderTemplateResolver();
- classLoaderResolver.setCharacterEncoding(config.getCharsetStr());
- classLoaderResolver.setTemplateMode(TemplateMode.HTML);
- classLoaderResolver.setPrefix(StrUtil.addSuffixIfNot(config.getPath(), "/"));
- resolver = classLoaderResolver;
- break;
- case FILE:
- final FileTemplateResolver fileResolver = new FileTemplateResolver();
- fileResolver.setCharacterEncoding(config.getCharsetStr());
- fileResolver.setTemplateMode(TemplateMode.HTML);
- fileResolver.setPrefix(StrUtil.addSuffixIfNot(config.getPath(), "/"));
- resolver = fileResolver;
- break;
- case WEB_ROOT:
- final FileTemplateResolver webRootResolver = new FileTemplateResolver();
- webRootResolver.setCharacterEncoding(config.getCharsetStr());
- webRootResolver.setTemplateMode(TemplateMode.HTML);
- webRootResolver.setPrefix(StrUtil.addSuffixIfNot(FileUtil.getAbsolutePath(FileUtil.file(FileUtil.getWebRoot(), config.getPath())), "/"));
- resolver = webRootResolver;
- break;
- case STRING:
- resolver = new StringTemplateResolver();
- break;
- default:
- resolver = new DefaultTemplateResolver();
- break;
+ case CLASSPATH:
+ final ClassLoaderTemplateResolver classLoaderResolver = new ClassLoaderTemplateResolver();
+ classLoaderResolver.setCharacterEncoding(config.getCharsetStr());
+ classLoaderResolver.setTemplateMode(TemplateMode.HTML);
+ classLoaderResolver.setPrefix(StrUtil.addSuffixIfNot(config.getPath(), "/"));
+ resolver = classLoaderResolver;
+ break;
+ case FILE:
+ final FileTemplateResolver fileResolver = new FileTemplateResolver();
+ fileResolver.setCharacterEncoding(config.getCharsetStr());
+ fileResolver.setTemplateMode(TemplateMode.HTML);
+ fileResolver.setPrefix(StrUtil.addSuffixIfNot(config.getPath(), "/"));
+ resolver = fileResolver;
+ break;
+ case WEB_ROOT:
+ final FileTemplateResolver webRootResolver = new FileTemplateResolver();
+ webRootResolver.setCharacterEncoding(config.getCharsetStr());
+ webRootResolver.setTemplateMode(TemplateMode.HTML);
+ webRootResolver.setPrefix(StrUtil.addSuffixIfNot(FileUtil.getAbsolutePath(FileUtil.file(FileUtil.getWebRoot(), config.getPath())), "/"));
+ resolver = webRootResolver;
+ break;
+ case STRING:
+ resolver = new StringTemplateResolver();
+ break;
+ default:
+ resolver = new DefaultTemplateResolver();
+ break;
}
final org.thymeleaf.TemplateEngine engine = new org.thymeleaf.TemplateEngine();
diff --git a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/velocity/VelocityEngine.java b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/velocity/VelocityEngine.java
index 542229753..171fadbda 100644
--- a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/velocity/VelocityEngine.java
+++ b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/velocity/VelocityEngine.java
@@ -70,6 +70,7 @@ public class VelocityEngine implements TemplateEngine {
* @return 原始引擎对象
* @since 5.5.8
*/
+ @Override
public org.apache.velocity.app.VelocityEngine getRawEngine() {
return this.engine;
}
diff --git a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/wit/WitEngine.java b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/wit/WitEngine.java
index 86830f28f..30a796d7f 100755
--- a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/wit/WitEngine.java
+++ b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/wit/WitEngine.java
@@ -73,6 +73,17 @@ public class WitEngine implements TemplateEngine {
}
}
+ /**
+ * 获取原始引擎的钩子方法,用于自定义特殊属性,如插件等
+ *
+ * @return {@link Engine}
+ * @since 5.8.7
+ */
+ @Override
+ public Engine getRawEngine() {
+ return this.engine;
+ }
+
/**
* 创建引擎
*
diff --git a/hutool-extra/src/test/java/cn/hutool/extra/template/ThymeleafTest.java b/hutool-extra/src/test/java/cn/hutool/extra/template/ThymeleafTest.java
index e53ffa6e0..c88b89a02 100755
--- a/hutool-extra/src/test/java/cn/hutool/extra/template/ThymeleafTest.java
+++ b/hutool-extra/src/test/java/cn/hutool/extra/template/ThymeleafTest.java
@@ -1,5 +1,15 @@
package cn.hutool.extra.template;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.map.Dict;
+import cn.hutool.extra.template.engine.thymeleaf.ThymeleafEngine;
+import org.junit.Assert;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.thymeleaf.context.Context;
+import org.thymeleaf.standard.StandardDialect;
+import org.thymeleaf.templateresolver.StringTemplateResolver;
+
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.HashMap;
@@ -8,15 +18,6 @@ import java.util.List;
import java.util.Locale;
import java.util.Map;
-import org.junit.Assert;
-import org.junit.Test;
-import org.thymeleaf.context.Context;
-import org.thymeleaf.templateresolver.StringTemplateResolver;
-
-import cn.hutool.core.date.DateUtil;
-import cn.hutool.core.map.Dict;
-import cn.hutool.extra.template.engine.thymeleaf.ThymeleafEngine;
-
/**
* Thymeleaf单元测试
*
@@ -25,6 +26,20 @@ import cn.hutool.extra.template.engine.thymeleaf.ThymeleafEngine;
*/
public class ThymeleafTest {
+ /**
+ * ...
+ * 自定义操作原始引擎
+ */
+ @Test
+ @Ignore
+ public void addDialectTest(){
+ final TemplateEngine engine = TemplateUtil.createEngine();
+ if(engine instanceof ThymeleafEngine){
+ final org.thymeleaf.TemplateEngine rawEngine = ((ThymeleafEngine) engine).getRawEngine();
+ rawEngine.addDialect(new StandardDialect());
+ }
+ }
+
@Test
public void thymeleafEngineTest() {
final Map map1 = new HashMap<>();