From 332ea36dbd646a66307f329a5a24baaf10781560 Mon Sep 17 00:00:00 2001 From: zhaoxuyang03 Date: Fri, 27 Nov 2020 22:00:07 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E3=80=90Sprint3.3.0=E3=80=91=E3=80=90Beetl?= =?UTF-8?q?=E3=80=91ClassSearch=20=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/beetl/core/ResourceLoader.java | 4 +- .../java/org/beetl/core/misc/ClassSearch.java | 67 ++++++++++++------- 2 files changed, 45 insertions(+), 26 deletions(-) diff --git a/src/main/java/org/beetl/core/ResourceLoader.java b/src/main/java/org/beetl/core/ResourceLoader.java index 5c5c7be..136c2e2 100644 --- a/src/main/java/org/beetl/core/ResourceLoader.java +++ b/src/main/java/org/beetl/core/ResourceLoader.java @@ -27,13 +27,15 @@ */ package org.beetl.core; +import java.io.Closeable; + /** * ResourceLoader 负责根据GroupTemplate提供的Key,来获取Resource,这些Resource可以是文件, * 字符串,加密的文本,以及数据库Blob字段等 * * @author xiandafu */ -public interface ResourceLoader { +public interface ResourceLoader extends Closeable { /** * 根据key获取Resource diff --git a/src/main/java/org/beetl/core/misc/ClassSearch.java b/src/main/java/org/beetl/core/misc/ClassSearch.java index 39f0d83..b022015 100644 --- a/src/main/java/org/beetl/core/misc/ClassSearch.java +++ b/src/main/java/org/beetl/core/misc/ClassSearch.java @@ -31,7 +31,9 @@ import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import org.beetl.android.util.Log; import org.beetl.core.GroupTemplate; +import org.beetl.core.config.BeetlConfig; /** * 在classloader下仅仅根据类名加载类,会尝试用系统内置的以及配置好的包名作为类的包名 @@ -39,55 +41,70 @@ import org.beetl.core.GroupTemplate; * @author xiandafu */ public class ClassSearch { - Set pkgList; - Map map = new ConcurrentHashMap<>(); - GroupTemplate gt; + + /** DEBUG flag */ + private static final boolean DEBUG = BeetlConfig.DEBUG; + /** DEBUG TAG */ + private static final String TAG = "ClassSearch"; + + /** 类名与类型的缓存 */ + final Map nameClassCache = new ConcurrentHashMap<>(); + /** 去重后的包名列表 */ + final Set pkgList; + /** 用于获取类加载器 */ + final GroupTemplate gt; /** - * 默认的搜索列表 + * 构造方法 */ public ClassSearch(Set pkgList, GroupTemplate gt) { this.pkgList = pkgList; this.gt = gt; - } /** - * 根据类名得到指定类,如果类名是带包名,则直接用当前classloader加载,如果仅仅类名 - * 则尝试用内置的或者配置的包名作为包名尝试加载 + * 根据类名得到指定类 + * - 如果类名是带包名,则直接用当前classloader加载 + * - 如果仅是类名 + * - 先尝试从缓存中取 + * - 再尝试用内置的或者配置的包名作为包名尝试加载 * - * @return 不成功,返回null + * @return 返回 {@param name} 的类型,如果不成功会返回 null */ public Class getClassByName(String name) { + ClassLoader classLoader = gt.getClassLoader(); + // 如果类名是带包名,则直接用当前classloader加载 if (name.contains(".")) { try { - return Class.forName(name, true, gt.getClassLoader()); + return Class.forName(name, true, classLoader); } catch (ClassNotFoundException e) { return null; } + } - } else { - Class cls = map.get(name); - if (cls == null) { - for (String pkg : pkgList) { - try { - String clsName = pkg.concat(name); - cls = Class.forName(clsName, true, gt.getClassLoader()); - map.put(name, cls); - return cls; + // 如果仅是类名,先尝试从缓存中取 + Class cls = nameClassCache.get(name); + if (cls != null) { + return cls; + } - } catch (Exception ex) { - // continue; - } - } - return null; - } else { + // 再尝试用内置的或者配置的包名作为包名尝试加载 + for (String pkg : pkgList) { + try { + String clsName = pkg.concat(name); + cls = Class.forName(clsName, true, classLoader); + nameClassCache.put(name, cls); // 缓存起来 return cls; + } catch (Exception ex) { + if (DEBUG) { + Log.d(TAG, ex.toString()); + } } - } + // 如果不成功会返回 null + return null; } } -- Gitee From ed5fb82044e4d04124b5e4f2cd465cd050d11e74 Mon Sep 17 00:00:00 2001 From: zhaoxuyang03 Date: Fri, 27 Nov 2020 22:36:18 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E3=80=90Sprint3.3.0=E3=80=91=E3=80=90Beetl?= =?UTF-8?q?=E3=80=91=20=E6=B5=8B=E8=AF=95=E9=98=B6=E6=AE=B5=E4=B8=AD?= =?UTF-8?q?=E5=BC=95=E5=85=A5=20JMH=20=E5=9F=BA=E5=87=86=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E6=A1=86=E6=9E=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 16 +++++++++ src/test/java/org/beetl/jmh/BaseJmhTest.java | 36 +++++++++++++++++++ .../java/org/beetl/jmh/TextUtilsTest.java | 26 ++++++++++++++ 3 files changed, 78 insertions(+) create mode 100644 src/test/java/org/beetl/jmh/BaseJmhTest.java create mode 100644 src/test/java/org/beetl/jmh/TextUtilsTest.java diff --git a/pom.xml b/pom.xml index 3221fbf..ae774fe 100644 --- a/pom.xml +++ b/pom.xml @@ -124,6 +124,22 @@ true 3.6.6 + + + + org.openjdk.jmh + jmh-core + test + 1.19 + + + org.openjdk.jmh + jmh-generator-annprocess + test + 1.19 + + + org.testng testng diff --git a/src/test/java/org/beetl/jmh/BaseJmhTest.java b/src/test/java/org/beetl/jmh/BaseJmhTest.java new file mode 100644 index 0000000..6954dfa --- /dev/null +++ b/src/test/java/org/beetl/jmh/BaseJmhTest.java @@ -0,0 +1,36 @@ +package org.beetl.jmh; + +import org.openjdk.jmh.annotations.*; +import org.openjdk.jmh.runner.Runner; +import org.openjdk.jmh.runner.RunnerException; +import org.openjdk.jmh.runner.options.Options; +import org.openjdk.jmh.runner.options.OptionsBuilder; + +import java.util.concurrent.TimeUnit; + +@BenchmarkMode(Mode.AverageTime) // 使用模式为运行时间,默认是Mode.Throughput,表示吞吐量 +@Warmup(iterations = 10, time = 1, timeUnit = TimeUnit.SECONDS) // 预热 +@Measurement(iterations = 10, time = 1, timeUnit = TimeUnit.SECONDS) // 运行 +@Threads(1) // 同时执行的线程数 +@Fork(1) // 为每个方法启动一个进程 +@OutputTimeUnit(TimeUnit.NANOSECONDS) // 统计结果的时间单元 +@State(Scope.Benchmark) // 对象的生命周期 +public class BaseJmhTest { + + public static void main(String[] args) { + BaseJmhTest jmhTest = new BaseJmhTest(); + jmhTest.run(); + } + + protected void run() { + Options opt = new OptionsBuilder() + .include(this.getClass().getSimpleName()) + .forks(1) + .build(); + try { + new Runner(opt).run(); + } catch (RunnerException e) { + throw new RuntimeException(this.getClass().getSimpleName() + "#" + e); + } + } +} diff --git a/src/test/java/org/beetl/jmh/TextUtilsTest.java b/src/test/java/org/beetl/jmh/TextUtilsTest.java new file mode 100644 index 0000000..5747315 --- /dev/null +++ b/src/test/java/org/beetl/jmh/TextUtilsTest.java @@ -0,0 +1,26 @@ +package org.beetl.jmh; + +import org.beetl.android.text.TextUtils; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.Param; + +public class TextUtilsTest extends BaseJmhTest { + + public static void main(String[] args) { + TextUtilsTest jmhTest = new TextUtilsTest(); + jmhTest.run(); + } + + @Param({"1234.1212", "1213123", "1234567890qwertyuiopasdfghjklzxcvbnm,."}) + String dataIndexOf; + + @Benchmark + public int textUtilsIndexOf() { + return TextUtils.indexOf(dataIndexOf, '.'); + } + + @Benchmark + public int stringIndexOf() { + return dataIndexOf.indexOf('.'); + } +} -- Gitee From 2483696160dc676dca01d4214e783ebdf8f3c7ba Mon Sep 17 00:00:00 2001 From: zhaoxuyang03 Date: Sat, 28 Nov 2020 00:26:21 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E3=80=90Sprint3.3.0=E3=80=91=E3=80=90Beetl?= =?UTF-8?q?=E3=80=91Configuration=20=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/beetl/android/text/TextUtils.java | 15 + .../java/org/beetl/core/Configuration.java | 517 ++++++++---------- .../java/org/beetl/core/GroupTemplate.java | 14 +- .../java/org/beetl/core/text/TextParser.java | 27 +- 4 files changed, 260 insertions(+), 313 deletions(-) diff --git a/src/main/java/org/beetl/android/text/TextUtils.java b/src/main/java/org/beetl/android/text/TextUtils.java index 2f36685..21ba8fa 100644 --- a/src/main/java/org/beetl/android/text/TextUtils.java +++ b/src/main/java/org/beetl/android/text/TextUtils.java @@ -814,4 +814,19 @@ public class TextUtils { private static char[] sTemp = null; /** 空的 String 数组 */ private static String[] EMPTY_STRING_ARRAY = EmptyArray.STRING; + + // ================================================================================================================= + // 以下是 Beetl 中定义的方法 + // ================================================================================================================= + + /** + * 判断字符串是否为空白 + * + * @param str 给定字符串 + * @return true表示 {@param str} 为空白 + */ + public static boolean isBlank(String str) { + return str == null || str.trim().isEmpty(); + } + } diff --git a/src/main/java/org/beetl/core/Configuration.java b/src/main/java/org/beetl/core/Configuration.java index 54bf700..3040e47 100644 --- a/src/main/java/org/beetl/core/Configuration.java +++ b/src/main/java/org/beetl/core/Configuration.java @@ -31,6 +31,8 @@ import java.io.File; import java.io.FileReader; import java.io.IOException; import java.io.InputStream; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; @@ -38,9 +40,12 @@ import java.util.Map; import java.util.Properties; import java.util.Set; +import org.beetl.android.text.TextUtils; import org.beetl.core.text.HtmlTagConfig; import org.beetl.core.text.PlaceHolderDelimeter; import org.beetl.core.text.ScriptDelimeter; +import org.intellij.lang.annotations.MagicConstant; +import org.jetbrains.annotations.NotNull; /** * 模板配置,核心文件之一 @@ -74,114 +79,115 @@ public class Configuration { String htmlTagFlag = "#"; /** 是否允许html tag,在web编程中,有可能用到html tag,最好允许 */ boolean isHtmlTagSupport = false; - /** 是否允许直接调用class */ + /** HTML标签开始符号 */ + String htmlTagStart; + /** HTML标签结束符号 */ + String htmlTagEnd; + /** 是否允许直接调用class */ boolean nativeCall = false; /** 输出模式,默认是字符集输出,改成byte输出提高性能 */ boolean directByteOutput = false; /** 严格mvc应用,只有变态的的人才打开此选项 */ boolean isStrict = false; - /** - * 是否忽略客户端的网络异常 - */ + /** 是否忽略客户端的网络异常 */ boolean isIgnoreClientIOError = true; - /** - * 错误处理类 - */ + /** 错误处理类 */ String errorHandlerClass = "org.beetl.core.ConsoleErrorHandler"; - /** - * HTML标签开始符号 - */ - String htmlTagStart = "<" + htmlTagFlag; - /** - * HTML标签结束符号 - */ - String htmlTagEnd = " - */ + /** html 绑定的属性,如<aa var="customer"> */ String htmlTagBindingAttribute = "var"; - + /** {@link org.beetl.core.text.DefaultAttributeNameConvert} */ String htmlTagAttributeConvert = "org.beetl.core.text.DefaultAttributeNameConvert"; - /** - * 类搜索的包名列表 - */ - Set pkgList = new HashSet(); + /** 类搜索的包名列表 */ + Set pkgList = new HashSet<>(); - /** - * 渲染web 前执行的代码,需要实现WebRenderExt接口,如果为空,则不做操作 - */ + /** 渲染web 前执行的代码,需要实现WebRenderExt接口,如果为空,则不做操作 */ String webAppExt = null; - // html方法和html标签是否使用特殊的定界符,如模板使用简介的@和回车,html 标签和html tag使用<%%> + /** html方法和html标签是否使用特殊的定界符,如模板使用简介的@和回车,html 标签和html tag使用<%%> */ boolean hasFunctionLimiter = false; String functionLimiterStart = null; String functionLimiterEnd = null; // 关于引擎的设置 - // String engine = "org.beetl.core.DefaultTemplateEngine"; + /** {@code String engine = "org.beetl.core.DefaultTemplateEngine";} */ String engine = "org.beetl.core.FastRuntimeEngine"; String nativeSecurity = "org.beetl.core.DefaultNativeSecurityManager"; String resourceLoader = "org.beetl.core.resource.ClasspathResourceLoader"; // 扩展资源 - Map fnMap = new HashMap(); - Map fnPkgMap = new HashMap(); - - Map formatMap = new HashMap(); - Map defaultFormatMap = new HashMap(0); - Set generalVirtualAttributeSet = new HashSet(); - Map virtualClass = new HashMap(); - Map tagFactoryMap = new HashMap(); - Map tagMap = new HashMap(); - // 资源loader配置 - Map resourceMap = new HashMap(); - - // 缓冲数组 + Map fnMap = new HashMap<>(); + Map fnPkgMap = new HashMap<>(); + + Map formatMap = new HashMap<>(); + Map defaultFormatMap = new HashMap<>(0); + Set generalVirtualAttributeSet = new HashSet<>(); + Map virtualClass = new HashMap<>(); + Map tagFactoryMap = new HashMap<>(); + Map tagMap = new HashMap<>(); + /** 资源loader配置 */ + Map resourceMap = new HashMap<>(); + + /** 缓冲数组长度不能小于 256 */ + private static final int BUFFER_MIN_SIZE = 256; + /** 缓冲数组 */ int bufferSize = 4096; int bufferNum = 64; - /** - * 模板是否整体使用安全输出功能,如果是,则不存在的值返回空,而不是报错 - */ + /** 模板是否整体使用安全输出功能,如果是,则不存在的值返回空,而不是报错 */ boolean safeOutput = false; - public static String DELIMITER_PLACEHOLDER_START = "DELIMITER_PLACEHOLDER_START"; - public static String DELIMITER_PLACEHOLDER_END = "DELIMITER_PLACEHOLDER_END"; - public static String DELIMITER_STATEMENT_START = "DELIMITER_STATEMENT_START"; - public static String DELIMITER_STATEMENT_END = "DELIMITER_STATEMENT_END"; - public static String DELIMITER_PLACEHOLDER_START2 = "DELIMITER_PLACEHOLDER_START2"; - public static String DELIMITER_PLACEHOLDER_END2 = "DELIMITER_PLACEHOLDER_END2"; - public static String DELIMITER_STATEMENT_START2 = "DELIMITER_STATEMENT_START2"; - public static String DELIMITER_STATEMENT_END2 = "DELIMITER_STATEMENT_END2"; - public static String NATIVE_CALL = "NATIVE_CALL"; - public static String IGNORE_CLIENT_IO_ERROR = "IGNORE_CLIENT_IO_ERROR"; - public static String DIRECT_BYTE_OUTPUT = "DIRECT_BYTE_OUTPUT"; - public static String TEMPLATE_ROOT = "TEMPLATE_ROOT"; - public static String TEMPLATE_CHARSET = "TEMPLATE_CHARSET"; - public static String ERROR_HANDLER = "ERROR_HANDLER"; - public static String MVC_STRICT = "MVC_STRICT"; - public static String WEBAPP_EXT = "WEBAPP_EXT"; - public static String HTML_TAG_SUPPORT = "HTML_TAG_SUPPORT"; - public static String HTML_TAG_FLAG = "HTML_TAG_FLAG"; - public static String HTML_TAG_ATTR_CONVERT = "HTML_TAG_ATTR_CONVERT"; - public static String IMPORT_PACKAGE = "IMPORT_PACKAGE"; - public static String ENGINE = "ENGINE"; - public static String NATIVE_SECUARTY_MANAGER = "NATIVE_SECUARTY_MANAGER"; - public static String RESOURCE_LOADER = "RESOURCE_LOADER"; - public static String HTML_TAG_BINDING_ATTRIBUTE = "HTML_TAG_BINDING_ATTRIBUTE"; - - public static String BUFFER_SIZE = "buffer.maxSize"; - public static String BUFFER_NUM = "buffer.num"; - - public static String SAFE_OUTPUT = "SAFE_OUTPUT"; - + public static final String DELIMITER_PLACEHOLDER_START = "DELIMITER_PLACEHOLDER_START"; + public static final String DELIMITER_PLACEHOLDER_END = "DELIMITER_PLACEHOLDER_END"; + public static final String DELIMITER_STATEMENT_START = "DELIMITER_STATEMENT_START"; + public static final String DELIMITER_STATEMENT_END = "DELIMITER_STATEMENT_END"; + public static final String DELIMITER_PLACEHOLDER_START2 = "DELIMITER_PLACEHOLDER_START2"; + public static final String DELIMITER_PLACEHOLDER_END2 = "DELIMITER_PLACEHOLDER_END2"; + public static final String DELIMITER_STATEMENT_START2 = "DELIMITER_STATEMENT_START2"; + public static final String DELIMITER_STATEMENT_END2 = "DELIMITER_STATEMENT_END2"; + public static final String NATIVE_CALL = "NATIVE_CALL"; + public static final String IGNORE_CLIENT_IO_ERROR = "IGNORE_CLIENT_IO_ERROR"; + public static final String DIRECT_BYTE_OUTPUT = "DIRECT_BYTE_OUTPUT"; + public static final String TEMPLATE_ROOT = "TEMPLATE_ROOT"; + public static final String TEMPLATE_CHARSET = "TEMPLATE_CHARSET"; + public static final String ERROR_HANDLER = "ERROR_HANDLER"; + public static final String MVC_STRICT = "MVC_STRICT"; + public static final String WEBAPP_EXT = "WEBAPP_EXT"; + public static final String HTML_TAG_SUPPORT = "HTML_TAG_SUPPORT"; + public static final String HTML_TAG_FLAG = "HTML_TAG_FLAG"; + public static final String HTML_TAG_ATTR_CONVERT = "HTML_TAG_ATTR_CONVERT"; + public static final String IMPORT_PACKAGE = "IMPORT_PACKAGE"; + public static final String ENGINE = "ENGINE"; + public static final String NATIVE_SECUARTY_MANAGER = "NATIVE_SECUARTY_MANAGER"; + public static final String RESOURCE_LOADER = "RESOURCE_LOADER"; + public static final String HTML_TAG_BINDING_ATTRIBUTE = "HTML_TAG_BINDING_ATTRIBUTE"; + public static final String BUFFER_SIZE = "buffer.maxSize"; + public static final String BUFFER_NUM = "buffer.num"; + public static final String SAFE_OUTPUT = "SAFE_OUTPUT"; + + /** 配置文件的key */ + @MagicConstant(stringValues = { + DELIMITER_PLACEHOLDER_START, DELIMITER_PLACEHOLDER_END, + DELIMITER_STATEMENT_START, DELIMITER_STATEMENT_END, + DELIMITER_PLACEHOLDER_START2, DELIMITER_PLACEHOLDER_END2, + DELIMITER_STATEMENT_START2, DELIMITER_STATEMENT_END2, + NATIVE_CALL, IGNORE_CLIENT_IO_ERROR, DIRECT_BYTE_OUTPUT, + TEMPLATE_ROOT, TEMPLATE_CHARSET, + ERROR_HANDLER, MVC_STRICT, WEBAPP_EXT, + HTML_TAG_SUPPORT, HTML_TAG_FLAG, HTML_TAG_ATTR_CONVERT, HTML_TAG_BINDING_ATTRIBUTE, + IMPORT_PACKAGE, ENGINE, NATIVE_SECUARTY_MANAGER, RESOURCE_LOADER, + BUFFER_SIZE, BUFFER_NUM, SAFE_OUTPUT + }) + @Retention(RetentionPolicy.SOURCE) + public @interface PropertiesKey { + } + + /** 配置文件 */ Properties ps = null; DelimeterHolder pd = null; @@ -192,22 +198,76 @@ public class Configuration { ? Thread.currentThread().getContextClassLoader() : Configuration.class.getClassLoader(); + /** + * 创建一个新的 Configuration 实例 + * + * @return 一个新的 Configuration 实例 + * @throws IOException 配置文件不存在等情况 + */ + public static Configuration defaultConfiguration() throws IOException { + return new Configuration(); + } + + /** + * 构造方法 + * + * @throws IOException 文件不存在等情况 + */ public Configuration() throws IOException { initDefault(); - } + /** + * 构造方法 + * + * @param ps 配置文件 + * @throws IOException 文件不存在等情况 + */ public Configuration(Properties ps) throws IOException { initDefault(); parseProperties(ps); - } public void build() { buildDelimeter(); } + private void buildDelimeter() { + if (TextUtils.isBlank(placeholderStart) || TextUtils.isBlank(placeholderEnd)) { + throw new IllegalArgumentException("占位符不能为空"); + } + + if (this.placeholderStart2 != null) { + if (TextUtils.isBlank(placeholderStart2) || TextUtils.isBlank(placeholderEnd2)) { + throw new IllegalArgumentException("定义了2对占位符配置,但占位符2不能为空"); + } + pd = new DelimeterHolder(placeholderStart.toCharArray(), placeholderEnd.toCharArray(), + placeholderStart2.toCharArray(), placeholderEnd2.toCharArray()); + } else { + pd = new DelimeterHolder(placeholderStart.toCharArray(), placeholderEnd.toCharArray()); + } + + if (TextUtils.isBlank(statementStart)) { + throw new IllegalArgumentException("定界符起始符号不能为空"); + } + if (this.statementStart2 != null) { + if (TextUtils.isBlank(statementStart2)) { + throw new IllegalArgumentException("定义了2对定界符配置,但定界符起始符号不能为空"); + } + sd = new DelimeterHolder(statementStart.toCharArray(), + statementEnd != null ? statementEnd.toCharArray() : null, + statementStart2.toCharArray(), + statementEnd2 != null ? statementEnd2.toCharArray() : null); + } else { + sd = new DelimeterHolder(statementStart.toCharArray(), + statementEnd != null ? statementEnd.toCharArray() : null); + } + + tagConf = new HtmlTagHolder(htmlTagStart, htmlTagEnd, htmlTagBindingAttribute, isHtmlTagSupport); + } + private void initDefault() throws IOException { + resetHtmlTag(); // 总是添加这俩个 pkgList.add("java.util."); pkgList.add("java.lang."); @@ -225,20 +285,28 @@ public class Configuration { } } - public void add(File path) throws IOException { + private void resetHtmlTag() { + htmlTagStart = "<" + htmlTagFlag; + htmlTagEnd = "> set = ps.entrySet(); for (Map.Entry entry : set) { @@ -246,7 +314,6 @@ public class Configuration { String value = (String) entry.getValue(); setValue(key, value == null ? null : value.trim()); } - } protected void setValue(String key, String value) { @@ -254,75 +321,48 @@ public class Configuration { this.charset = value; } else if (key.equalsIgnoreCase(DELIMITER_PLACEHOLDER_START)) { this.placeholderStart = value; - } else if (key.equalsIgnoreCase(DELIMITER_PLACEHOLDER_END)) { - this.placeholderEnd = value; } else if (key.equalsIgnoreCase(DELIMITER_STATEMENT_START)) { this.statementStart = value; } else if (key.equalsIgnoreCase(DELIMITER_STATEMENT_END)) { - if (value == null | value.length() == 0 || value.equals("null")) { - this.statementEnd = null; - } else { - this.statementEnd = value; - } - /* 第二组定界符号 */ - } else if (key.equalsIgnoreCase(DELIMITER_PLACEHOLDER_START2)) { + this.statementEnd = (TextUtils.isEmpty(value) || TextUtils.equals(value, "null")) ? null : value; + } else if (key.equalsIgnoreCase(DELIMITER_PLACEHOLDER_START2)) { // 第二组定界符号 this.placeholderStart2 = value; - } else if (key.equalsIgnoreCase(DELIMITER_PLACEHOLDER_END2)) { - this.placeholderEnd2 = value; } else if (key.equalsIgnoreCase(DELIMITER_STATEMENT_START2)) { this.statementStart2 = value; } else if (key.equalsIgnoreCase(DELIMITER_STATEMENT_END2)) { - if (isBlank(value) || value.equals("null")) { - this.statementEnd2 = null; - } else { - this.statementEnd2 = value; - } - + this.statementEnd2 = (TextUtils.isBlank(value) || TextUtils.equals(value, "null")) ? null : value; } else if (key.equalsIgnoreCase(NATIVE_CALL)) { - this.nativeCall = isBoolean(value, false); + this.nativeCall = Boolean.parseBoolean(value); } else if (key.equalsIgnoreCase(SAFE_OUTPUT)) { - this.safeOutput = isBoolean(value, false); + this.safeOutput = Boolean.parseBoolean(value); } else if (key.equalsIgnoreCase(IGNORE_CLIENT_IO_ERROR)) { - this.isIgnoreClientIOError = isBoolean(value, false); + this.isIgnoreClientIOError = Boolean.parseBoolean(value); } else if (key.equalsIgnoreCase(DIRECT_BYTE_OUTPUT)) { - this.directByteOutput = isBoolean(value, false); + this.directByteOutput = Boolean.parseBoolean(value); } else if (key.equalsIgnoreCase(ERROR_HANDLER)) { - if (isBlank(value) || value.equals("null")) { - this.errorHandlerClass = null; - } else { - this.errorHandlerClass = value; - } - + this.errorHandlerClass = (TextUtils.isBlank(value) || value.equals("null")) ? null : value; } else if (key.equalsIgnoreCase(WEBAPP_EXT)) { - if (value == null || value.length() == 0) { - - this.webAppExt = null; - } else { - this.webAppExt = value; - } - + this.webAppExt = TextUtils.isEmpty(value) ? null : value; } else if (key.equalsIgnoreCase(MVC_STRICT)) { - this.isStrict = isBoolean(value, false); + this.isStrict = Boolean.parseBoolean(value); } else if (key.equalsIgnoreCase(HTML_TAG_SUPPORT)) { - this.isHtmlTagSupport = isBoolean(value, false); + this.isHtmlTagSupport = Boolean.parseBoolean(value); } else if (key.equalsIgnoreCase(HTML_TAG_ATTR_CONVERT)) { - if (!isBlank(value)) { + if (!TextUtils.isBlank(value)) { this.htmlTagAttributeConvert = value; } } else if (key.equalsIgnoreCase(HTML_TAG_FLAG)) { this.htmlTagFlag = value; - htmlTagStart = "<" + htmlTagFlag; - htmlTagEnd = " ls = new ArrayList(); + List ls = new ArrayList<>(); // 所有注册的方法 - Map fnMap = new HashMap(); + Map fnMap = new HashMap<>(); // 格式化函数 - Map formatMap = new HashMap(); - Map defaultFormatMap = new HashMap(0); + Map formatMap = new HashMap<>(); + Map defaultFormatMap = new HashMap<>(0); // 虚拟函数 - List virtualAttributeList = new ArrayList(); - Map virtualClass = new HashMap(); + List virtualAttributeList = new ArrayList<>(); + Map virtualClass = new HashMap<>(); // 标签函数 - Map tagFactoryMap = new HashMap(); + Map tagFactoryMap = new HashMap<>(); ClassSearch classSearch = null; // java调用安全管理器 NativeSecurityManager nativeSecurity = null; diff --git a/src/main/java/org/beetl/core/text/TextParser.java b/src/main/java/org/beetl/core/text/TextParser.java index 48d0752..1ecf971 100644 --- a/src/main/java/org/beetl/core/text/TextParser.java +++ b/src/main/java/org/beetl/core/text/TextParser.java @@ -24,7 +24,7 @@ public class TextParser { /** Log TAG */ private static final String TAG = "TextParser"; - Map textVars = new HashMap(); + Map textVars = new HashMap<>(); int textNameSuffix = 0; PlaceHolderDelimeter pd; ScriptDelimeter sd; @@ -42,34 +42,36 @@ public class TextParser { AttributeNameConvert attributeNameConvert; - public TextParser(GroupTemplate groupTemplate, Configuration.DelimeterHolder pdConfig, Configuration.DelimeterHolder sdConfig) { - if (groupTemplate == null) { - attributeNameConvert = new DefaultAttributeNameConvert(); - } else { - attributeNameConvert = groupTemplate.getHtmlTagAttrNameConvert(); - } - + public TextParser(GroupTemplate groupTemplate, + Configuration.DelimeterHolder pdConfig, + Configuration.DelimeterHolder sdConfig) { + attributeNameConvert = (groupTemplate == null) + ? new DefaultAttributeNameConvert() + : groupTemplate.getHtmlTagAttrNameConvert(); this.pd = pdConfig.createPhd(); this.sd = sdConfig.createSd(); } - public TextParser(GroupTemplate groupTemplate, Configuration.DelimeterHolder pdConfig, Configuration.DelimeterHolder sdConfig, Configuration.HtmlTagHolder tagConfig) { + public TextParser(GroupTemplate groupTemplate, + Configuration.DelimeterHolder pdConfig, + Configuration.DelimeterHolder sdConfig, + Configuration.HtmlTagHolder tagConfig) { this(groupTemplate, pdConfig, sdConfig); if (tagConfig.isSupport()) { this.htmlTagConfig = tagConfig.create(); } } - public TextParser(Configuration.DelimeterHolder pdConfig, Configuration.DelimeterHolder sdConfig, Configuration.HtmlTagHolder tagConfig) { + public TextParser(Configuration.DelimeterHolder pdConfig, + Configuration.DelimeterHolder sdConfig, + Configuration.HtmlTagHolder tagConfig) { this(null, pdConfig, sdConfig); if (tagConfig.isSupport()) { this.htmlTagConfig = tagConfig.create(); } - } public void doParse(Reader orginal) throws IOException { - scan1(orginal); //合并 sourceFragement.merge(); @@ -108,7 +110,6 @@ public class TextParser { test = next; } } - } public StringBuilder getScript() { -- Gitee