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<>();