Browse Source

1.6.3-SNAPSHOT 增加JSON扩展, LTS目前支持fastjson, jackson , 也可以使用SPI扩展实现

hugui 9 years ago
parent
commit
b09f496725
82 changed files with 2873 additions and 311 deletions
  1. 1 1
      build.cmd
  2. 1 1
      build.sh
  3. 14 14
      lts-admin/pom.xml
  4. 5 3
      lts-admin/src/main/java/com/lts/web/controller/api/JobQueueApiController.java
  5. 106 106
      lts-admin/src/main/java/com/lts/web/filter/LoginAuthFilter.java
  6. 6 8
      lts-admin/src/main/java/com/lts/web/service/MonitorDataService.java
  7. 2 2
      lts-admin/src/main/java/com/lts/web/support/spring/ExceptionHandlerResolver.java
  8. 4 5
      lts-admin/src/main/java/com/lts/web/support/spring/MapEditor.java
  9. 12 1
      lts-core/pom.xml
  10. 2 2
      lts-core/src/main/java/com/lts/core/cluster/Config.java
  11. 13 2
      lts-core/src/main/java/com/lts/core/cluster/Node.java
  12. 254 0
      lts-core/src/main/java/com/lts/core/commons/utils/Base64.java
  13. 0 58
      lts-core/src/main/java/com/lts/core/commons/utils/JSONUtils.java
  14. 8 0
      lts-core/src/main/java/com/lts/core/commons/utils/StringUtils.java
  15. 3 3
      lts-core/src/main/java/com/lts/core/domain/Job.java
  16. 2 2
      lts-core/src/main/java/com/lts/core/domain/JobResult.java
  17. 2 2
      lts-core/src/main/java/com/lts/core/domain/TaskTrackerJobResult.java
  18. 3 3
      lts-core/src/main/java/com/lts/core/failstore/berkeleydb/BerkeleydbFailStore.java
  19. 3 3
      lts-core/src/main/java/com/lts/core/failstore/leveldb/LeveldbFailStore.java
  20. 3 3
      lts-core/src/main/java/com/lts/core/failstore/mapdb/MapdbFailStore.java
  21. 3 3
      lts-core/src/main/java/com/lts/core/failstore/rocksdb/RocksdbFailStore.java
  22. 133 0
      lts-core/src/main/java/com/lts/core/json/JSON.java
  23. 38 0
      lts-core/src/main/java/com/lts/core/json/JSONAdapter.java
  24. 106 0
      lts-core/src/main/java/com/lts/core/json/JSONArray.java
  25. 23 0
      lts-core/src/main/java/com/lts/core/json/JSONException.java
  26. 54 0
      lts-core/src/main/java/com/lts/core/json/JSONFactory.java
  27. 91 0
      lts-core/src/main/java/com/lts/core/json/JSONObject.java
  28. 23 0
      lts-core/src/main/java/com/lts/core/json/TypeReference.java
  29. 543 0
      lts-core/src/main/java/com/lts/core/json/TypeUtils.java
  30. 81 0
      lts-core/src/main/java/com/lts/core/json/fastjson/FastJSONAdapter.java
  31. 251 0
      lts-core/src/main/java/com/lts/core/json/fastjson/FastJSONArray.java
  32. 213 0
      lts-core/src/main/java/com/lts/core/json/fastjson/FastJSONObject.java
  33. 111 0
      lts-core/src/main/java/com/lts/core/json/jackson/JacksonJSONAdapter.java
  34. 326 0
      lts-core/src/main/java/com/lts/core/json/jackson/JacksonJSONArray.java
  35. 288 0
      lts-core/src/main/java/com/lts/core/json/jackson/JacksonJSONObject.java
  36. 6 5
      lts-core/src/main/java/com/lts/core/monitor/AbstractMonitor.java
  37. 4 4
      lts-core/src/main/java/com/lts/core/support/RetryScheduler.java
  38. 1 1
      lts-core/src/main/java/com/lts/core/support/Version.java
  39. 3 3
      lts-core/src/main/java/com/lts/ec/injvm/InjvmEventCenter.java
  40. 2 2
      lts-core/src/main/java/com/lts/jvmmonitor/JVMCollector.java
  41. 2 2
      lts-core/src/main/java/com/lts/remoting/protocol/RemotingCommand.java
  42. 2 0
      lts-core/src/main/resources/META-INF/lts/internal/com.lts.core.json.JSONAdapter
  43. 2 2
      lts-core/src/test/java/com/lts/core/failstore/berkeleydb/BerkeleydbFailStoreTest.java
  44. 2 2
      lts-core/src/test/java/com/lts/core/failstore/leveldb/LeveldbFailStoreTest.java
  45. 2 2
      lts-core/src/test/java/com/lts/core/failstore/mapdb/MapdbFailStoreTest.java
  46. 2 2
      lts-core/src/test/java/com/lts/core/failstore/rocksdb/RocksdbFailStoreTest.java
  47. 13 1
      lts-example/pom.xml
  48. 2 2
      lts-example/src/main/java/com/lts/example/support/TestJobRunnerTester.java
  49. 1 1
      lts-jobclient/pom.xml
  50. 3 3
      lts-jobclient/src/main/java/com/lts/jobclient/RetryJobClient.java
  51. 1 1
      lts-jobtracker/pom.xml
  52. 2 2
      lts-jobtracker/src/main/java/com/lts/jobtracker/command/AddJobCommand.java
  53. 2 2
      lts-jobtracker/src/main/java/com/lts/jobtracker/complete/JobRetryHandler.java
  54. 2 2
      lts-jobtracker/src/main/java/com/lts/jobtracker/sender/JobSender.java
  55. 2 2
      lts-jobtracker/src/main/java/com/lts/jobtracker/support/JobPusher.java
  56. 2 2
      lts-jobtracker/src/main/java/com/lts/jobtracker/support/checker/ExecutableDeadJobChecker.java
  57. 3 3
      lts-jobtracker/src/main/java/com/lts/jobtracker/support/checker/ExecutingDeadJobChecker.java
  58. 1 1
      lts-logger/lts-logger-api/pom.xml
  59. 1 1
      lts-logger/lts-logger-console/pom.xml
  60. 2 2
      lts-logger/lts-logger-console/src/main/java/com/lts/biz/logger/console/ConsoleJobLogger.java
  61. 1 1
      lts-logger/lts-logger-mongo/pom.xml
  62. 1 1
      lts-logger/lts-logger-mysql/pom.xml
  63. 5 6
      lts-logger/lts-logger-mysql/src/main/java/com/lts/biz/logger/mysql/MysqlJobLogger.java
  64. 1 1
      lts-logger/pom.xml
  65. 1 1
      lts-queue/lts-queue-api/pom.xml
  66. 2 2
      lts-queue/lts-queue-api/src/main/java/com/lts/queue/domain/JobPo.java
  67. 1 1
      lts-queue/lts-queue-mongo/pom.xml
  68. 2 2
      lts-queue/lts-queue-mongo/src/main/java/com/lts/queue/mongo/MongoJobFeedbackQueue.java
  69. 1 1
      lts-queue/lts-queue-mysql/pom.xml
  70. 3 3
      lts-queue/lts-queue-mysql/src/main/java/com/lts/queue/mysql/AbstractMysqlJobQueue.java
  71. 4 5
      lts-queue/lts-queue-mysql/src/main/java/com/lts/queue/mysql/MysqlJobFeedbackQueue.java
  72. 3 4
      lts-queue/lts-queue-mysql/src/main/java/com/lts/queue/mysql/support/ResultSetHandlerHolder.java
  73. 1 1
      lts-queue/pom.xml
  74. 1 1
      lts-spring/pom.xml
  75. 1 1
      lts-startup/lts-startup-admin/pom.xml
  76. 17 1
      lts-startup/lts-startup-jobtracker/pom.xml
  77. 17 1
      lts-startup/lts-startup-tasktracker/pom.xml
  78. 2 2
      lts-startup/lts-startup-tasktracker/src/main/java/com/lts/startup/test/TestJobRunner.java
  79. 1 1
      lts-startup/pom.xml
  80. 1 1
      lts-tasktracker/pom.xml
  81. 1 1
      lts/pom.xml
  82. 13 1
      pom.xml

+ 1 - 1
build.cmd

@@ -4,7 +4,7 @@ start mvn clean install -DskipTests
 echo "LTS: mvn clean install -DskipTests"
 echo "LTS: After sub window finished, close it , and press any key to continue" & pause>nul
 
-set VERSION=1.6.2
+set VERSION=1.6.3-SNAPSHOT
 set BASE_HOME=%~dp0%
 set DIST_BIN_DIR=lts-%VERSION%-bin
 

+ 1 - 1
build.sh

@@ -1,6 +1,6 @@
 #!/usr/bin/env bash
 
-VERSION="1.6.2"
+VERSION="1.6.3-SNAPSHOT"
 
 LTS_BIN="${BASH_SOURCE-$0}"
 LTS_BIN="$(dirname "${LTS_BIN}")"

+ 14 - 14
lts-admin/pom.xml

@@ -5,18 +5,12 @@
     <parent>
         <artifactId>lts-parent</artifactId>
         <groupId>com.lts</groupId>
-        <version>1.6.2</version>
+        <version>1.6.3-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
     <packaging>war</packaging>
     <artifactId>lts-admin</artifactId>
 
-    <properties>
-        <jackson.version>1.9.13</jackson.version>
-        <aspectj.version>1.7.2</aspectj.version>
-        <jackson2.version>2.2.3</jackson2.version>
-    </properties>
-
     <build>
         <plugins>
             <plugin>
@@ -138,38 +132,37 @@
         <dependency>
             <groupId>com.fasterxml.jackson.core</groupId>
             <artifactId>jackson-annotations</artifactId>
-            <version>${jackson2.version}</version>
+            <version>${jackson.version}</version>
         </dependency>
 
         <!-- databinding; ObjectMapper, JsonNode and related classes are here -->
         <dependency>
             <groupId>com.fasterxml.jackson.core</groupId>
             <artifactId>jackson-databind</artifactId>
-            <version>${jackson2.version}</version>
         </dependency>
 
         <!-- smile (binary JSON). Other artifacts in this group do other formats. -->
         <dependency>
             <groupId>com.fasterxml.jackson.dataformat</groupId>
             <artifactId>jackson-dataformat-smile</artifactId>
-            <version>${jackson2.version}</version>
+            <version>${jackson.version}</version>
         </dependency>
         <!-- JAX-RS provider -->
         <dependency>
             <groupId>com.fasterxml.jackson.jaxrs</groupId>
             <artifactId>jackson-jaxrs-json-provider</artifactId>
-            <version>${jackson2.version}</version>
+            <version>${jackson.version}</version>
         </dependency>
         <!-- Support for JAX-B annotations as additional configuration -->
         <dependency>
             <groupId>com.fasterxml.jackson.module</groupId>
             <artifactId>jackson-module-jaxb-annotations</artifactId>
-            <version>${jackson2.version}</version>
+            <version>${jackson.version}</version>
         </dependency>
         <dependency>
             <groupId>com.fasterxml.jackson.core</groupId>
             <artifactId>jackson-core</artifactId>
-            <version>${jackson2.version}</version>
+            <version>${jackson.version}</version>
         </dependency>
         <dependency>
             <groupId>commons-dbutils</groupId>
@@ -207,6 +200,13 @@
             <artifactId>velocity-tools</artifactId>
             <version>2.0</version>
         </dependency>
-
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-databind</artifactId>
+        </dependency>
     </dependencies>
 </project>

+ 5 - 3
lts-admin/src/main/java/com/lts/web/controller/api/JobQueueApiController.java

@@ -9,7 +9,7 @@ import com.lts.core.cluster.Node;
 import com.lts.core.cluster.NodeType;
 import com.lts.core.commons.utils.Assert;
 import com.lts.core.commons.utils.CollectionUtils;
-import com.lts.core.commons.utils.JSONUtils;
+import com.lts.core.json.JSON;
 import com.lts.core.commons.utils.StringUtils;
 import com.lts.core.domain.Job;
 import com.lts.core.logger.Logger;
@@ -327,12 +327,14 @@ public class JobQueueApiController extends AbstractController {
         job.setReplaceOnExist(true);
         // 这个是 cron expression 和 quartz 一样,可选
         job.setCronExpression(request.getCronExpression());
-        job.setTriggerTime(request.getTriggerTime());
+        if(request.getTriggerTime() != null){
+            job.setTriggerTime(request.getTriggerTime().getTime());
+        }
         job.setPriority(request.getPriority());
 
         Command command = new Command();
         command.setCommand(Commands.ADD_JOB);
-        command.addParam("job", JSONUtils.toJSONString(job));
+        command.addParam("job", JSON.toJSONString(job));
 
 
         NodeRequest nodeRequest = new NodeRequest();

+ 106 - 106
lts-admin/src/main/java/com/lts/web/filter/LoginAuthFilter.java

@@ -1,106 +1,106 @@
-package com.lts.web.filter;
-
-import com.lts.core.commons.utils.StringUtils;
-import com.lts.core.logger.Logger;
-import com.lts.core.logger.LoggerFactory;
-import sun.misc.BASE64Decoder;
-
-import javax.servlet.*;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.util.Properties;
-
-/**
- * Created by ztajy on 2015-11-11.
- * @author ztajy
- * @author hugui
- */
-public class LoginAuthFilter implements Filter {
-    private static final Logger log = LoggerFactory.getLogger(LoginAuthFilter.class);
-
-    private static final String AUTH_PREFIX = "Basic ";
-
-    private String username = "admin";
-
-    private String password = "admin";
-
-    private String[] excludedURLArray;
-
-    @Override
-    public void init(final FilterConfig filterConfig) throws ServletException {
-        String configFilePath = Thread.currentThread().getContextClassLoader().getResource("").getPath() + System.getProperty("file.separator") + filterConfig.getInitParameter("auth-config");
-        Properties props = new Properties();
-        try {
-            props.load(new FileInputStream(configFilePath));
-        } catch (final IOException ex) {
-            log.warn("Cannot found auth config file, use default auth config.");
-        }
-        username = props.getProperty("console.username", username);
-        password = props.getProperty("console.password", password);
-
-        String excludedURLs = filterConfig.getInitParameter("excludedURLs");
-        if (StringUtils.isNotEmpty(excludedURLs)) {
-            String[] arr = excludedURLs.split(",");
-            excludedURLArray = new String[arr.length];
-            for (int i = 0; i < arr.length; i++) {
-                excludedURLArray[i] = StringUtils.trim(arr[i]);
-            }
-        }
-    }
-
-    @Override
-    public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain) throws IOException, ServletException {
-        HttpServletRequest httpRequest = (HttpServletRequest) request;
-        HttpServletResponse httpResponse = (HttpServletResponse) response;
-
-        if (isExclude(httpRequest.getRequestURI())) {
-            chain.doFilter(request, response);
-            return;
-        }
-
-        String authorization = httpRequest.getHeader("authorization");
-        if (null != authorization && authorization.length() > AUTH_PREFIX.length()) {
-            authorization = authorization.substring(AUTH_PREFIX.length(), authorization.length());
-            if ((username + ":" + password).equals(new String(new BASE64Decoder().decodeBuffer(authorization)))) {
-                authenticateSuccess(httpResponse);
-                chain.doFilter(httpRequest, httpResponse);
-            } else {
-                needAuthenticate(httpRequest, httpResponse);
-            }
-        } else {
-            needAuthenticate(httpRequest, httpResponse);
-        }
-    }
-
-    private boolean isExclude(String path) {
-        if (excludedURLArray != null) {
-            for (String page : excludedURLArray) {
-                //判断是否在过滤url中
-                if (path.equals(page)) {
-                    return true;
-                }
-            }
-        }
-        return false;
-    }
-
-    private void authenticateSuccess(final HttpServletResponse response) {
-        response.setStatus(200);
-        response.setHeader("Pragma", "No-cache");
-        response.setHeader("Cache-Control", "no-store");
-        response.setDateHeader("Expires", 0);
-    }
-
-    private void needAuthenticate(final HttpServletRequest request, final HttpServletResponse response) {
-        response.setStatus(401);
-        response.setHeader("Cache-Control", "no-store");
-        response.setDateHeader("Expires", 0);
-        response.setHeader("WWW-authenticate", AUTH_PREFIX + "Realm=\"lts admin need auth\"");
-    }
-
-    @Override
-    public void destroy() {
-    }
-}
+package com.lts.web.filter;
+
+import com.lts.core.commons.utils.StringUtils;
+import com.lts.core.logger.Logger;
+import com.lts.core.logger.LoggerFactory;
+import sun.misc.BASE64Decoder;
+
+import javax.servlet.*;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.Properties;
+
+/**
+ * Created by ztajy on 2015-11-11.
+ * @author ztajy
+ * @author hugui
+ */
+public class LoginAuthFilter implements Filter {
+    private static final Logger log = LoggerFactory.getLogger(LoginAuthFilter.class);
+
+    private static final String AUTH_PREFIX = "Basic ";
+
+    private String username = "admin";
+
+    private String password = "admin";
+
+    private String[] excludedURLArray;
+
+    @Override
+    public void init(final FilterConfig filterConfig) throws ServletException {
+        String configFilePath = Thread.currentThread().getContextClassLoader().getResource("").getPath() + System.getProperty("file.separator") + filterConfig.getInitParameter("auth-config");
+        Properties props = new Properties();
+        try {
+            props.load(new FileInputStream(configFilePath));
+        } catch (final IOException ex) {
+            log.warn("Cannot found auth config file, use default auth config.");
+        }
+        username = props.getProperty("console.username", username);
+        password = props.getProperty("console.password", password);
+
+        String excludedURLs = filterConfig.getInitParameter("excludedURLs");
+        if (StringUtils.isNotEmpty(excludedURLs)) {
+            String[] arr = excludedURLs.split(",");
+            excludedURLArray = new String[arr.length];
+            for (int i = 0; i < arr.length; i++) {
+                excludedURLArray[i] = StringUtils.trim(arr[i]);
+            }
+        }
+    }
+
+    @Override
+    public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain) throws IOException, ServletException {
+        HttpServletRequest httpRequest = (HttpServletRequest) request;
+        HttpServletResponse httpResponse = (HttpServletResponse) response;
+
+        if (isExclude(httpRequest.getRequestURI())) {
+            chain.doFilter(request, response);
+            return;
+        }
+
+        String authorization = httpRequest.getHeader("authorization");
+        if (null != authorization && authorization.length() > AUTH_PREFIX.length()) {
+            authorization = authorization.substring(AUTH_PREFIX.length(), authorization.length());
+            if ((username + ":" + password).equals(new String(new BASE64Decoder().decodeBuffer(authorization)))) {
+                authenticateSuccess(httpResponse);
+                chain.doFilter(httpRequest, httpResponse);
+            } else {
+                needAuthenticate(httpRequest, httpResponse);
+            }
+        } else {
+            needAuthenticate(httpRequest, httpResponse);
+        }
+    }
+
+    private boolean isExclude(String path) {
+        if (excludedURLArray != null) {
+            for (String page : excludedURLArray) {
+                //判断是否在过滤url中
+                if (path.equals(page)) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    private void authenticateSuccess(final HttpServletResponse response) {
+        response.setStatus(200);
+        response.setHeader("Pragma", "No-cache");
+        response.setHeader("Cache-Control", "no-store");
+        response.setDateHeader("Expires", 0);
+    }
+
+    private void needAuthenticate(final HttpServletRequest request, final HttpServletResponse response) {
+        response.setStatus(401);
+        response.setHeader("Cache-Control", "no-store");
+        response.setDateHeader("Expires", 0);
+        response.setHeader("WWW-authenticate", AUTH_PREFIX + "Realm=\"lts admin need auth\"");
+    }
+
+    @Override
+    public void destroy() {
+    }
+}

+ 6 - 8
lts-admin/src/main/java/com/lts/web/service/MonitorDataService.java

@@ -1,13 +1,13 @@
 package com.lts.web.service;
 
-import com.alibaba.fastjson.TypeReference;
 import com.lts.core.commons.utils.BeanUtils;
 import com.lts.core.commons.utils.CollectionUtils;
-import com.lts.core.commons.utils.JSONUtils;
+import com.lts.core.json.JSON;
 import com.lts.core.domain.monitor.JVMMonitorData;
 import com.lts.core.domain.monitor.JobTrackerMonitorData;
 import com.lts.core.domain.monitor.MonitorData;
 import com.lts.core.domain.monitor.TaskTrackerMonitorData;
+import com.lts.core.json.TypeReference;
 import com.lts.core.support.SystemClock;
 import com.lts.web.repository.domain.*;
 import com.lts.web.repository.mapper.*;
@@ -46,9 +46,8 @@ public class MonitorDataService {
      */
     public void addTaskTrackerMonitorData(MonitorDataAddRequest request) {
 
-        List<TaskTrackerMonitorData> mds = JSONUtils.parse(request.getData(),
-                new TypeReference<List<TaskTrackerMonitorData>>() {
-                });
+        List<TaskTrackerMonitorData> mds = JSON.parse(request.getData(),
+                new TypeReference<List<TaskTrackerMonitorData>>(){});
         if (CollectionUtils.isEmpty(mds)) {
             throw new IllegalArgumentException("monitorData can not be null");
         }
@@ -88,9 +87,8 @@ public class MonitorDataService {
      * 添加JobTracker监控数据
      */
     public void addJobTrackerMonitorData(MonitorDataAddRequest request) {
-        List<JobTrackerMonitorData> mds = JSONUtils.parse(request.getData(),
-                new TypeReference<List<JobTrackerMonitorData>>() {
-                });
+        List<JobTrackerMonitorData> mds = JSON.parse(request.getData(),
+                new TypeReference<List<JobTrackerMonitorData>>(){});
         if (CollectionUtils.isEmpty(mds)) {
             throw new IllegalArgumentException("monitorData can not be null");
         }

+ 2 - 2
lts-admin/src/main/java/com/lts/web/support/spring/ExceptionHandlerResolver.java

@@ -1,6 +1,6 @@
 package com.lts.web.support.spring;
 
-import com.lts.core.commons.utils.JSONUtils;
+import com.lts.core.json.JSON;
 import com.lts.web.support.AjaxUtils;
 import com.lts.web.vo.RestfulResponse;
 import org.slf4j.Logger;
@@ -36,7 +36,7 @@ public class ExceptionHandlerResolver implements HandlerExceptionResolver {
                 StringWriter sw = new StringWriter();
                 ex.printStackTrace(new PrintWriter(sw));
                 restfulResponse.setMsg(sw.toString());
-                writer.write(JSONUtils.toJSONString(restfulResponse));
+                writer.write(JSON.toJSONString(restfulResponse));
                 writer.flush();
             } catch (IOException e) {
                 LOGGER.error(e.getMessage(), e);

+ 4 - 5
lts-admin/src/main/java/com/lts/web/support/spring/MapEditor.java

@@ -1,7 +1,7 @@
 package com.lts.web.support.spring;
 
-import com.alibaba.fastjson.TypeReference;
-import com.lts.core.commons.utils.JSONUtils;
+import com.lts.core.json.JSON;
+import com.lts.core.json.TypeReference;
 import org.springframework.util.StringUtils;
 
 import java.beans.PropertyEditorSupport;
@@ -21,8 +21,7 @@ public class MapEditor extends PropertyEditorSupport {
         if (!StringUtils.hasText(text)) {
             setValue(null);
         } else {
-            setValue(JSONUtils.parse(text, new TypeReference<HashMap<String, String>>() {
-            }));
+            setValue(JSON.parse(text, new TypeReference<HashMap<String, String>>(){}));
         }
     }
 
@@ -33,6 +32,6 @@ public class MapEditor extends PropertyEditorSupport {
         if (value == null) {
             return "";
         }
-        return JSONUtils.toJSONString(value);
+        return JSON.toJSONString(value);
     }
 }

+ 12 - 1
lts-core/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>lts-parent</artifactId>
         <groupId>com.lts</groupId>
-        <version>1.6.2</version>
+        <version>1.6.3-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
     <packaging>jar</packaging>
@@ -25,6 +25,7 @@
         <dependency>
             <groupId>com.alibaba</groupId>
             <artifactId>fastjson</artifactId>
+            <scope>provided</scope>
         </dependency>
         <dependency>
             <groupId>org.slf4j</groupId>
@@ -125,5 +126,15 @@
             <artifactId>groovy</artifactId>
             <scope>provided</scope>
         </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-core</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-databind</artifactId>
+            <scope>provided</scope>
+        </dependency>
     </dependencies>
 </project>

+ 2 - 2
lts-core/src/main/java/com/lts/core/cluster/Config.java

@@ -1,6 +1,6 @@
 package com.lts.core.cluster;
 
-import com.lts.core.commons.utils.JSONUtils;
+import com.lts.core.json.JSON;
 import com.lts.core.compiler.support.AdaptiveCompiler;
 import com.lts.core.constant.Constants;
 
@@ -265,6 +265,6 @@ public class Config implements Serializable {
 
     @Override
     public String toString() {
-        return JSONUtils.toJSONString(this);
+        return JSON.toJSONString(this);
     }
 }

+ 13 - 2
lts-core/src/main/java/com/lts/core/cluster/Node.java

@@ -1,6 +1,7 @@
 package com.lts.core.cluster;
 
-import com.lts.core.commons.utils.JSONUtils;
+import com.lts.core.domain.Job;
+import com.lts.core.json.JSON;
 import com.lts.core.registry.NodeRegistryUtils;
 
 import java.util.ArrayList;
@@ -33,6 +34,16 @@ public class Node {
 
     private String fullString;
 
+    private Job job;
+
+    public Job getJob() {
+        return job;
+    }
+
+    public void setJob(Job job) {
+        this.job = job;
+    }
+
     public Integer getCommandPort() {
         return commandPort;
     }
@@ -165,6 +176,6 @@ public class Node {
 
     @Override
     public String toString() {
-        return JSONUtils.toJSONString(this);
+        return JSON.toJSONString(this);
     }
 }

+ 254 - 0
lts-core/src/main/java/com/lts/core/commons/utils/Base64.java

@@ -0,0 +1,254 @@
+package com.lts.core.commons.utils;
+
+import java.util.Arrays;
+
+/**
+ * A very fast and memory efficient class to encode and decode to and from BASE64 in full accordance with RFC 2045.<br>
+ * <br>
+ * On Windows XP sp1 with 1.4.2_04 and later ;), this encoder and decoder is about 10 times faster on small arrays (10 -
+ * 1000 bytes) and 2-3 times as fast on larger arrays (10000 - 1000000 bytes) compared to
+ * <code>sun.misc.Encoder()/Decoder()</code>.<br>
+ * <br>
+ * On byte arrays the encoder is about 20% faster than Jakarta Commons Base64 Codec for encode and about 50% faster for
+ * decoding large arrays. This implementation is about twice as fast on very small arrays (&lt 30 bytes). If
+ * source/destination is a <code>String</code> this version is about three times as fast due to the fact that the
+ * Commons Codec result has to be recoded to a <code>String</code> from <code>byte[]</code>, which is very expensive.<br>
+ * <br>
+ * This encode/decode algorithm doesn't create any temporary arrays as many other codecs do, it only allocates the
+ * resulting array. This produces less garbage and it is possible to handle arrays twice as large as algorithms that
+ * create a temporary array. (E.g. Jakarta Commons Codec). It is unknown whether Sun's
+ * <code>sun.misc.Encoder()/Decoder()</code> produce temporary arrays but since performance is quite low it probably
+ * does.<br>
+ * <br>
+ * The encoder produces the same output as the Sun one except that the Sun's encoder appends a trailing line separator
+ * if the last character isn't a pad. Unclear why but it only adds to the length and is probably a side effect. Both are
+ * in conformance with RFC 2045 though.<br>
+ * Commons codec seem to always att a trailing line separator.<br>
+ * <br>
+ * <b>Note!</b> The encode/decode method pairs (types) come in three versions with the <b>exact</b> same algorithm and
+ * thus a lot of code redundancy. This is to not create any temporary arrays for transcoding to/from different format
+ * types. The methods not used can simply be commented out.<br>
+ * <br>
+ * There is also a "fast" version of all decode methods that works the same way as the normal ones, but har a few
+ * demands on the decoded input. Normally though, these fast verions should be used if the source if the input is known
+ * and it hasn't bee tampered with.<br>
+ * <br>
+ * If you find the code useful or you find a bug, please send me a note at base64 @ miginfocom . com. Licence (BSD):
+ * ============== Copyright (c) 2004, Mikael Grev, MiG InfoCom AB. (base64 @ miginfocom . com) All rights reserved.
+ * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
+ * following conditions are met: Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation and/or other materials provided with the
+ * distribution. Neither the name of the MiG InfoCom AB nor the names of its contributors may be used to endorse or
+ * promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY
+ * THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
+ * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @version 2.2
+ * @author Mikael Grev Date: 2004-aug-02 Time: 11:31:11
+ */
+public class Base64 {
+
+    public static final char[] CA = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".toCharArray();
+    public static final int[]  IA = new int[256];
+    static {
+        Arrays.fill(IA, -1);
+        for (int i = 0, iS = CA.length; i < iS; i++)
+            IA[CA[i]] = i;
+        IA['='] = 0;
+    }
+
+    /**
+     * Decodes a BASE64 encoded char array that is known to be resonably well formatted. The method is about twice as
+     * fast as {@link #decode(char[])}. The preconditions are:<br>
+     * + The array must have a line length of 76 chars OR no line separators at all (one line).<br>
+     * + Line separator must be "\r\n", as specified in RFC 2045 + The array must not contain illegal characters within
+     * the encoded string<br>
+     * + The array CAN have illegal characters at the beginning and end, those will be dealt with appropriately.<br>
+     *
+     * @param chars The source array. Length 0 will return an empty array. <code>null</code> will throw an exception.
+     * @return The decoded array of bytes. May be of length 0.
+     */
+    public final static byte[] decodeFast(char[] chars, int offset, int charsLen) {
+        // Check special case
+        if (charsLen == 0) {
+            return new byte[0];
+        }
+
+        int sIx = offset, eIx = offset + charsLen - 1; // Start and end index after trimming.
+
+        // Trim illegal chars from start
+        while (sIx < eIx && IA[chars[sIx]] < 0)
+            sIx++;
+
+        // Trim illegal chars from end
+        while (eIx > 0 && IA[chars[eIx]] < 0)
+            eIx--;
+
+        // get the padding count (=) (0, 1 or 2)
+        int pad = chars[eIx] == '=' ? (chars[eIx - 1] == '=' ? 2 : 1) : 0; // Count '=' at end.
+        int cCnt = eIx - sIx + 1; // Content count including possible separators
+        int sepCnt = charsLen > 76 ? (chars[76] == '\r' ? cCnt / 78 : 0) << 1 : 0;
+
+        int len = ((cCnt - sepCnt) * 6 >> 3) - pad; // The number of decoded bytes
+        byte[] bytes = new byte[len]; // Preallocate byte[] of exact length
+
+        // Decode all but the last 0 - 2 bytes.
+        int d = 0;
+        for (int cc = 0, eLen = (len / 3) * 3; d < eLen;) {
+            // Assemble three bytes into an int from four "valid" characters.
+            int i = IA[chars[sIx++]] << 18 | IA[chars[sIx++]] << 12 | IA[chars[sIx++]] << 6 | IA[chars[sIx++]];
+
+            // Add the bytes
+            bytes[d++] = (byte) (i >> 16);
+            bytes[d++] = (byte) (i >> 8);
+            bytes[d++] = (byte) i;
+
+            // If line separator, jump over it.
+            if (sepCnt > 0 && ++cc == 19) {
+                sIx += 2;
+                cc = 0;
+            }
+        }
+
+        if (d < len) {
+            // Decode last 1-3 bytes (incl '=') into 1-3 bytes
+            int i = 0;
+            for (int j = 0; sIx <= eIx - pad; j++)
+                i |= IA[chars[sIx++]] << (18 - j * 6);
+
+            for (int r = 16; d < len; r -= 8)
+                bytes[d++] = (byte) (i >> r);
+        }
+
+        return bytes;
+    }
+
+    public final static byte[] decodeFast(String chars, int offset, int charsLen) {
+        // Check special case
+        if (charsLen == 0) {
+            return new byte[0];
+        }
+
+        int sIx = offset, eIx = offset + charsLen - 1; // Start and end index after trimming.
+
+        // Trim illegal chars from start
+        while (sIx < eIx && IA[chars.charAt(sIx)] < 0)
+            sIx++;
+
+        // Trim illegal chars from end
+        while (eIx > 0 && IA[chars.charAt(eIx)] < 0)
+            eIx--;
+
+        // get the padding count (=) (0, 1 or 2)
+        int pad = chars.charAt(eIx) == '=' ? (chars.charAt(eIx - 1) == '=' ? 2 : 1) : 0; // Count '=' at end.
+        int cCnt = eIx - sIx + 1; // Content count including possible separators
+        int sepCnt = charsLen > 76 ? (chars.charAt(76) == '\r' ? cCnt / 78 : 0) << 1 : 0;
+
+        int len = ((cCnt - sepCnt) * 6 >> 3) - pad; // The number of decoded bytes
+        byte[] bytes = new byte[len]; // Preallocate byte[] of exact length
+
+        // Decode all but the last 0 - 2 bytes.
+        int d = 0;
+        for (int cc = 0, eLen = (len / 3) * 3; d < eLen;) {
+            // Assemble three bytes into an int from four "valid" characters.
+            int i = IA[chars.charAt(sIx++)] << 18 | IA[chars.charAt(sIx++)] << 12 | IA[chars.charAt(sIx++)] << 6 | IA[chars.charAt(sIx++)];
+
+            // Add the bytes
+            bytes[d++] = (byte) (i >> 16);
+            bytes[d++] = (byte) (i >> 8);
+            bytes[d++] = (byte) i;
+
+            // If line separator, jump over it.
+            if (sepCnt > 0 && ++cc == 19) {
+                sIx += 2;
+                cc = 0;
+            }
+        }
+
+        if (d < len) {
+            // Decode last 1-3 bytes (incl '=') into 1-3 bytes
+            int i = 0;
+            for (int j = 0; sIx <= eIx - pad; j++)
+                i |= IA[chars.charAt(sIx++)] << (18 - j * 6);
+
+            for (int r = 16; d < len; r -= 8)
+                bytes[d++] = (byte) (i >> r);
+        }
+
+        return bytes;
+    }
+
+    /**
+     * Decodes a BASE64 encoded string that is known to be resonably well formatted. The method is about twice as fast
+     * as {@link #decode(String)}. The preconditions are:<br>
+     * + The array must have a line length of 76 chars OR no line separators at all (one line).<br>
+     * + Line separator must be "\r\n", as specified in RFC 2045 + The array must not contain illegal characters within
+     * the encoded string<br>
+     * + The array CAN have illegal characters at the beginning and end, those will be dealt with appropriately.<br>
+     *
+     * @param s The source string. Length 0 will return an empty array. <code>null</code> will throw an exception.
+     * @return The decoded array of bytes. May be of length 0.
+     */
+    public final static byte[] decodeFast(String s) {
+        // Check special case
+        int sLen = s.length();
+        if (sLen == 0) {
+            return new byte[0];
+        }
+
+        int sIx = 0, eIx = sLen - 1; // Start and end index after trimming.
+
+        // Trim illegal chars from start
+        while (sIx < eIx && IA[s.charAt(sIx) & 0xff] < 0)
+            sIx++;
+
+        // Trim illegal chars from end
+        while (eIx > 0 && IA[s.charAt(eIx) & 0xff] < 0)
+            eIx--;
+
+        // get the padding count (=) (0, 1 or 2)
+        int pad = s.charAt(eIx) == '=' ? (s.charAt(eIx - 1) == '=' ? 2 : 1) : 0; // Count '=' at end.
+        int cCnt = eIx - sIx + 1; // Content count including possible separators
+        int sepCnt = sLen > 76 ? (s.charAt(76) == '\r' ? cCnt / 78 : 0) << 1 : 0;
+
+        int len = ((cCnt - sepCnt) * 6 >> 3) - pad; // The number of decoded bytes
+        byte[] dArr = new byte[len]; // Preallocate byte[] of exact length
+
+        // Decode all but the last 0 - 2 bytes.
+        int d = 0;
+        for (int cc = 0, eLen = (len / 3) * 3; d < eLen;) {
+            // Assemble three bytes into an int from four "valid" characters.
+            int i = IA[s.charAt(sIx++)] << 18 | IA[s.charAt(sIx++)] << 12 | IA[s.charAt(sIx++)] << 6
+                    | IA[s.charAt(sIx++)];
+
+            // Add the bytes
+            dArr[d++] = (byte) (i >> 16);
+            dArr[d++] = (byte) (i >> 8);
+            dArr[d++] = (byte) i;
+
+            // If line separator, jump over it.
+            if (sepCnt > 0 && ++cc == 19) {
+                sIx += 2;
+                cc = 0;
+            }
+        }
+
+        if (d < len) {
+            // Decode last 1-3 bytes (incl '=') into 1-3 bytes
+            int i = 0;
+            for (int j = 0; sIx <= eIx - pad; j++)
+                i |= IA[s.charAt(sIx++)] << (18 - j * 6);
+
+            for (int r = 16; d < len; r -= 8)
+                dArr[d++] = (byte) (i >> r);
+        }
+
+        return dArr;
+    }
+}

+ 0 - 58
lts-core/src/main/java/com/lts/core/commons/utils/JSONUtils.java

@@ -1,58 +0,0 @@
-package com.lts.core.commons.utils;
-
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
-import com.alibaba.fastjson.TypeReference;
-
-import java.lang.reflect.Type;
-
-/**
- * @author Robert HG (254963746@qq.com) on 6/23/14.
- */
-public class JSONUtils {
-
-    public static <T> T parse(String json, Type type) {
-        if (StringUtils.isEmpty(json)) {
-            return null;
-        }
-        return JSONObject.parseObject(json, type);
-    }
-
-    public static <T> T parse(String json, TypeReference<T> type) {
-        if (StringUtils.isEmpty(json)) {
-            return null;
-        }
-        return JSONObject.parseObject(json, type);
-    }
-
-    public static String toJSONString(Object obj) {
-        if (obj == null) {
-            return null;
-        }
-        return JSONObject.toJSONString(obj);
-    }
-
-    public static JSONObject toJSON(Object obj) {
-        if (obj == null) {
-            return null;
-        }
-        return (JSONObject) JSONObject.toJSON(obj);
-    }
-
-    public static JSONArray parseArray(String obj) {
-        if (obj == null) {
-            return null;
-        }
-        return JSON.parseArray(obj);
-    }
-
-    public static JSONObject parseObject(String obj) {
-        if (obj == null) {
-            return null;
-        }
-        return JSON.parseObject(obj);
-    }
-
-}
-

+ 8 - 0
lts-core/src/main/java/com/lts/core/commons/utils/StringUtils.java

@@ -152,4 +152,12 @@ public final class StringUtils {
             return false;
         return INT_PATTERN.matcher(str).matches();
     }
+
+    public static String toString(Object value) {
+        if (value == null) {
+            return null;
+        }
+
+        return value.toString();
+    }
 }

+ 3 - 3
lts-core/src/main/java/com/lts/core/domain/Job.java

@@ -1,7 +1,7 @@
 package com.lts.core.domain;
 
 
-import com.lts.core.commons.utils.JSONUtils;
+import com.lts.core.json.JSON;
 import com.lts.core.commons.utils.StringUtils;
 import com.lts.core.exception.JobSubmitException;
 import com.lts.core.support.CronExpression;
@@ -134,7 +134,7 @@ public class Job implements Serializable{
         return this.cronExpression != null && !"".equals(this.cronExpression.trim());
     }
 
-    public void setTriggerTime(Date date) {
+    public void setTriggerDate(Date date) {
         if (date != null) {
             this.triggerTime = date.getTime();
         }
@@ -158,7 +158,7 @@ public class Job implements Serializable{
 
     @Override
     public String toString() {
-        return JSONUtils.toJSONString(this);
+        return JSON.toJSONString(this);
     }
 
     public void checkField() throws JobSubmitException {

+ 2 - 2
lts-core/src/main/java/com/lts/core/domain/JobResult.java

@@ -1,6 +1,6 @@
 package com.lts.core.domain;
 
-import com.lts.core.commons.utils.JSONUtils;
+import com.lts.core.json.JSON;
 
 import java.io.Serializable;
 
@@ -55,6 +55,6 @@ public class JobResult implements Serializable{
 
     @Override
     public String toString() {
-        return JSONUtils.toJSONString(this);
+        return JSON.toJSONString(this);
     }
 }

+ 2 - 2
lts-core/src/main/java/com/lts/core/domain/TaskTrackerJobResult.java

@@ -1,6 +1,6 @@
 package com.lts.core.domain;
 
-import com.lts.core.commons.utils.JSONUtils;
+import com.lts.core.json.JSON;
 
 import java.io.Serializable;
 
@@ -54,6 +54,6 @@ public class TaskTrackerJobResult implements Serializable{
 
     @Override
     public String toString() {
-        return JSONUtils.toJSONString(this);
+        return JSON.toJSONString(this);
     }
 }

+ 3 - 3
lts-core/src/main/java/com/lts/core/failstore/berkeleydb/BerkeleydbFailStore.java

@@ -2,7 +2,7 @@ package com.lts.core.failstore.berkeleydb;
 
 import com.lts.core.commons.file.FileUtils;
 import com.lts.core.commons.utils.CollectionUtils;
-import com.lts.core.commons.utils.JSONUtils;
+import com.lts.core.json.JSON;
 import com.lts.core.domain.KVPair;
 import com.lts.core.failstore.AbstractFailStore;
 import com.lts.core.failstore.FailStoreException;
@@ -71,7 +71,7 @@ public class BerkeleydbFailStore extends AbstractFailStore {
     @Override
     public void put(String key, Object value) throws FailStoreException {
         try {
-            String valueString = JSONUtils.toJSONString(value);
+            String valueString = JSON.toJSONString(value);
             @SuppressWarnings("unused")
 			OperationStatus status = db.put(null, new DatabaseEntry(key.getBytes("UTF-8")),
                     new DatabaseEntry(valueString.getBytes("UTF-8")));
@@ -116,7 +116,7 @@ public class BerkeleydbFailStore extends AbstractFailStore {
                 String key = new String(foundKey.getData(), "UTF-8");
                 String valueString = new String(foundValue.getData(), "UTF-8");
 
-                T value = JSONUtils.parse(valueString, type);
+                T value = JSON.parse(valueString, type);
                 KVPair<String, T> pair = new KVPair<String, T>(key, value);
                 list.add(pair);
                 if (list.size() >= size) {

+ 3 - 3
lts-core/src/main/java/com/lts/core/failstore/leveldb/LeveldbFailStore.java

@@ -1,7 +1,7 @@
 package com.lts.core.failstore.leveldb;
 
 import com.lts.core.commons.file.FileUtils;
-import com.lts.core.commons.utils.JSONUtils;
+import com.lts.core.json.JSON;
 import com.lts.core.domain.KVPair;
 import com.lts.core.failstore.AbstractFailStore;
 import com.lts.core.failstore.FailStoreException;
@@ -61,7 +61,7 @@ public class LeveldbFailStore extends AbstractFailStore {
     @Override
     public void put(String key, Object value) throws FailStoreException {
         try {
-            String valueString = JSONUtils.toJSONString(value);
+            String valueString = JSON.toJSONString(value);
             db.put(key.getBytes("UTF-8"), valueString.getBytes("UTF-8"));
         } catch (Exception e) {
             throw new FailStoreException(e);
@@ -114,7 +114,7 @@ public class LeveldbFailStore extends AbstractFailStore {
             for (iterator.seekToFirst(); iterator.hasNext(); iterator.next()) {
                 Map.Entry<byte[], byte[]> entry = iterator.peekNext();
                 String key = new String(entry.getKey(), "UTF-8");
-                T value = JSONUtils.parse(new String(entry.getValue(), "UTF-8"), type);
+                T value = JSON.parse(new String(entry.getValue(), "UTF-8"), type);
                 KVPair<String, T> pair = new KVPair<String, T>(key, value);
                 list.add(pair);
                 if (list.size() >= size) {

+ 3 - 3
lts-core/src/main/java/com/lts/core/failstore/mapdb/MapdbFailStore.java

@@ -1,7 +1,7 @@
 package com.lts.core.failstore.mapdb;
 
 import com.lts.core.commons.file.FileUtils;
-import com.lts.core.commons.utils.JSONUtils;
+import com.lts.core.json.JSON;
 import com.lts.core.domain.KVPair;
 import com.lts.core.failstore.AbstractFailStore;
 import com.lts.core.failstore.FailStoreException;
@@ -60,7 +60,7 @@ public class MapdbFailStore extends AbstractFailStore {
     @Override
     public void put(String key, Object value) throws FailStoreException {
         try {
-            String valueString = JSONUtils.toJSONString(value);
+            String valueString = JSON.toJSONString(value);
             map.put(key, valueString);
             // persist changes into disk
             db.commit();
@@ -107,7 +107,7 @@ public class MapdbFailStore extends AbstractFailStore {
         }
         for (Map.Entry<String, String> entry : map.entrySet()) {
             String key = entry.getKey();
-            T value = JSONUtils.parse(entry.getValue(), type);
+            T value = JSON.parse(entry.getValue(), type);
             KVPair<String, T> pair = new KVPair<String, T>(key, value);
             list.add(pair);
             if (list.size() >= size) {

+ 3 - 3
lts-core/src/main/java/com/lts/core/failstore/rocksdb/RocksdbFailStore.java

@@ -2,7 +2,7 @@ package com.lts.core.failstore.rocksdb;
 
 import com.lts.core.commons.file.FileUtils;
 import com.lts.core.commons.utils.CollectionUtils;
-import com.lts.core.commons.utils.JSONUtils;
+import com.lts.core.json.JSON;
 import com.lts.core.domain.KVPair;
 import com.lts.core.failstore.AbstractFailStore;
 import com.lts.core.failstore.FailStoreException;
@@ -73,7 +73,7 @@ public class RocksdbFailStore extends AbstractFailStore {
 
     @Override
     public void put(String key, Object value) throws FailStoreException {
-        String valueString = JSONUtils.toJSONString(value);
+        String valueString = JSON.toJSONString(value);
         WriteOptions writeOpts = new WriteOptions();
         try {
             writeOpts.setSync(true);
@@ -114,7 +114,7 @@ public class RocksdbFailStore extends AbstractFailStore {
             for (iterator.seekToFirst(); iterator.isValid(); iterator.next()) {
                 iterator.status();
                 String key = new String(iterator.key(), "UTF-8");
-                T value = JSONUtils.parse(new String(iterator.value(), "UTF-8"), type);
+                T value = JSON.parse(new String(iterator.value(), "UTF-8"), type);
                 KVPair<String, T> pair = new KVPair<String, T>(key, value);
                 list.add(pair);
                 if (list.size() >= size) {

+ 133 - 0
lts-core/src/main/java/com/lts/core/json/JSON.java

@@ -0,0 +1,133 @@
+package com.lts.core.json;
+
+import com.lts.core.commons.utils.StringUtils;
+
+import java.lang.reflect.Type;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author Robert HG (254963746@qq.com) on 6/23/14.
+ */
+public class JSON {
+
+    private static JSONAdapter aware = JSONFactory.getJSONAdapter();
+
+    public static final <T> T parse(String json, Type type) {
+        try {
+            if (StringUtils.isEmpty(json)) {
+                return null;
+            }
+            return aware.parse(json, type);
+        } catch (Exception e) {
+            throw new JSONException(e);
+        }
+    }
+
+    public static final <T> T parse(String json, TypeReference<T> typeReference) {
+        try {
+            return aware.parse(json, typeReference.getType());
+        } catch (Exception e) {
+            throw new JSONException(e);
+        }
+    }
+
+    public static final String toJSONString(Object obj) {
+        try {
+            if (obj == null) {
+                return null;
+            }
+            return aware.toJSONString(obj);
+        } catch (Exception e) {
+            throw new JSONException(e);
+        }
+    }
+
+    public static final JSONObject toJSONObject(Object obj) {
+        try {
+            if (obj == null) {
+                return null;
+            }
+            return aware.toJSONObject(obj);
+        } catch (Exception e) {
+            throw new JSONException(e);
+        }
+    }
+
+    public static final JSONArray toJSONArray(Object obj) {
+        try {
+            if (obj == null) {
+                return null;
+            }
+            return aware.toJSONArray(obj);
+        } catch (Exception e) {
+            throw new JSONException(e);
+        }
+    }
+
+    public static final JSONArray parseArray(String obj) {
+        try {
+            return aware.parseArray(obj);
+        } catch (Exception e) {
+            throw new JSONException(e);
+        }
+    }
+
+    public static final JSONObject parseObject(String obj) {
+        try {
+            return aware.parseObject(obj);
+        } catch (Exception e) {
+            throw new JSONException(e);
+        }
+    }
+
+    public static final JSONObject newJSONObject() {
+        try {
+            return aware.newJSONObject();
+        } catch (Exception e) {
+            throw new JSONException(e);
+        }
+    }
+
+    public static final JSONArray newJSONArray() {
+        try {
+            return aware.newJSONArray();
+        } catch (Exception e) {
+            throw new JSONException(e);
+        }
+    }
+
+    public static final JSONObject newJSONObject(Map<String, Object> map) {
+        try {
+            return aware.newJSONObject(map);
+        } catch (Exception e) {
+            throw new JSONException(e);
+        }
+    }
+
+    public static final JSONObject newJSONObject(int initialCapacity) {
+        try {
+            return aware.newJSONObject(initialCapacity);
+        } catch (Exception e) {
+            throw new JSONException(e);
+        }
+    }
+
+    public static final JSONArray newJSONArray(List<Object> list) {
+        try {
+            return aware.newJSONArray(list);
+        } catch (Exception e) {
+            throw new JSONException(e);
+        }
+    }
+
+    public static final JSONArray newJSONArray(int initialCapacity) {
+        try {
+            return aware.newJSONArray(initialCapacity);
+        } catch (Exception e) {
+            throw new JSONException(e);
+        }
+    }
+
+}
+

+ 38 - 0
lts-core/src/main/java/com/lts/core/json/JSONAdapter.java

@@ -0,0 +1,38 @@
+package com.lts.core.json;
+
+import java.lang.reflect.Type;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author Robert HG (254963746@qq.com) on 11/19/15.
+ */
+public interface JSONAdapter {
+
+    public String getName();
+
+    public <T> T parse(String json, Type type);
+
+    public String toJSONString(Object obj);
+
+    public JSONObject toJSONObject(Object obj);
+
+    public JSONArray toJSONArray(Object obj);
+
+    public JSONArray parseArray(String json);
+
+    public JSONObject parseObject(String json);
+
+    public JSONObject newJSONObject();
+
+    public JSONObject newJSONObject(Map<String, Object> map);
+
+    public JSONObject newJSONObject(int initialCapacity);
+
+    public JSONArray newJSONArray();
+
+    public JSONArray newJSONArray(List<Object> list);
+
+    public JSONArray newJSONArray(int initialCapacity);
+
+}

+ 106 - 0
lts-core/src/main/java/com/lts/core/json/JSONArray.java

@@ -0,0 +1,106 @@
+package com.lts.core.json;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.ListIterator;
+
+/**
+ * @author Robert HG (254963746@qq.com) on 11/19/15.
+ */
+public interface JSONArray {
+
+    public int size();
+
+    public boolean isEmpty();
+
+    public boolean contains(Object o);
+
+    public Iterator<Object> iterator();
+
+    public Object[] toArray();
+
+    public <T> T[] toArray(T[] a);
+
+    public boolean add(Object e);
+
+    public boolean remove(Object o);
+
+    public boolean containsAll(Collection<?> c);
+
+    public boolean addAll(Collection<? extends Object> c);
+
+    public boolean addAll(int index, Collection<? extends Object> c);
+
+    public boolean removeAll(Collection<?> c);
+
+    public boolean retainAll(Collection<?> c);
+
+    public void clear();
+
+    public Object set(int index, Object element);
+
+    public void add(int index, Object element);
+
+    public Object remove(int index);
+
+    public int indexOf(Object o);
+
+    public int lastIndexOf(Object o);
+
+    public ListIterator<Object> listIterator();
+
+    public ListIterator<Object> listIterator(int index);
+
+    public List<Object> subList(int fromIndex, int toIndex);
+
+    public Object get(int index);
+
+    public JSONObject getJSONObject(int index);
+
+    public JSONArray getJSONArray(int index);
+
+    public <T> T getObject(int index, Class<T> clazz);
+
+    public Boolean getBoolean(int index);
+
+    public boolean getBooleanValue(int index);
+
+    public Byte getByte(int index);
+
+    public byte getByteValue(int index);
+
+    public Short getShort(int index);
+
+    public short getShortValue(int index);
+
+    public Integer getInteger(int index);
+
+    public int getIntValue(int index);
+
+    public Long getLong(int index);
+
+    public long getLongValue(int index);
+
+    public Float getFloat(int index);
+
+    public float getFloatValue(int index);
+
+    public Double getDouble(int index);
+
+    public double getDoubleValue(int index);
+
+    public BigDecimal getBigDecimal(int index);
+
+    public BigInteger getBigInteger(int index);
+
+    public String getString(int index);
+
+    public java.util.Date getDate(int index);
+
+    public java.sql.Date getSqlDate(int index);
+
+    public java.sql.Timestamp getTimestamp(int index);
+}

+ 23 - 0
lts-core/src/main/java/com/lts/core/json/JSONException.java

@@ -0,0 +1,23 @@
+package com.lts.core.json;
+
+/**
+ * @author Robert HG (254963746@qq.com) on 11/19/15.
+ */
+public class JSONException extends RuntimeException {
+
+    public JSONException() {
+        super();
+    }
+
+    public JSONException(String message) {
+        super(message);
+    }
+
+    public JSONException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+    public JSONException(Throwable cause) {
+        super(cause);
+    }
+}

+ 54 - 0
lts-core/src/main/java/com/lts/core/json/JSONFactory.java

@@ -0,0 +1,54 @@
+package com.lts.core.json;
+
+import com.lts.core.commons.utils.StringUtils;
+import com.lts.core.extension.ExtensionLoader;
+import com.lts.core.json.fastjson.FastJSONAdapter;
+import com.lts.core.json.jackson.JacksonJSONAdapter;
+import com.lts.core.logger.Logger;
+import com.lts.core.logger.LoggerFactory;
+
+/**
+ * @author Robert HG (254963746@qq.com) on 11/19/15.
+ */
+public class JSONFactory {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(JSONFactory.class);
+
+    private static volatile JSONAdapter JSON_ADAPTER;
+
+    static {
+        String json = System.getProperty("lts.logger");
+        if ("fastjson".equals(json)) {
+            setJSONAdapter(new FastJSONAdapter());
+        } else if ("jackson".equals(json)) {
+            setJSONAdapter(new JacksonJSONAdapter());
+        } else {
+            try {
+                setJSONAdapter(new FastJSONAdapter());
+            } catch (Throwable ignored) {
+                try {
+                    setJSONAdapter(new JacksonJSONAdapter());
+                } catch (Throwable ignored2) {
+                    LOGGER.error("Please check JSON lib");
+                }
+            }
+        }
+    }
+
+    public static void setJSONAdapter(String jsonAdapter) {
+        if (StringUtils.isNotEmpty(jsonAdapter)) {
+            setJSONAdapter(ExtensionLoader.getExtensionLoader(JSONAdapter.class).getExtension(jsonAdapter));
+        }
+    }
+
+    public static JSONAdapter getJSONAdapter() {
+        return JSONFactory.JSON_ADAPTER;
+    }
+
+    public static void setJSONAdapter(JSONAdapter jsonAdapter) {
+        if (jsonAdapter != null) {
+            LOGGER.info("Using JSON lib " + jsonAdapter.getName());
+            JSONFactory.JSON_ADAPTER = jsonAdapter;
+        }
+    }
+}

+ 91 - 0
lts-core/src/main/java/com/lts/core/json/JSONObject.java

@@ -0,0 +1,91 @@
+package com.lts.core.json;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.util.Collection;
+import java.util.Date;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @author Robert HG (254963746@qq.com) on 11/19/15.
+ */
+public interface JSONObject {
+
+    public int size();
+
+    public boolean isEmpty();
+
+    public boolean containsKey(Object key);
+
+    public boolean containsValue(Object value);
+
+    public Object get(Object key);
+
+    public JSONObject getJSONObject(String key);
+
+    public JSONArray getJSONArray(String key);
+
+    public <T> T getObject(String key, Class<T> clazz);
+
+    public Boolean getBoolean(String key);
+
+    public byte[] getBytes(String key);
+
+    public boolean getBooleanValue(String key);
+
+    public Byte getByte(String key);
+
+    public byte getByteValue(String key);
+
+    public Short getShort(String key);
+
+    public short getShortValue(String key);
+
+    public Integer getInteger(String key);
+
+    public int getIntValue(String key);
+
+    public Long getLong(String key);
+
+    public long getLongValue(String key);
+
+    public Float getFloat(String key);
+
+    public float getFloatValue(String key);
+
+    public Double getDouble(String key);
+
+    public double getDoubleValue(String key);
+
+    public BigDecimal getBigDecimal(String key);
+
+    public BigInteger getBigInteger(String key);
+
+    public String getString(String key);
+
+    public Date getDate(String key);
+
+    public java.sql.Date getSqlDate(String key);
+
+    public java.sql.Timestamp getTimestamp(String key);
+
+    public Object put(String key, Object value);
+
+    public void putAll(Map<? extends String, ? extends Object> m);
+
+    public void clear();
+
+    public Object remove(Object key);
+
+    public Set<String> keySet();
+
+    public Collection<Object> values();
+
+    public Set<Map.Entry<String, Object>> entrySet();
+
+    public String toJSONString();
+
+    public String toString();
+
+}

+ 23 - 0
lts-core/src/main/java/com/lts/core/json/TypeReference.java

@@ -0,0 +1,23 @@
+package com.lts.core.json;
+
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+
+/**
+ * @author Robert HG (254963746@qq.com) on 11/19/15.
+ */
+public abstract class TypeReference<T> {
+
+    private final Type type;
+
+    public TypeReference() {
+        Type superClass = getClass().getGenericSuperclass();
+
+        type = ((ParameterizedType) superClass).getActualTypeArguments()[0];
+    }
+
+    public Type getType() {
+        return type;
+    }
+
+}

+ 543 - 0
lts-core/src/main/java/com/lts/core/json/TypeUtils.java

@@ -0,0 +1,543 @@
+package com.lts.core.json;
+
+import com.lts.core.commons.utils.Base64;
+
+import java.lang.reflect.Array;
+import java.lang.reflect.Method;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Collection;
+import java.util.Date;
+import java.util.Map;
+
+/**
+ * from fastjson
+ * @author Robert HG (254963746@qq.com) on 11/21/15.
+ */
+public class TypeUtils {
+
+    public static final String castToString(Object value) {
+        if (value == null) {
+            return null;
+        }
+
+        return value.toString();
+    }
+
+    public static final Byte castToByte(Object value) {
+        if (value == null) {
+            return null;
+        }
+
+        if (value instanceof Number) {
+            return ((Number) value).byteValue();
+        }
+
+        if (value instanceof String) {
+            String strVal = (String) value;
+            if (strVal.length() == 0) {
+                return null;
+            }
+            return Byte.parseByte(strVal);
+        }
+
+        throw new JSONException("can not cast to byte, value : " + value);
+    }
+
+    public static final Short castToShort(Object value) {
+        if (value == null) {
+            return null;
+        }
+
+        if (value instanceof Number) {
+            return ((Number) value).shortValue();
+        }
+
+        if (value instanceof String) {
+            String strVal = (String) value;
+            if (strVal.length() == 0) {
+                return null;
+            }
+            return Short.parseShort(strVal);
+        }
+
+        throw new JSONException("can not cast to short, value : " + value);
+    }
+
+    public static final BigDecimal castToBigDecimal(Object value) {
+        if (value == null) {
+            return null;
+        }
+
+        if (value instanceof BigDecimal) {
+            return (BigDecimal) value;
+        }
+
+        if (value instanceof BigInteger) {
+            return new BigDecimal((BigInteger) value);
+        }
+
+        String strVal = value.toString();
+        if (strVal.length() == 0) {
+            return null;
+        }
+
+        return new BigDecimal(strVal);
+    }
+
+    public static final BigInteger castToBigInteger(Object value) {
+        if (value == null) {
+            return null;
+        }
+
+        if (value instanceof BigInteger) {
+            return (BigInteger) value;
+        }
+
+        if (value instanceof Float || value instanceof Double) {
+            return BigInteger.valueOf(((Number) value).longValue());
+        }
+
+        String strVal = value.toString();
+        if (strVal.length() == 0) {
+            return null;
+        }
+
+        return new BigInteger(strVal);
+    }
+
+    public static final Float castToFloat(Object value) {
+        if (value == null) {
+            return null;
+        }
+
+        if (value instanceof Number) {
+            return ((Number) value).floatValue();
+        }
+
+        if (value instanceof String) {
+            String strVal = value.toString();
+            if (strVal.length() == 0) {
+                return null;
+            }
+
+            return Float.parseFloat(strVal);
+        }
+
+        throw new JSONException("can not cast to float, value : " + value);
+    }
+
+    public static final Double castToDouble(Object value) {
+        if (value == null) {
+            return null;
+        }
+
+        if (value instanceof Number) {
+            return ((Number) value).doubleValue();
+        }
+
+        if (value instanceof String) {
+            String strVal = value.toString();
+            if (strVal.length() == 0) {
+                return null;
+            }
+            return Double.parseDouble(strVal);
+        }
+
+        throw new JSONException("can not cast to double, value : " + value);
+    }
+
+    public static final Date castToDate(Object value) {
+        if (value == null) {
+            return null;
+        }
+
+        if (value instanceof Calendar) {
+            return ((Calendar) value).getTime();
+        }
+
+        if (value instanceof Date) {
+            return (Date) value;
+        }
+
+        long longValue = -1;
+
+        if (value instanceof Number) {
+            longValue = ((Number) value).longValue();
+        }
+
+        if (value instanceof String) {
+            String strVal = (String) value;
+
+            if (strVal.indexOf('-') != -1) {
+                String format;
+                if (strVal.length() == 10) {
+                    format = "yyyy-MM-dd";
+                } else if (strVal.length() == "yyyy-MM-dd HH:mm:ss".length()) {
+                    format = "yyyy-MM-dd HH:mm:ss";
+                } else {
+                    format = "yyyy-MM-dd HH:mm:ss.SSS";
+                }
+
+                SimpleDateFormat dateFormat = new SimpleDateFormat(format);
+                try {
+                    return (Date) dateFormat.parse(strVal);
+                } catch (ParseException e) {
+                    throw new JSONException("can not cast to Date, value : " + strVal);
+                }
+            }
+
+            if (strVal.length() == 0) {
+                return null;
+            }
+
+            longValue = Long.parseLong(strVal);
+        }
+
+        if (longValue < 0) {
+            throw new JSONException("can not cast to Date, value : " + value);
+        }
+
+        return new Date(longValue);
+    }
+
+    public static final java.sql.Date castToSqlDate(Object value) {
+        if (value == null) {
+            return null;
+        }
+
+        if (value instanceof Calendar) {
+            return new java.sql.Date(((Calendar) value).getTimeInMillis());
+        }
+
+        if (value instanceof java.sql.Date) {
+            return (java.sql.Date) value;
+        }
+
+        if (value instanceof java.util.Date) {
+            return new java.sql.Date(((java.util.Date) value).getTime());
+        }
+
+        long longValue = 0;
+
+        if (value instanceof Number) {
+            longValue = ((Number) value).longValue();
+        }
+
+        if (value instanceof String) {
+            String strVal = (String) value;
+            if (strVal.length() == 0) {
+                return null;
+            }
+
+            longValue = Long.parseLong(strVal);
+        }
+
+        if (longValue <= 0) {
+            throw new JSONException("can not cast to Date, value : " + value);
+        }
+
+        return new java.sql.Date(longValue);
+    }
+
+    public static final java.sql.Timestamp castToTimestamp(Object value) {
+        if (value == null) {
+            return null;
+        }
+
+        if (value instanceof Calendar) {
+            return new java.sql.Timestamp(((Calendar) value).getTimeInMillis());
+        }
+
+        if (value instanceof java.sql.Timestamp) {
+            return (java.sql.Timestamp) value;
+        }
+
+        if (value instanceof java.util.Date) {
+            return new java.sql.Timestamp(((java.util.Date) value).getTime());
+        }
+
+        long longValue = 0;
+
+        if (value instanceof Number) {
+            longValue = ((Number) value).longValue();
+        }
+
+        if (value instanceof String) {
+            String strVal = (String) value;
+            if (strVal.length() == 0) {
+                return null;
+            }
+
+            longValue = Long.parseLong(strVal);
+        }
+
+        if (longValue <= 0) {
+            throw new JSONException("can not cast to Date, value : " + value);
+        }
+
+        return new java.sql.Timestamp(longValue);
+    }
+
+    public static final Long castToLong(Object value) {
+        if (value == null) {
+            return null;
+        }
+
+        if (value instanceof Number) {
+            return ((Number) value).longValue();
+        }
+
+        if (value instanceof String) {
+            String strVal = (String) value;
+            if (strVal.length() == 0) {
+                return null;
+            }
+
+            try {
+                return Long.parseLong(strVal);
+            } catch (NumberFormatException ex) {
+                //
+            }
+        }
+
+        throw new JSONException("can not cast to long, value : " + value);
+    }
+
+    public static final Integer castToInt(Object value) {
+        if (value == null) {
+            return null;
+        }
+
+        if (value instanceof Integer) {
+            return (Integer) value;
+        }
+
+        if (value instanceof Number) {
+            return ((Number) value).intValue();
+        }
+
+        if (value instanceof String) {
+            String strVal = (String) value;
+            if (strVal.length() == 0) {
+                return null;
+            }
+
+            return Integer.parseInt(strVal);
+        }
+
+        throw new JSONException("can not cast to int, value : " + value);
+    }
+
+    public static final byte[] castToBytes(Object value) {
+        if (value instanceof byte[]) {
+            return (byte[]) value;
+        }
+
+        if (value instanceof String) {
+            return Base64.decodeFast((String) value);
+        }
+        throw new JSONException("can not cast to int, value : " + value);
+    }
+
+    public static final Boolean castToBoolean(Object value) {
+        if (value == null) {
+            return null;
+        }
+
+        if (value instanceof Boolean) {
+            return (Boolean) value;
+        }
+
+        if (value instanceof Number) {
+            return ((Number) value).intValue() == 1;
+        }
+
+        if (value instanceof String) {
+            String str = (String) value;
+            if (str.length() == 0) {
+                return null;
+            }
+
+            if ("true".equals(str)) {
+                return Boolean.TRUE;
+            }
+            if ("false".equals(str)) {
+                return Boolean.FALSE;
+            }
+
+            if ("1".equals(str)) {
+                return Boolean.TRUE;
+            }
+        }
+
+        throw new JSONException("can not cast to int, value : " + value);
+    }
+
+    public static final <T> T castToJavaBean(Object obj, Class<T> clazz) {
+        return cast(obj, clazz);
+    }
+
+    @SuppressWarnings({"unchecked", "rawtypes"})
+    public static final <T> T cast(Object obj, Class<T> clazz) {
+        if (obj == null) {
+            return null;
+        }
+
+        if (clazz == null) {
+            throw new IllegalArgumentException("clazz is null");
+        }
+
+        if (clazz == obj.getClass()) {
+            return (T) obj;
+        }
+
+        if (obj instanceof Map) {
+            if (clazz == Map.class) {
+                return (T) obj;
+            }
+
+            return castToJavaBean(obj, clazz);
+        }
+
+        if (clazz.isArray()) {
+            if (obj instanceof Collection) {
+
+                Collection collection = (Collection) obj;
+                int index = 0;
+                Object array = Array.newInstance(clazz.getComponentType(), collection.size());
+                for (Object item : collection) {
+                    Object value = cast(item, clazz.getComponentType());
+                    Array.set(array, index, value);
+                    index++;
+                }
+
+                return (T) array;
+            }
+        }
+
+        if (clazz.isAssignableFrom(obj.getClass())) {
+            return (T) obj;
+        }
+
+        if (clazz == boolean.class || clazz == Boolean.class) {
+            return (T) castToBoolean(obj);
+        }
+
+        if (clazz == byte.class || clazz == Byte.class) {
+            return (T) castToByte(obj);
+        }
+
+        // if (clazz == char.class || clazz == Character.class) {
+        // return (T) castToCharacter(obj);
+        // }
+
+        if (clazz == short.class || clazz == Short.class) {
+            return (T) castToShort(obj);
+        }
+
+        if (clazz == int.class || clazz == Integer.class) {
+            return (T) castToInt(obj);
+        }
+
+        if (clazz == long.class || clazz == Long.class) {
+            return (T) castToLong(obj);
+        }
+
+        if (clazz == float.class || clazz == Float.class) {
+            return (T) castToFloat(obj);
+        }
+
+        if (clazz == double.class || clazz == Double.class) {
+            return (T) castToDouble(obj);
+        }
+
+        if (clazz == String.class) {
+            return (T) castToString(obj);
+        }
+
+        if (clazz == BigDecimal.class) {
+            return (T) castToBigDecimal(obj);
+        }
+
+        if (clazz == BigInteger.class) {
+            return (T) castToBigInteger(obj);
+        }
+
+        if (clazz == Date.class) {
+            return (T) castToDate(obj);
+        }
+
+        if (clazz == java.sql.Date.class) {
+            return (T) castToSqlDate(obj);
+        }
+
+        if (clazz == java.sql.Timestamp.class) {
+            return (T) castToTimestamp(obj);
+        }
+
+        if (clazz.isEnum()) {
+            return (T) castToEnum(obj, clazz);
+        }
+
+        if (Calendar.class.isAssignableFrom(clazz)) {
+            Date date = castToDate(obj);
+            Calendar calendar;
+            if (clazz == Calendar.class) {
+                calendar = Calendar.getInstance();
+            } else {
+                try {
+                    calendar = (Calendar) clazz.newInstance();
+                } catch (Exception e) {
+                    throw new JSONException("can not cast to : " + clazz.getName(), e);
+                }
+            }
+            calendar.setTime(date);
+            return (T) calendar;
+        }
+
+        if (obj instanceof String) {
+            String strVal = (String) obj;
+            if (strVal.length() == 0) {
+                return null;
+            }
+        }
+
+        throw new JSONException("can not cast to : " + clazz.getName());
+    }
+
+    @SuppressWarnings({"unchecked", "rawtypes"})
+    public static final <T> T castToEnum(Object obj, Class<T> clazz) {
+        try {
+            if (obj instanceof String) {
+                String name = (String) obj;
+                if (name.length() == 0) {
+                    return null;
+                }
+
+                return (T) Enum.valueOf((Class<? extends Enum>) clazz, name);
+            }
+
+            if (obj instanceof Number) {
+                int ordinal = ((Number) obj).intValue();
+
+                Method method = clazz.getMethod("values");
+                Object[] values = (Object[]) method.invoke(null);
+                for (Object value : values) {
+                    Enum e = (Enum) value;
+                    if (e.ordinal() == ordinal) {
+                        return (T) e;
+                    }
+                }
+            }
+        } catch (Exception ex) {
+            throw new JSONException("can not cast to : " + clazz.getName(), ex);
+        }
+
+        throw new JSONException("can not cast to : " + clazz.getName());
+    }
+
+}

+ 81 - 0
lts-core/src/main/java/com/lts/core/json/fastjson/FastJSONAdapter.java

@@ -0,0 +1,81 @@
+package com.lts.core.json.fastjson;
+
+import com.lts.core.json.JSONAdapter;
+import com.lts.core.json.JSONArray;
+import com.lts.core.json.JSONObject;
+import com.lts.core.logger.LoggerFactory;
+
+import java.lang.reflect.Type;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author Robert HG (254963746@qq.com) on 11/19/15.
+ */
+public class FastJSONAdapter implements JSONAdapter {
+
+    @Override
+    public String getName() {
+        return "fastjson";
+    }
+
+    @Override
+    public <T> T parse(String json, Type type) {
+        return com.alibaba.fastjson.JSONObject.parseObject(json, type);
+    }
+
+    @Override
+    public String toJSONString(Object obj) {
+        return com.alibaba.fastjson.JSONObject.toJSONString(obj);
+    }
+
+    @Override
+    public JSONObject toJSONObject(Object obj) {
+        com.alibaba.fastjson.JSONObject json = (com.alibaba.fastjson.JSONObject) com.alibaba.fastjson.JSONObject.toJSON(obj);
+        return new FastJSONObject(json);
+    }
+
+    @Override
+    public JSONArray toJSONArray(Object obj) {
+        return new FastJSONArray((com.alibaba.fastjson.JSONArray) com.alibaba.fastjson.JSONArray.toJSON(obj));
+    }
+
+    @Override
+    public JSONArray parseArray(String json) {
+        return new FastJSONArray(com.alibaba.fastjson.JSONObject.parseArray(json));
+    }
+
+    @Override
+    public JSONObject parseObject(String json) {
+        return new FastJSONObject(com.alibaba.fastjson.JSONObject.parseObject(json));
+    }
+
+    @Override
+    public JSONObject newJSONObject() {
+        return new FastJSONObject(new com.alibaba.fastjson.JSONObject());
+    }
+
+    @Override
+    public JSONObject newJSONObject(Map<String, Object> map) {
+        return new FastJSONObject(new com.alibaba.fastjson.JSONObject(map));
+    }
+
+    public JSONObject newJSONObject(int initialCapacity) {
+        return new FastJSONObject(new com.alibaba.fastjson.JSONObject(initialCapacity));
+    }
+
+    @Override
+    public JSONArray newJSONArray() {
+        return new FastJSONArray(new com.alibaba.fastjson.JSONArray());
+    }
+
+    @Override
+    public JSONArray newJSONArray(List<Object> list) {
+        return new FastJSONArray(new com.alibaba.fastjson.JSONArray(list));
+    }
+
+    public JSONArray newJSONArray(int initialCapacity) {
+        return new FastJSONArray(new com.alibaba.fastjson.JSONArray(initialCapacity));
+    }
+
+}

+ 251 - 0
lts-core/src/main/java/com/lts/core/json/fastjson/FastJSONArray.java

@@ -0,0 +1,251 @@
+package com.lts.core.json.fastjson;
+
+import com.lts.core.json.JSONArray;
+import com.lts.core.json.JSONObject;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.sql.Timestamp;
+import java.util.*;
+
+/**
+ * @author Robert HG (254963746@qq.com) on 11/19/15.
+ */
+public class FastJSONArray implements JSONArray {
+
+    private com.alibaba.fastjson.JSONArray jsonArray;
+
+    public FastJSONArray(com.alibaba.fastjson.JSONArray jsonArray) {
+        this.jsonArray = jsonArray;
+    }
+
+    @Override
+    public int size() {
+        return jsonArray.size();
+    }
+
+    @Override
+    public boolean isEmpty() {
+        return jsonArray.isEmpty();
+    }
+
+    @Override
+    public boolean contains(Object o) {
+        return jsonArray.contains(o);
+    }
+
+    @Override
+    public Iterator<Object> iterator() {
+        return jsonArray.iterator();
+    }
+
+    @Override
+    public Object[] toArray() {
+        return jsonArray.toArray();
+    }
+
+    @Override
+    public <T> T[] toArray(T[] a) {
+        return jsonArray.toArray(a);
+    }
+
+    @Override
+    public boolean add(Object e) {
+        return jsonArray.add(e);
+    }
+
+    @Override
+    public boolean remove(Object o) {
+        return jsonArray.remove(o);
+    }
+
+    @Override
+    public boolean containsAll(Collection<?> c) {
+        return jsonArray.containsAll(c);
+    }
+
+    @Override
+    public boolean addAll(Collection<? extends Object> c) {
+        return jsonArray.addAll(c);
+    }
+
+    @Override
+    public boolean addAll(int index, Collection<? extends Object> c) {
+        return jsonArray.addAll(index, c);
+    }
+
+    @Override
+    public boolean removeAll(Collection<?> c) {
+        return jsonArray.removeAll(c);
+    }
+
+    @Override
+    public boolean retainAll(Collection<?> c) {
+        return jsonArray.retainAll(c);
+    }
+
+    @Override
+    public void clear() {
+        jsonArray.clear();
+    }
+
+    @Override
+    public Object set(int index, Object element) {
+        return jsonArray.set(index, element);
+    }
+
+    @Override
+    public void add(int index, Object element) {
+        jsonArray.add(index, element);
+    }
+
+    @Override
+    public Object remove(int index) {
+        return jsonArray.remove(index);
+    }
+
+    @Override
+    public int indexOf(Object o) {
+        return jsonArray.indexOf(o);
+    }
+
+    @Override
+    public int lastIndexOf(Object o) {
+        return jsonArray.lastIndexOf(o);
+    }
+
+    @Override
+    public ListIterator<Object> listIterator() {
+        return jsonArray.listIterator();
+    }
+
+    @Override
+    public ListIterator<Object> listIterator(int index) {
+        return jsonArray.listIterator(index);
+    }
+
+    @Override
+    public List<Object> subList(int fromIndex, int toIndex) {
+        return jsonArray.subList(fromIndex, toIndex);
+    }
+
+    @Override
+    public Object get(int index) {
+        return jsonArray.get(index);
+    }
+
+    @Override
+    public JSONObject getJSONObject(int index) {
+        return new FastJSONObject(jsonArray.getJSONObject(index));
+    }
+
+    @Override
+    public JSONArray getJSONArray(int index) {
+        return new FastJSONArray(jsonArray.getJSONArray(index));
+    }
+
+    @Override
+    public <T> T getObject(int index, Class<T> clazz) {
+        return jsonArray.getObject(index, clazz);
+    }
+
+    @Override
+    public Boolean getBoolean(int index) {
+        return jsonArray.getBoolean(index);
+    }
+
+    @Override
+    public boolean getBooleanValue(int index) {
+        return jsonArray.getBooleanValue(index);
+    }
+
+    @Override
+    public Byte getByte(int index) {
+        return jsonArray.getByte(index);
+    }
+
+    @Override
+    public byte getByteValue(int index) {
+        return jsonArray.getByteValue(index);
+    }
+
+    @Override
+    public Short getShort(int index) {
+        return jsonArray.getShort(index);
+    }
+
+    @Override
+    public short getShortValue(int index) {
+        return jsonArray.getShortValue(index);
+    }
+
+    @Override
+    public Integer getInteger(int index) {
+        return jsonArray.getInteger(index);
+    }
+
+    @Override
+    public int getIntValue(int index) {
+        return jsonArray.getIntValue(index);
+    }
+
+    @Override
+    public Long getLong(int index) {
+        return jsonArray.getLong(index);
+    }
+
+    @Override
+    public long getLongValue(int index) {
+        return jsonArray.getLongValue(index);
+    }
+
+    @Override
+    public Float getFloat(int index) {
+        return jsonArray.getFloat(index);
+    }
+
+    @Override
+    public float getFloatValue(int index) {
+        return jsonArray.getFloatValue(index);
+    }
+
+    @Override
+    public Double getDouble(int index) {
+        return jsonArray.getDouble(index);
+    }
+
+    @Override
+    public double getDoubleValue(int index) {
+        return jsonArray.getDoubleValue(index);
+    }
+
+    @Override
+    public BigDecimal getBigDecimal(int index) {
+        return jsonArray.getBigDecimal(index);
+    }
+
+    @Override
+    public BigInteger getBigInteger(int index) {
+        return jsonArray.getBigInteger(index);
+    }
+
+    @Override
+    public String getString(int index) {
+        return jsonArray.getString(index);
+    }
+
+    @Override
+    public Date getDate(int index) {
+        return jsonArray.getDate(index);
+    }
+
+    @Override
+    public java.sql.Date getSqlDate(int index) {
+        return jsonArray.getSqlDate(index);
+    }
+
+    @Override
+    public Timestamp getTimestamp(int index) {
+        return jsonArray.getTimestamp(index);
+    }
+}

+ 213 - 0
lts-core/src/main/java/com/lts/core/json/fastjson/FastJSONObject.java

@@ -0,0 +1,213 @@
+package com.lts.core.json.fastjson;
+
+import com.lts.core.json.JSONArray;
+import com.lts.core.json.JSONObject;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.sql.Timestamp;
+import java.util.Collection;
+import java.util.Date;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @author Robert HG (254963746@qq.com) on 11/19/15.
+ */
+public class FastJSONObject implements JSONObject {
+
+    private com.alibaba.fastjson.JSONObject jsonObject;
+
+    public FastJSONObject(com.alibaba.fastjson.JSONObject jsonObject) {
+        this.jsonObject = jsonObject;
+    }
+
+    @Override
+    public int size() {
+        return jsonObject.size();
+    }
+
+    @Override
+    public boolean isEmpty() {
+        return jsonObject.isEmpty();
+    }
+
+    @Override
+    public boolean containsKey(Object key) {
+        return jsonObject.containsKey(key);
+    }
+
+    @Override
+    public boolean containsValue(Object value) {
+        return jsonObject.containsValue(value);
+    }
+
+    @Override
+    public Object get(Object key) {
+        return jsonObject.get(key);
+    }
+
+    @Override
+    public JSONObject getJSONObject(String key) {
+        return new FastJSONObject(jsonObject.getJSONObject(key));
+    }
+
+    @Override
+    public JSONArray getJSONArray(String key) {
+        return new FastJSONArray(jsonObject.getJSONArray(key));
+    }
+
+    @Override
+    public <T> T getObject(String key, Class<T> clazz) {
+        return jsonObject.getObject(key, clazz);
+    }
+
+    @Override
+    public Boolean getBoolean(String key) {
+        return jsonObject.getBoolean(key);
+    }
+
+    @Override
+    public byte[] getBytes(String key) {
+        return jsonObject.getBytes(key);
+    }
+
+    @Override
+    public boolean getBooleanValue(String key) {
+        return jsonObject.getBooleanValue(key);
+    }
+
+    @Override
+    public Byte getByte(String key) {
+        return jsonObject.getByte(key);
+    }
+
+    @Override
+    public byte getByteValue(String key) {
+        return jsonObject.getByteValue(key);
+    }
+
+    @Override
+    public Short getShort(String key) {
+        return jsonObject.getShort(key);
+    }
+
+    @Override
+    public short getShortValue(String key) {
+        return jsonObject.getShortValue(key);
+    }
+
+    @Override
+    public Integer getInteger(String key) {
+        return jsonObject.getInteger(key);
+    }
+
+    @Override
+    public int getIntValue(String key) {
+        return jsonObject.getIntValue(key);
+    }
+
+    @Override
+    public Long getLong(String key) {
+        return jsonObject.getLong(key);
+    }
+
+    @Override
+    public long getLongValue(String key) {
+        return jsonObject.getLongValue(key);
+    }
+
+    @Override
+    public Float getFloat(String key) {
+        return jsonObject.getFloat(key);
+    }
+
+    @Override
+    public float getFloatValue(String key) {
+        return jsonObject.getFloatValue(key);
+    }
+
+    @Override
+    public Double getDouble(String key) {
+        return jsonObject.getDouble(key);
+    }
+
+    @Override
+    public double getDoubleValue(String key) {
+        return jsonObject.getDoubleValue(key);
+    }
+
+    @Override
+    public BigDecimal getBigDecimal(String key) {
+        return jsonObject.getBigDecimal(key);
+    }
+
+    @Override
+    public BigInteger getBigInteger(String key) {
+        return jsonObject.getBigInteger(key);
+    }
+
+    @Override
+    public String getString(String key) {
+        return jsonObject.getString(key);
+    }
+
+    @Override
+    public Date getDate(String key) {
+        return jsonObject.getDate(key);
+    }
+
+    @Override
+    public java.sql.Date getSqlDate(String key) {
+        return jsonObject.getSqlDate(key);
+    }
+
+    @Override
+    public Timestamp getTimestamp(String key) {
+        return jsonObject.getTimestamp(key);
+    }
+
+    @Override
+    public Object put(String key, Object value) {
+        return jsonObject.put(key, value);
+    }
+
+    @Override
+    public void putAll(Map<? extends String, ? extends Object> m) {
+        jsonObject.putAll(m);
+    }
+
+    @Override
+    public void clear() {
+        jsonObject.clear();
+    }
+
+    @Override
+    public Object remove(Object key) {
+        return jsonObject.remove(key);
+    }
+
+    @Override
+    public Set<String> keySet() {
+        return jsonObject.keySet();
+    }
+
+    @Override
+    public Collection<Object> values() {
+        return jsonObject.values();
+    }
+
+    @Override
+    public Set<Map.Entry<String, Object>> entrySet() {
+        return jsonObject.entrySet();
+    }
+
+    @Override
+    public String toJSONString() {
+        return jsonObject.toJSONString();
+    }
+
+    public String toString() {
+        return toJSONString();
+    }
+}

+ 111 - 0
lts-core/src/main/java/com/lts/core/json/jackson/JacksonJSONAdapter.java

@@ -0,0 +1,111 @@
+package com.lts.core.json.jackson;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.lts.core.json.*;
+
+import java.io.IOException;
+import java.lang.reflect.Type;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author Robert HG (254963746@qq.com) on 11/20/15.
+ */
+public class JacksonJSONAdapter implements JSONAdapter {
+
+    private ObjectMapper mapper;
+
+    public JacksonJSONAdapter() {
+        mapper = new ObjectMapper();
+        // 忽略多余的字段
+        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+        // 不输出为空的字段
+        mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
+    }
+
+    @Override
+    public String getName() {
+        return "jackson";
+    }
+
+    @Override
+    public <T> T parse(String json, Type type) {
+        try {
+            return mapper.readValue(json, mapper.getTypeFactory().constructType(type));
+        } catch (IOException e) {
+            throw new JSONException(e);
+        }
+    }
+
+    @Override
+    public String toJSONString(Object obj) {
+        try {
+            return mapper.writeValueAsString(obj);
+        } catch (JsonProcessingException e) {
+            throw new JSONException(e);
+        }
+    }
+
+    @Override
+    public JSONObject toJSONObject(Object obj) {
+        Map<String, Object> map = mapper.convertValue(obj, new com.fasterxml.jackson.core.type.TypeReference<HashMap<String, Object>>() {
+        });
+        return new JacksonJSONObject(map);
+    }
+
+    @Override
+    public JSONArray toJSONArray(Object obj) {
+        List<Object> list = mapper.convertValue(obj, new com.fasterxml.jackson.core.type.TypeReference<List<Object>>() {
+        });
+        return new JacksonJSONArray(list);
+    }
+
+    @Override
+    public JSONArray parseArray(String json) {
+        List<Object> list = parse(json, new TypeReference<List<Object>>() {
+        }.getType());
+        return new JacksonJSONArray(list);
+    }
+
+    @Override
+    public JSONObject parseObject(String json) {
+        Map<String, Object> map = parse(json, new TypeReference<Map<String, Object>>() {
+        }.getType());
+        return new JacksonJSONObject(map);
+    }
+
+    @Override
+    public JSONObject newJSONObject() {
+        return new JacksonJSONObject();
+    }
+
+    @Override
+    public JSONObject newJSONObject(Map<String, Object> map) {
+        return new JacksonJSONObject(map);
+    }
+
+    @Override
+    public JSONObject newJSONObject(int initialCapacity) {
+        return new JacksonJSONObject(initialCapacity);
+    }
+
+    @Override
+    public JSONArray newJSONArray() {
+        return new JacksonJSONArray();
+    }
+
+    @Override
+    public JSONArray newJSONArray(List<Object> list) {
+        return new JacksonJSONArray(list);
+    }
+
+    @Override
+    public JSONArray newJSONArray(int initialCapacity) {
+        return new JacksonJSONArray(initialCapacity);
+    }
+
+}

+ 326 - 0
lts-core/src/main/java/com/lts/core/json/jackson/JacksonJSONArray.java

@@ -0,0 +1,326 @@
+package com.lts.core.json.jackson;
+
+import com.lts.core.json.JSON;
+import com.lts.core.json.JSONArray;
+import com.lts.core.json.JSONObject;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.util.*;
+
+import static com.lts.core.json.TypeUtils.*;
+
+/**
+ * @author Robert HG (254963746@qq.com) on 11/20/15.
+ */
+public class JacksonJSONArray implements JSONArray {
+
+    private List<Object> list;
+
+    public JacksonJSONArray() {
+        this.list = new ArrayList<Object>(16);
+    }
+
+    public JacksonJSONArray(List<Object> list) {
+        this.list = list;
+    }
+
+    public JacksonJSONArray(int initialCapacity) {
+        this.list = new ArrayList<Object>(initialCapacity);
+    }
+
+    @Override
+    public int size() {
+        return list.size();
+    }
+
+    @Override
+    public boolean isEmpty() {
+        return list.isEmpty();
+    }
+
+    @Override
+    public boolean contains(Object o) {
+        return list.contains(o);
+    }
+
+    @Override
+    public Iterator<Object> iterator() {
+        return list.iterator();
+    }
+
+    @Override
+    public Object[] toArray() {
+        return list.toArray();
+    }
+
+    @Override
+    public <T> T[] toArray(T[] a) {
+        return list.toArray(a);
+    }
+
+    @Override
+    public boolean add(Object e) {
+        return list.add(e);
+    }
+
+    @Override
+    public boolean remove(Object o) {
+        return list.remove(o);
+    }
+
+    @Override
+    public boolean containsAll(Collection<?> c) {
+        return list.containsAll(c);
+    }
+
+    @Override
+    public boolean addAll(Collection<? extends Object> c) {
+        return list.addAll(c);
+    }
+
+    @Override
+    public boolean addAll(int index, Collection<? extends Object> c) {
+        return list.addAll(index, c);
+    }
+
+    @Override
+    public boolean removeAll(Collection<?> c) {
+        return list.removeAll(c);
+    }
+
+    @Override
+    public boolean retainAll(Collection<?> c) {
+        return list.retainAll(c);
+    }
+
+    @Override
+    public void clear() {
+        list.clear();
+    }
+
+    @Override
+    public Object set(int index, Object element) {
+        return list.set(index, element);
+    }
+
+    @Override
+    public void add(int index, Object element) {
+        list.add(index, element);
+    }
+
+    @Override
+    public Object remove(int index) {
+        return list.remove(index);
+    }
+
+    @Override
+    public int indexOf(Object o) {
+        return list.indexOf(o);
+    }
+
+    @Override
+    public int lastIndexOf(Object o) {
+        return list.lastIndexOf(o);
+    }
+
+    @Override
+    public ListIterator<Object> listIterator() {
+        return list.listIterator();
+    }
+
+    @Override
+    public ListIterator<Object> listIterator(int index) {
+        return list.listIterator();
+    }
+
+    @Override
+    public List<Object> subList(int fromIndex, int toIndex) {
+        return list.subList(fromIndex, toIndex);
+    }
+
+    @Override
+    public Object get(int index) {
+        return list.get(index);
+    }
+
+    @Override
+    public JSONObject getJSONObject(int index) {
+        Object value = list.get(index);
+
+        if (value instanceof JSONObject) {
+            return (JSONObject) value;
+        }
+
+        return JSON.toJSONObject(value);
+    }
+
+    @Override
+    public JSONArray getJSONArray(int index) {
+        Object value = list.get(index);
+
+        if (value instanceof JSONArray) {
+            return (JSONArray) value;
+        }
+
+        return JSON.toJSONArray(value);
+    }
+
+    @Override
+    public <T> T getObject(int index, Class<T> clazz) {
+        Object value = list.get(index);
+        return castToJavaBean(value, clazz);
+    }
+
+    public Boolean getBoolean(int index) {
+        Object value = get(index);
+
+        if (value == null) {
+            return null;
+        }
+
+        return castToBoolean(value);
+    }
+
+    public boolean getBooleanValue(int index) {
+        Object value = get(index);
+
+        if (value == null) {
+            return false;
+        }
+
+        return castToBoolean(value);
+    }
+
+    public Byte getByte(int index) {
+        Object value = get(index);
+
+        return castToByte(value);
+    }
+
+    public byte getByteValue(int index) {
+        Object value = get(index);
+
+        if (value == null) {
+            return 0;
+        }
+
+        return castToByte(value);
+    }
+
+    public Short getShort(int index) {
+        Object value = get(index);
+
+        return castToShort(value);
+    }
+
+    public short getShortValue(int index) {
+        Object value = get(index);
+
+        if (value == null) {
+            return 0;
+        }
+
+        return castToShort(value);
+    }
+
+    public Integer getInteger(int index) {
+        Object value = get(index);
+
+        return castToInt(value);
+    }
+
+    public int getIntValue(int index) {
+        Object value = get(index);
+
+        if (value == null) {
+            return 0;
+        }
+
+        return castToInt(value);
+    }
+
+    public Long getLong(int index) {
+        Object value = get(index);
+
+        return castToLong(value);
+    }
+
+    public long getLongValue(int index) {
+        Object value = get(index);
+
+        if (value == null) {
+            return 0L;
+        }
+
+        return castToLong(value);
+    }
+
+    public Float getFloat(int index) {
+        Object value = get(index);
+
+        return castToFloat(value);
+    }
+
+    public float getFloatValue(int index) {
+        Object value = get(index);
+
+        if (value == null) {
+            return 0F;
+        }
+
+        return castToFloat(value);
+    }
+
+    public Double getDouble(int index) {
+        Object value = get(index);
+
+        return castToDouble(value);
+    }
+
+    public double getDoubleValue(int index) {
+        Object value = get(index);
+
+        if (value == null) {
+            return 0D;
+        }
+
+        return castToDouble(value);
+    }
+
+    public BigDecimal getBigDecimal(int index) {
+        Object value = get(index);
+
+        return castToBigDecimal(value);
+    }
+
+    public BigInteger getBigInteger(int index) {
+        Object value = get(index);
+
+        return castToBigInteger(value);
+    }
+
+    public String getString(int index) {
+        Object value = get(index);
+
+        return castToString(value);
+    }
+
+    public java.util.Date getDate(int index) {
+        Object value = get(index);
+
+        return castToDate(value);
+    }
+
+    public java.sql.Date getSqlDate(int index) {
+        Object value = get(index);
+
+        return castToSqlDate(value);
+    }
+
+    public java.sql.Timestamp getTimestamp(int index) {
+        Object value = get(index);
+
+        return castToTimestamp(value);
+    }
+}

+ 288 - 0
lts-core/src/main/java/com/lts/core/json/jackson/JacksonJSONObject.java

@@ -0,0 +1,288 @@
+package com.lts.core.json.jackson;
+
+import com.lts.core.json.JSON;
+import com.lts.core.json.JSONArray;
+import com.lts.core.json.JSONObject;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.sql.Timestamp;
+import java.util.*;
+
+import static com.lts.core.json.TypeUtils.*;
+
+/**
+ * @author Robert HG (254963746@qq.com) on 11/20/15.
+ */
+public class JacksonJSONObject implements JSONObject {
+
+    private final Map<String, Object> map;
+
+    public JacksonJSONObject() {
+        this(16);
+    }
+
+    public JacksonJSONObject(int initialCapacity) {
+        map = new HashMap<String, Object>(initialCapacity);
+    }
+
+    public JacksonJSONObject(Map<String, Object> map) {
+        this.map = map;
+    }
+
+    @Override
+    public int size() {
+        return map.size();
+    }
+
+    @Override
+    public boolean isEmpty() {
+        return map.isEmpty();
+    }
+
+    @Override
+    public boolean containsKey(Object key) {
+        return map.containsKey(key);
+    }
+
+    @Override
+    public boolean containsValue(Object value) {
+        return map.containsValue(value);
+    }
+
+    @Override
+    public Object get(Object key) {
+        return map.get(key);
+    }
+
+    @Override
+    public JSONObject getJSONObject(String key) {
+        Object value = map.get(key);
+
+        if (value instanceof JSONObject) {
+            return (JSONObject) value;
+        }
+
+        return JSON.toJSONObject(value);
+    }
+
+    @Override
+    public JSONArray getJSONArray(String key) {
+        Object value = map.get(key);
+
+        if (value instanceof JSONArray) {
+            return (JSONArray) value;
+        }
+
+        return JSON.toJSONArray(value);
+    }
+
+    @Override
+    public <T> T getObject(String key, Class<T> clazz) {
+        Object value = map.get(key);
+        return castToJavaBean(value, clazz);
+    }
+
+    @Override
+    public Boolean getBoolean(String key) {
+        Object value = map.get(key);
+        return castToBoolean(value);
+    }
+
+    @Override
+    public byte[] getBytes(String key) {
+        Object value = get(key);
+        if (value == null) {
+            return null;
+        }
+        return castToBytes(value);
+    }
+
+    @Override
+    public boolean getBooleanValue(String key) {
+        Object value = map.get(key);
+        if (value == null) {
+            return false;
+        }
+        return castToBoolean(key);
+    }
+
+    @Override
+    public Byte getByte(String key) {
+        Object value = get(key);
+        return castToByte(value);
+    }
+
+    @Override
+    public byte getByteValue(String key) {
+        Object value = get(key);
+
+        if (value == null) {
+            return 0;
+        }
+        return castToByte(value);
+    }
+
+    @Override
+    public Short getShort(String key) {
+        Object value = get(key);
+
+        return castToShort(value);
+    }
+
+    @Override
+    public short getShortValue(String key) {
+        Object value = get(key);
+        if (value == null) {
+            return 0;
+        }
+        return castToShort(value);
+    }
+
+    @Override
+    public Integer getInteger(String key) {
+        Object value = get(key);
+        return castToInt(value);
+    }
+
+    @Override
+    public int getIntValue(String key) {
+        Object value = get(key);
+        if (value == null) {
+            return 0;
+        }
+        return castToInt(value);
+    }
+
+    @Override
+    public Long getLong(String key) {
+        Object value = get(key);
+
+        return castToLong(value);
+    }
+
+    @Override
+    public long getLongValue(String key) {
+        Object value = get(key);
+        if (value == null) {
+            return 0L;
+        }
+        return castToLong(value);
+    }
+
+    @Override
+    public Float getFloat(String key) {
+        Object value = get(key);
+        return castToFloat(value);
+    }
+
+    public float getFloatValue(String key) {
+        Object value = get(key);
+
+        if (value == null) {
+            return 0F;
+        }
+
+        return castToFloat(value);
+    }
+
+    public Double getDouble(String key) {
+        Object value = get(key);
+
+        return castToDouble(value);
+    }
+
+    public double getDoubleValue(String key) {
+        Object value = get(key);
+
+        if (value == null) {
+            return 0D;
+        }
+
+        return castToDouble(value);
+    }
+
+    public BigDecimal getBigDecimal(String key) {
+        Object value = get(key);
+
+        return castToBigDecimal(value);
+    }
+
+    public BigInteger getBigInteger(String key) {
+        Object value = get(key);
+
+        return castToBigInteger(value);
+    }
+
+    public String getString(String key) {
+        Object value = get(key);
+
+        if (value == null) {
+            return null;
+        }
+
+        return value.toString();
+    }
+
+    public Date getDate(String key) {
+        Object value = get(key);
+
+        return castToDate(value);
+    }
+
+    public java.sql.Date getSqlDate(String key) {
+        Object value = get(key);
+
+        return castToSqlDate(value);
+    }
+
+    public Timestamp getTimestamp(String key) {
+        Object value = get(key);
+
+        return castToTimestamp(value);
+    }
+
+    @Override
+    public Object put(String key, Object value) {
+        return map.put(key, value);
+    }
+
+    @Override
+    public void putAll(Map<? extends String, ? extends Object> m) {
+        map.putAll(m);
+    }
+
+    @Override
+    public void clear() {
+        map.clear();
+    }
+
+    @Override
+    public Object remove(Object key) {
+        return map.remove(key);
+    }
+
+    @Override
+    public Set<String> keySet() {
+        return map.keySet();
+    }
+
+    @Override
+    public Collection<Object> values() {
+        return map.values();
+    }
+
+    @Override
+    public Set<Map.Entry<String, Object>> entrySet() {
+        return map.entrySet();
+    }
+
+    @Override
+    public String toJSONString() {
+        return JSON.toJSONString(map);
+    }
+
+    public String toString() {
+        return toJSONString();
+    }
+}

+ 6 - 5
lts-core/src/main/java/com/lts/core/monitor/AbstractMonitor.java

@@ -1,7 +1,7 @@
 package com.lts.core.monitor;
 
-import com.alibaba.fastjson.JSONException;
-import com.alibaba.fastjson.JSONObject;
+import com.lts.core.json.JSONException;
+import com.lts.core.json.JSONObject;
 import com.lts.core.Application;
 import com.lts.core.cluster.Config;
 import com.lts.core.cluster.NodeType;
@@ -9,6 +9,7 @@ import com.lts.core.commons.file.FileUtils;
 import com.lts.core.commons.utils.*;
 import com.lts.core.constant.Constants;
 import com.lts.core.domain.monitor.MonitorData;
+import com.lts.core.json.JSON;
 import com.lts.core.logger.Logger;
 import com.lts.core.logger.LoggerFactory;
 import com.lts.core.support.SystemClock;
@@ -156,7 +157,7 @@ public abstract class AbstractMonitor implements Monitor {
                 List<MonitorData> subList = BatchUtils.getBatchList(i, BATCH_REPORT_SIZE, toSendMonitorDataList);
                 if (CollectionUtils.isNotEmpty(subList)) {
                     try {
-                        if (send(getPostParam(JSONUtils.toJSONString(subList)), Constants.MONITOR_DATA_ADD_URL)) {
+                        if (send(getPostParam(JSON.toJSONString(subList)), Constants.MONITOR_DATA_ADD_URL)) {
                             toIndex = toIndex + CollectionUtils.sizeOf(subList);
                             if (LOGGER.isDebugEnabled()) {
                                 LOGGER.debug("Report monitor data success ");
@@ -194,7 +195,7 @@ public abstract class AbstractMonitor implements Monitor {
         String result = WebUtils.doPost(url, params, 3000, 6000);
         if (StringUtils.isNotEmpty(result)) {
             try {
-                JSONObject json = JSONUtils.parseObject(result);
+                JSONObject json = JSON.parseObject(result);
                 if (json.getBoolean("success")) {
                     return true;
                 } else {
@@ -234,7 +235,7 @@ public abstract class AbstractMonitor implements Monitor {
         }
         Map<String, Object> infoMap = JVMCollector.getJVMInfo();
         try {
-            if (send(getPostParam(JSONUtils.toJSONString(infoMap)), Constants.MONITOR_JVM_INFO_DATA_ADD_URL)) {
+            if (send(getPostParam(JSON.toJSONString(infoMap)), Constants.MONITOR_JVM_INFO_DATA_ADD_URL)) {
                 jvmInfoSendSuccess = true;
             }
         } catch (Exception e) {

+ 4 - 4
lts-core/src/main/java/com/lts/core/support/RetryScheduler.java

@@ -3,7 +3,7 @@ package com.lts.core.support;
 import com.lts.core.Application;
 import com.lts.core.commons.utils.CollectionUtils;
 import com.lts.core.commons.utils.GenericsUtils;
-import com.lts.core.commons.utils.JSONUtils;
+import com.lts.core.json.JSON;
 import com.lts.core.constant.EcTopic;
 import com.lts.core.domain.KVPair;
 import com.lts.core.extension.ExtensionLoader;
@@ -188,7 +188,7 @@ public abstract class RetryScheduler<T> {
                             values.add(kvPair.getValue());
                         }
                         if (retry(values)) {
-                            LOGGER.info("{} RetryScheduler, local files send success, size: {}, {}", name, values.size(), JSONUtils.toJSONString(values));
+                            LOGGER.info("{} RetryScheduler, local files send success, size: {}, {}", name, values.size(), JSON.toJSONString(values));
                             failStore.delete(keys);
                         } else {
                             break;
@@ -240,7 +240,7 @@ public abstract class RetryScheduler<T> {
                                 values.add(kvPair.getValue());
                             }
                             if (retry(values)) {
-                                LOGGER.info("{} RetryScheduler, dead local files send success, size: {}, {}", name, values.size(), JSONUtils.toJSONString(values));
+                                LOGGER.info("{} RetryScheduler, dead local files send success, size: {}, {}", name, values.size(), JSON.toJSONString(values));
                                 store.delete(keys);
                             } else {
                                 store.close();
@@ -263,7 +263,7 @@ public abstract class RetryScheduler<T> {
         try {
             lock.tryLock();
             failStore.put(key, value);
-            LOGGER.info("{} RetryScheduler, local files save success, {}", name, JSONUtils.toJSONString(value));
+            LOGGER.info("{} RetryScheduler, local files save success, {}", name, JSON.toJSONString(value));
         } catch (FailStoreException e) {
             LOGGER.error("{} RetryScheduler in schedule error. ", name, e);
         } finally {

+ 1 - 1
lts-core/src/main/java/com/lts/core/support/Version.java

@@ -20,7 +20,7 @@ public final class Version {
 
     private static final Logger LOGGER = LoggerFactory.getLogger(Version.class);
 
-    private static final String VERSION = getVersion(Version.class, "1.6.2");
+    private static final String VERSION = getVersion(Version.class, "1.6.3-SNAPSHOT");
 
     static {
         // 检查是否存在重复的jar包

+ 3 - 3
lts-core/src/main/java/com/lts/ec/injvm/InjvmEventCenter.java

@@ -1,7 +1,7 @@
 package com.lts.ec.injvm;
 
 import com.lts.core.commons.collect.ConcurrentHashSet;
-import com.lts.core.commons.utils.JSONUtils;
+import com.lts.core.json.JSON;
 import com.lts.core.constant.Constants;
 import com.lts.core.logger.Logger;
 import com.lts.core.logger.LoggerFactory;
@@ -62,7 +62,7 @@ public class InjvmEventCenter implements EventCenter {
                     subscriber.getObserver().onObserved(eventInfo);
                 } catch (Throwable t) {      // 防御性容错
                     LOGGER.error(" eventInfo:{}, subscriber:{}",
-                            JSONUtils.toJSONString(eventInfo), JSONUtils.toJSONString(subscriber), t);
+                            JSON.toJSONString(eventInfo), JSON.toJSONString(subscriber), t);
                 }
             }
         }
@@ -82,7 +82,7 @@ public class InjvmEventCenter implements EventCenter {
                             subscriber.getObserver().onObserved(eventInfo);
                         } catch (Throwable t) {     // 防御性容错
                             LOGGER.error(" eventInfo:{}, subscriber:{}",
-                                    JSONUtils.toJSONString(eventInfo), JSONUtils.toJSONString(subscriber), t);
+                                    JSON.toJSONString(eventInfo), JSON.toJSONString(subscriber), t);
                         }
                     }
                 }

+ 2 - 2
lts-core/src/main/java/com/lts/jvmmonitor/JVMCollector.java

@@ -1,6 +1,6 @@
 package com.lts.jvmmonitor;
 
-import com.lts.core.commons.utils.JSONUtils;
+import com.lts.core.json.JSON;
 import com.lts.core.domain.monitor.JVMMonitorData;
 import com.lts.jvmmonitor.mbean.JVMGCMBean;
 import com.lts.jvmmonitor.mbean.JVMInfoMBean;
@@ -64,7 +64,7 @@ public class JVMCollector {
             public void run() {
                 while (true) {
                     JVMMonitorData jvmMonitorData = JVMCollector.collect();
-                    System.out.println(JSONUtils.toJSONString(jvmMonitorData));
+                    System.out.println(JSON.toJSONString(jvmMonitorData));
                     try {
                         Thread.sleep(10000L);
                     } catch (InterruptedException e) {

+ 2 - 2
lts-core/src/main/java/com/lts/remoting/protocol/RemotingCommand.java

@@ -1,6 +1,6 @@
 package com.lts.remoting.protocol;
 
-import com.lts.core.commons.utils.JSONUtils;
+import com.lts.core.json.JSON;
 import com.lts.remoting.RemotingCommandBody;
 
 import java.io.Serializable;
@@ -138,7 +138,7 @@ public class RemotingCommand implements Serializable{
                 ", flag=" + flag +
                 ", remark='" + remark + '\'' +
                 ", sid='" + sid + '\'' +
-                ", body=" + JSONUtils.toJSONString(body) +
+                ", body=" + JSON.toJSONString(body) +
                 '}';
     }
 

+ 2 - 0
lts-core/src/main/resources/META-INF/lts/internal/com.lts.core.json.JSONAdapter

@@ -0,0 +1,2 @@
+fastjson=com.lts.core.json.fastjson.FastJSONAdapter
+jackson=com.lts.core.json.jackson.JacksonJSONAdapter

+ 2 - 2
lts-core/src/test/java/com/lts/core/failstore/berkeleydb/BerkeleydbFailStoreTest.java

@@ -3,7 +3,7 @@ package com.lts.core.failstore.berkeleydb;
 import com.lts.core.cluster.Config;
 import com.lts.core.cluster.NodeType;
 import com.lts.core.commons.utils.CollectionUtils;
-import com.lts.core.commons.utils.JSONUtils;
+import com.lts.core.json.JSON;
 import com.lts.core.constant.Constants;
 import com.lts.core.domain.Job;
 import com.lts.core.domain.KVPair;
@@ -50,7 +50,7 @@ public class BerkeleydbFailStoreTest {
         List<KVPair<String, Job>> kvPairs = failStore.fetchTop(5, Job.class);
         if (CollectionUtils.isNotEmpty(kvPairs)) {
             for (KVPair<String, Job> kvPair : kvPairs) {
-                System.out.println(JSONUtils.toJSONString(kvPair));
+                System.out.println(JSON.toJSONString(kvPair));
             }
         }
     }

+ 2 - 2
lts-core/src/test/java/com/lts/core/failstore/leveldb/LeveldbFailStoreTest.java

@@ -3,7 +3,7 @@ package com.lts.core.failstore.leveldb;
 import com.lts.core.cluster.Config;
 import com.lts.core.cluster.NodeType;
 import com.lts.core.commons.utils.CollectionUtils;
-import com.lts.core.commons.utils.JSONUtils;
+import com.lts.core.json.JSON;
 import com.lts.core.constant.Constants;
 import com.lts.core.domain.Job;
 import com.lts.core.domain.KVPair;
@@ -49,7 +49,7 @@ public class LeveldbFailStoreTest {
         List<KVPair<String, Job>> kvPairs = failStore.fetchTop(5, Job.class);
         if (CollectionUtils.isNotEmpty(kvPairs)) {
             for (KVPair<String, Job> kvPair : kvPairs) {
-                System.out.println(JSONUtils.toJSONString(kvPair));
+                System.out.println(JSON.toJSONString(kvPair));
             }
         }
     }

+ 2 - 2
lts-core/src/test/java/com/lts/core/failstore/mapdb/MapdbFailStoreTest.java

@@ -3,7 +3,7 @@ package com.lts.core.failstore.mapdb;
 import com.lts.core.cluster.Config;
 import com.lts.core.cluster.NodeType;
 import com.lts.core.commons.utils.CollectionUtils;
-import com.lts.core.commons.utils.JSONUtils;
+import com.lts.core.json.JSON;
 import com.lts.core.constant.Constants;
 import com.lts.core.domain.Job;
 import com.lts.core.domain.KVPair;
@@ -49,7 +49,7 @@ public class MapdbFailStoreTest {
         List<KVPair<String, Job>> kvPairs = failStore.fetchTop(5, Job.class);
         if (CollectionUtils.isNotEmpty(kvPairs)) {
             for (KVPair<String, Job> kvPair : kvPairs) {
-                System.out.println(JSONUtils.toJSONString(kvPair));
+                System.out.println(JSON.toJSONString(kvPair));
             }
         }
     }

+ 2 - 2
lts-core/src/test/java/com/lts/core/failstore/rocksdb/RocksdbFailStoreTest.java

@@ -3,7 +3,7 @@ package com.lts.core.failstore.rocksdb;
 import com.lts.core.cluster.Config;
 import com.lts.core.cluster.NodeType;
 import com.lts.core.commons.utils.CollectionUtils;
-import com.lts.core.commons.utils.JSONUtils;
+import com.lts.core.json.JSON;
 import com.lts.core.constant.Constants;
 import com.lts.core.domain.Job;
 import com.lts.core.domain.KVPair;
@@ -50,7 +50,7 @@ public class RocksdbFailStoreTest {
         List<KVPair<String, Job>> kvPairs = failStore.fetchTop(5, Job.class);
         if (CollectionUtils.isNotEmpty(kvPairs)) {
             for (KVPair<String, Job> kvPair : kvPairs) {
-                System.out.println(JSONUtils.toJSONString(kvPair));
+                System.out.println(JSON.toJSONString(kvPair));
             }
         }
     }

+ 13 - 1
lts-example/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>lts-parent</artifactId>
         <groupId>com.lts</groupId>
-        <version>1.6.2</version>
+        <version>1.6.3-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
     <artifactId>lts-example</artifactId>
@@ -122,5 +122,17 @@
             <groupId>org.mapdb</groupId>
             <artifactId>mapdb</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-databind</artifactId>
+        </dependency>
     </dependencies>
 </project>

+ 2 - 2
lts-example/src/main/java/com/lts/example/support/TestJobRunnerTester.java

@@ -1,6 +1,6 @@
 package com.lts.example.support;
 
-import com.lts.core.commons.utils.JSONUtils;
+import com.lts.core.json.JSON;
 import com.lts.core.domain.Job;
 import com.lts.tasktracker.Result;
 import com.lts.tasktracker.runner.JobRunner;
@@ -18,7 +18,7 @@ public class TestJobRunnerTester extends JobRunnerTester {
         // 运行测试
         TestJobRunnerTester tester = new TestJobRunnerTester();
         Result result = tester.run(job);
-        System.out.println(JSONUtils.toJSONString(result));
+        System.out.println(JSON.toJSONString(result));
     }
 
     @Override

+ 1 - 1
lts-jobclient/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>lts-parent</artifactId>
         <groupId>com.lts</groupId>
-        <version>1.6.2</version>
+        <version>1.6.3-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 3 - 3
lts-jobclient/src/main/java/com/lts/jobclient/RetryJobClient.java

@@ -1,6 +1,6 @@
 package com.lts.jobclient;
 
-import com.lts.core.commons.utils.JSONUtils;
+import com.lts.core.json.JSON;
 import com.lts.core.domain.Job;
 import com.lts.core.support.RetryScheduler;
 import com.lts.jobclient.domain.JobClientApplication;
@@ -65,7 +65,7 @@ public class RetryJobClient extends JobClient<JobClientNode, JobClientApplicatio
             response.setFailedJobs(jobs);
             response.setCode(ResponseCode.SUBMIT_TOO_BUSY_AND_SAVE_FOR_LATER);
             response.setMsg(response.getMsg() + ", submit too busy , save local fail store and send later !");
-            LOGGER.warn(JSONUtils.toJSONString(response));
+            LOGGER.warn(JSON.toJSONString(response));
             return response;
         }
         if (!response.isSuccess()) {
@@ -76,7 +76,7 @@ public class RetryJobClient extends JobClient<JobClientNode, JobClientApplicatio
                 response.setSuccess(true);
                 response.setCode(ResponseCode.SUBMIT_FAILED_AND_SAVE_FOR_LATER);
                 response.setMsg(response.getMsg() + ", save local fail store and send later !");
-                LOGGER.warn(JSONUtils.toJSONString(response));
+                LOGGER.warn(JSON.toJSONString(response));
             } catch (Exception e) {
                 response.setSuccess(false);
                 response.setMsg(e.getMessage());

+ 1 - 1
lts-jobtracker/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>lts-parent</artifactId>
         <groupId>com.lts</groupId>
-        <version>1.6.2</version>
+        <version>1.6.3-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 2 - 2
lts-jobtracker/src/main/java/com/lts/jobtracker/command/AddJobCommand.java

@@ -2,7 +2,7 @@ package com.lts.jobtracker.command;
 
 import com.lts.command.CommandProcessor;
 import com.lts.command.CommandRequest;
-import com.lts.core.commons.utils.JSONUtils;
+import com.lts.core.json.JSON;
 import com.lts.core.commons.utils.StringUtils;
 import com.lts.core.domain.Job;
 import com.lts.core.logger.Logger;
@@ -39,7 +39,7 @@ public class AddJobCommand implements CommandProcessor {
             return;
         }
         try {
-            Job job = JSONUtils.parse(jobJSON, Job.class);
+            Job job = JSON.parse(jobJSON, Job.class);
             if (job == null) {
                 writer.println("job can not be null");
                 return;

+ 2 - 2
lts-jobtracker/src/main/java/com/lts/jobtracker/complete/JobRetryHandler.java

@@ -2,7 +2,7 @@ package com.lts.jobtracker.complete;
 
 import com.lts.core.commons.utils.CollectionUtils;
 import com.lts.core.commons.utils.DateUtils;
-import com.lts.core.commons.utils.JSONUtils;
+import com.lts.core.json.JSON;
 import com.lts.core.domain.JobWrapper;
 import com.lts.core.domain.TaskTrackerJobResult;
 import com.lts.core.logger.Logger;
@@ -71,7 +71,7 @@ public class JobRetryHandler implements JobCompleteHandler {
             try {
                 application.getExecutableJobQueue().add(jobPo);
             } catch (DuplicateJobException e) {
-                LOGGER.warn("Add Executable Job error jobPo={}", JSONUtils.toJSONString(jobPo), e);
+                LOGGER.warn("Add Executable Job error jobPo={}", JSON.toJSONString(jobPo), e);
             }
             // 从正在执行的队列中移除
             application.getExecutingJobQueue().remove(jobPo.getJobId());

+ 2 - 2
lts-jobtracker/src/main/java/com/lts/jobtracker/sender/JobSender.java

@@ -2,7 +2,7 @@ package com.lts.jobtracker.sender;
 
 import com.lts.biz.logger.domain.JobLogPo;
 import com.lts.biz.logger.domain.LogType;
-import com.lts.core.commons.utils.JSONUtils;
+import com.lts.core.json.JSON;
 import com.lts.core.constant.Level;
 import com.lts.core.logger.Logger;
 import com.lts.core.logger.LoggerFactory;
@@ -41,7 +41,7 @@ public class JobSender {
         try {
             application.getExecutingJobQueue().add(jobPo);
         } catch (DuplicateJobException e) {
-            LOGGER.warn("Add Executing Job error, jobPo={}", JSONUtils.toJSONString(jobPo), e);
+            LOGGER.warn("Add Executing Job error, jobPo={}", JSON.toJSONString(jobPo), e);
             application.getExecutableJobQueue().resume(jobPo);
             return new SendResult(false, JobPushResult.FAILED);
         }

+ 2 - 2
lts-jobtracker/src/main/java/com/lts/jobtracker/support/JobPusher.java

@@ -1,7 +1,7 @@
 package com.lts.jobtracker.support;
 
 import com.lts.core.commons.utils.Holder;
-import com.lts.core.commons.utils.JSONUtils;
+import com.lts.core.json.JSON;
 import com.lts.core.constant.Constants;
 import com.lts.core.exception.RemotingSendException;
 import com.lts.core.exception.RequestTimeoutException;
@@ -175,7 +175,7 @@ public class JobPusher {
                         jobPo.setIsRunning(true);
                         application.getExecutableJobQueue().add(jobPo);
                     } catch (DuplicateJobException e) {
-                        LOGGER.warn("Add Executable Job error jobPo={}", JSONUtils.toJSONString(jobPo), e);
+                        LOGGER.warn("Add Executable Job error jobPo={}", JSON.toJSONString(jobPo), e);
                         needResume = false;
                     }
                     application.getExecutingJobQueue().remove(jobPo.getJobId());

+ 2 - 2
lts-jobtracker/src/main/java/com/lts/jobtracker/support/checker/ExecutableDeadJobChecker.java

@@ -1,7 +1,7 @@
 package com.lts.jobtracker.support.checker;
 
 import com.lts.core.commons.utils.CollectionUtils;
-import com.lts.core.commons.utils.JSONUtils;
+import com.lts.core.json.JSON;
 import com.lts.core.logger.Logger;
 import com.lts.core.logger.LoggerFactory;
 import com.lts.core.support.SystemClock;
@@ -76,7 +76,7 @@ public class ExecutableDeadJobChecker {
             if (CollectionUtils.isNotEmpty(deadJobPo)) {
                 for (JobPo jobPo : deadJobPo) {
                     application.getExecutableJobQueue().resume(jobPo);
-                    LOGGER.info("Fix executable job : {} ", JSONUtils.toJSONString(jobPo));
+                    LOGGER.info("Fix executable job : {} ", JSON.toJSONString(jobPo));
                 }
             }
         }

+ 3 - 3
lts-jobtracker/src/main/java/com/lts/jobtracker/support/checker/ExecutingDeadJobChecker.java

@@ -4,7 +4,7 @@ import com.lts.biz.logger.domain.JobLogPo;
 import com.lts.biz.logger.domain.LogType;
 import com.lts.core.cluster.NodeType;
 import com.lts.core.commons.utils.CollectionUtils;
-import com.lts.core.commons.utils.JSONUtils;
+import com.lts.core.json.JSON;
 import com.lts.core.constant.Constants;
 import com.lts.core.constant.Level;
 import com.lts.core.exception.RemotingSendException;
@@ -184,7 +184,7 @@ public class ExecutingDeadJobChecker {
                 application.getExecutableJobQueue().add(jobPo);
             } catch (DuplicateJobException e) {
                 // ignore
-                LOGGER.warn("Add Executable Job error jobPo={}", JSONUtils.toJSONString(jobPo), e);
+                LOGGER.warn("Add Executable Job error jobPo={}", JSON.toJSONString(jobPo), e);
             }
 
             // 2. remove from executing queue
@@ -201,7 +201,7 @@ public class ExecutingDeadJobChecker {
         } catch (Throwable t) {
             LOGGER.error(t.getMessage(), t);
         }
-        LOGGER.info("fix dead job ! {}", JSONUtils.toJSONString(jobPo));
+        LOGGER.info("fix dead job ! {}", JSON.toJSONString(jobPo));
     }
 
     public void stop() {

+ 1 - 1
lts-logger/lts-logger-api/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>lts-logger</artifactId>
         <groupId>com.lts</groupId>
-        <version>1.6.2</version>
+        <version>1.6.3-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 1 - 1
lts-logger/lts-logger-console/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>lts-logger</artifactId>
         <groupId>com.lts</groupId>
-        <version>1.6.2</version>
+        <version>1.6.3-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 2 - 2
lts-logger/lts-logger-console/src/main/java/com/lts/biz/logger/console/ConsoleJobLogger.java

@@ -3,7 +3,7 @@ package com.lts.biz.logger.console;
 import com.lts.biz.logger.JobLogger;
 import com.lts.biz.logger.domain.JobLogPo;
 import com.lts.biz.logger.domain.JobLoggerRequest;
-import com.lts.core.commons.utils.JSONUtils;
+import com.lts.core.json.JSON;
 import com.lts.web.response.PageResponse;
 import com.lts.core.logger.Logger;
 import com.lts.core.logger.LoggerFactory;
@@ -19,7 +19,7 @@ public class ConsoleJobLogger implements JobLogger {
 
     @Override
     public void log(JobLogPo jobLogPo) {
-        LOGGER.info(JSONUtils.toJSONString(jobLogPo));
+        LOGGER.info(JSON.toJSONString(jobLogPo));
     }
 
     @Override

+ 1 - 1
lts-logger/lts-logger-mongo/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>lts-logger</artifactId>
         <groupId>com.lts</groupId>
-        <version>1.6.2</version>
+        <version>1.6.3-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 1 - 1
lts-logger/lts-logger-mysql/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>lts-logger</artifactId>
         <groupId>com.lts</groupId>
-        <version>1.6.2</version>
+        <version>1.6.3-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 5 - 6
lts-logger/lts-logger-mysql/src/main/java/com/lts/biz/logger/mysql/MysqlJobLogger.java

@@ -1,6 +1,5 @@
 package com.lts.biz.logger.mysql;
 
-import com.alibaba.fastjson.TypeReference;
 import com.lts.biz.logger.JobLogException;
 import com.lts.biz.logger.JobLogger;
 import com.lts.biz.logger.domain.JobLogPo;
@@ -9,9 +8,10 @@ import com.lts.biz.logger.domain.LogType;
 import com.lts.core.cluster.Config;
 import com.lts.core.commons.file.FileUtils;
 import com.lts.core.commons.utils.CollectionUtils;
-import com.lts.core.commons.utils.JSONUtils;
+import com.lts.core.json.JSON;
 import com.lts.core.constant.Constants;
 import com.lts.core.constant.Level;
+import com.lts.core.json.TypeReference;
 import com.lts.store.jdbc.JdbcRepository;
 import com.lts.store.jdbc.SqlBuilder;
 import com.lts.web.response.PageResponse;
@@ -63,7 +63,7 @@ public class MysqlJobLogger extends JdbcRepository implements JobLogger {
                     jobLogPo.getPriority(),
                     jobLogPo.getSubmitNodeGroup(),
                     jobLogPo.getTaskTrackerNodeGroup(),
-                    JSONUtils.toJSONString(jobLogPo.getExtParams()),
+                    JSON.toJSONString(jobLogPo.getExtParams()),
                     jobLogPo.isNeedFeedback(),
                     jobLogPo.getCronExpression(),
                     jobLogPo.getTriggerTime(),
@@ -97,7 +97,7 @@ public class MysqlJobLogger extends JdbcRepository implements JobLogger {
             params[i][9] = jobLogPo.getPriority();
             params[i][10] = jobLogPo.getSubmitNodeGroup();
             params[i][11] = jobLogPo.getTaskTrackerNodeGroup();
-            params[i][12] = JSONUtils.toJSONString(jobLogPo.getExtParams());
+            params[i][12] = JSON.toJSONString(jobLogPo.getExtParams());
             params[i][13] = jobLogPo.isNeedFeedback();
             params[i][14] = jobLogPo.getCronExpression();
             params[i][15] = jobLogPo.getTriggerTime();
@@ -129,8 +129,7 @@ public class MysqlJobLogger extends JdbcRepository implements JobLogger {
                 jobLogPo.setPriority(rs.getInt("priority"));
                 jobLogPo.setSubmitNodeGroup(rs.getString("submit_node_group"));
                 jobLogPo.setTaskTrackerNodeGroup(rs.getString("task_tracker_node_group"));
-                jobLogPo.setExtParams(JSONUtils.parse(rs.getString("ext_params"), new TypeReference<Map<String, String>>() {
-                }));
+                jobLogPo.setExtParams(JSON.parse(rs.getString("ext_params"), new TypeReference<Map<String, String>>(){}));
                 jobLogPo.setNeedFeedback(rs.getBoolean("need_feedback"));
                 jobLogPo.setCronExpression(rs.getString("cron_expression"));
                 jobLogPo.setTriggerTime(rs.getLong("trigger_time"));

+ 1 - 1
lts-logger/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>lts-parent</artifactId>
         <groupId>com.lts</groupId>
-        <version>1.6.2</version>
+        <version>1.6.3-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 1 - 1
lts-queue/lts-queue-api/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>lts-queue</artifactId>
         <groupId>com.lts</groupId>
-        <version>1.6.2</version>
+        <version>1.6.3-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 2 - 2
lts-queue/lts-queue-api/src/main/java/com/lts/queue/domain/JobPo.java

@@ -1,6 +1,6 @@
 package com.lts.queue.domain;
 
-import com.lts.core.commons.utils.JSONUtils;
+import com.lts.core.json.JSON;
 
 import java.util.Map;
 
@@ -183,6 +183,6 @@ public class JobPo {
 
     @Override
     public String toString() {
-        return JSONUtils.toJSONString(this);
+        return JSON.toJSONString(this);
     }
 }

+ 1 - 1
lts-queue/lts-queue-mongo/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>lts-queue</artifactId>
         <groupId>com.lts</groupId>
-        <version>1.6.2</version>
+        <version>1.6.3-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
     <packaging>jar</packaging>

+ 2 - 2
lts-queue/lts-queue-mongo/src/main/java/com/lts/queue/mongo/MongoJobFeedbackQueue.java

@@ -2,7 +2,7 @@ package com.lts.queue.mongo;
 
 import com.lts.core.cluster.Config;
 import com.lts.core.commons.utils.CollectionUtils;
-import com.lts.core.commons.utils.JSONUtils;
+import com.lts.core.json.JSON;
 import com.lts.core.logger.Logger;
 import com.lts.core.logger.LoggerFactory;
 import com.lts.core.support.JobQueueUtils;
@@ -63,7 +63,7 @@ public class MongoJobFeedbackQueue extends MongoRepository implements JobFeedbac
             try {
                 template.save(tableName, jobFeedbackPo);
             } catch (DuplicateKeyException e) {
-                LOGGER.warn("duplicate key for job feedback po: " + JSONUtils.toJSONString(jobFeedbackPo));
+                LOGGER.warn("duplicate key for job feedback po: " + JSON.toJSONString(jobFeedbackPo));
             }
         }
         return true;

+ 1 - 1
lts-queue/lts-queue-mysql/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>lts-queue</artifactId>
         <groupId>com.lts</groupId>
-        <version>1.6.2</version>
+        <version>1.6.3-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 3 - 3
lts-queue/lts-queue-mysql/src/main/java/com/lts/queue/mysql/AbstractMysqlJobQueue.java

@@ -2,7 +2,7 @@ package com.lts.queue.mysql;
 
 import com.lts.core.cluster.Config;
 import com.lts.core.commons.utils.CharacterUtils;
-import com.lts.core.commons.utils.JSONUtils;
+import com.lts.core.json.JSON;
 import com.lts.core.commons.utils.StringUtils;
 import com.lts.queue.JobQueue;
 import com.lts.queue.domain.JobPo;
@@ -55,7 +55,7 @@ public abstract class AbstractMysqlJobQueue extends JdbcRepository implements Jo
                     jobPo.getGmtModified(),
                     jobPo.getSubmitNodeGroup(),
                     jobPo.getTaskTrackerNodeGroup(),
-                    JSONUtils.toJSONString(jobPo.getExtParams()),
+                    JSON.toJSONString(jobPo.getExtParams()),
                     jobPo.isRunning(),
                     jobPo.getTaskTrackerIdentity(),
                     jobPo.isNeedFeedback(),
@@ -108,7 +108,7 @@ public abstract class AbstractMysqlJobQueue extends JdbcRepository implements Jo
         SqlBuilder sql = new SqlBuilder("UPDATE " + getTableName(request));
         sql.addUpdateField("cron_expression", request.getCronExpression());
         sql.addUpdateField("need_feedback", request.getNeedFeedback());
-        sql.addUpdateField("ext_params", JSONUtils.toJSONString(request.getExtParams()));
+        sql.addUpdateField("ext_params", JSON.toJSONString(request.getExtParams()));
         sql.addUpdateField("trigger_time", request.getTriggerTime() == null ? null : request.getTriggerTime().getTime());
         sql.addUpdateField("priority", request.getPriority());
         sql.addUpdateField("submit_node_group", request.getSubmitNodeGroup());

+ 4 - 5
lts-queue/lts-queue-mysql/src/main/java/com/lts/queue/mysql/MysqlJobFeedbackQueue.java

@@ -1,12 +1,12 @@
 package com.lts.queue.mysql;
 
-import com.alibaba.fastjson.TypeReference;
 import com.lts.core.cluster.Config;
 import com.lts.core.commons.file.FileUtils;
 import com.lts.core.commons.utils.CollectionUtils;
-import com.lts.core.commons.utils.JSONUtils;
+import com.lts.core.json.JSON;
 import com.lts.core.constant.Constants;
 import com.lts.core.domain.TaskTrackerJobResult;
+import com.lts.core.json.TypeReference;
 import com.lts.core.support.JobQueueUtils;
 import com.lts.queue.JobFeedbackQueue;
 import com.lts.queue.domain.JobFeedbackPo;
@@ -87,7 +87,7 @@ public class MysqlJobFeedbackQueue extends JdbcRepository implements JobFeedback
         Object[] params = new Object[2];
         for (JobFeedbackPo jobFeedbackPo : jobFeedbackPos) {
             params[0] = jobFeedbackPo.getGmtCreated();
-            params[1] = JSONUtils.toJSONString(jobFeedbackPo.getTaskTrackerJobResult());
+            params[1] = JSON.toJSONString(jobFeedbackPo.getTaskTrackerJobResult());
             try {
                 String jobClientNodeGroup = jobFeedbackPo.getTaskTrackerJobResult().getJobWrapper().getJob().getSubmitNodeGroup();
                 getSqlTemplate().update(getRealSql(insertSQL, jobClientNodeGroup), params);
@@ -139,8 +139,7 @@ public class MysqlJobFeedbackQueue extends JdbcRepository implements JobFeedback
             while (rs.next()) {
                 JobFeedbackPo jobFeedbackPo = new JobFeedbackPo();
                 jobFeedbackPo.setId(rs.getString("id"));
-                jobFeedbackPo.setTaskTrackerJobResult(JSONUtils.parse(rs.getString("job_result"), new TypeReference<TaskTrackerJobResult>() {
-                }));
+                jobFeedbackPo.setTaskTrackerJobResult(JSON.parse(rs.getString("job_result"), new TypeReference<TaskTrackerJobResult>(){}));
                 jobFeedbackPo.setGmtCreated(rs.getLong("gmt_created"));
                 jobFeedbackPos.add(jobFeedbackPo);
             }

+ 3 - 4
lts-queue/lts-queue-mysql/src/main/java/com/lts/queue/mysql/support/ResultSetHandlerHolder.java

@@ -1,7 +1,7 @@
 package com.lts.queue.mysql.support;
 
-import com.alibaba.fastjson.TypeReference;
-import com.lts.core.commons.utils.JSONUtils;
+import com.lts.core.json.JSON;
+import com.lts.core.json.TypeReference;
 import com.lts.queue.domain.JobPo;
 import org.apache.commons.dbutils.ResultSetHandler;
 
@@ -47,8 +47,7 @@ public class ResultSetHandlerHolder {
         jobPo.setGmtModified(rs.getLong("gmt_modified"));
         jobPo.setSubmitNodeGroup(rs.getString("submit_node_group"));
         jobPo.setTaskTrackerNodeGroup(rs.getString("task_tracker_node_group"));
-        jobPo.setExtParams(JSONUtils.parse(rs.getString("ext_params"), new TypeReference<HashMap<String, String>>() {
-        }));
+        jobPo.setExtParams(JSON.parse(rs.getString("ext_params"), new TypeReference<HashMap<String, String>>(){}));
         jobPo.setIsRunning(rs.getBoolean("is_running"));
         jobPo.setTaskTrackerIdentity(rs.getString("task_tracker_identity"));
         jobPo.setCronExpression(rs.getString("cron_expression"));

+ 1 - 1
lts-queue/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>lts-parent</artifactId>
         <groupId>com.lts</groupId>
-        <version>1.6.2</version>
+        <version>1.6.3-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 1 - 1
lts-spring/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>lts-parent</artifactId>
         <groupId>com.lts</groupId>
-        <version>1.6.2</version>
+        <version>1.6.3-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
     <packaging>jar</packaging>

+ 1 - 1
lts-startup/lts-startup-admin/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>lts-startup</artifactId>
         <groupId>com.lts</groupId>
-        <version>1.6.2</version>
+        <version>1.6.3-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 17 - 1
lts-startup/lts-startup-jobtracker/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>lts-startup</artifactId>
         <groupId>com.lts</groupId>
-        <version>1.6.2</version>
+        <version>1.6.3-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
@@ -70,6 +70,22 @@
             <groupId>io.netty</groupId>
             <artifactId>netty-all</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.mapdb</groupId>
+            <artifactId>mapdb</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-databind</artifactId>
+        </dependency>
     </dependencies>
 
     <build>

+ 17 - 1
lts-startup/lts-startup-tasktracker/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>lts-startup</artifactId>
         <groupId>com.lts</groupId>
-        <version>1.6.2</version>
+        <version>1.6.3-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
@@ -68,6 +68,22 @@
             <groupId>io.netty</groupId>
             <artifactId>netty-all</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.mapdb</groupId>
+            <artifactId>mapdb</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-databind</artifactId>
+        </dependency>
     </dependencies>
 
     <build>

+ 2 - 2
lts-startup/lts-startup-tasktracker/src/main/java/com/lts/startup/test/TestJobRunner.java

@@ -1,6 +1,6 @@
 package com.lts.startup.test;
 
-import com.lts.core.commons.utils.JSONUtils;
+import com.lts.core.json.JSON;
 import com.lts.core.domain.Action;
 import com.lts.core.domain.Job;
 import com.lts.tasktracker.Result;
@@ -13,7 +13,7 @@ public class TestJobRunner implements JobRunner {
 
     @Override
     public Result run(Job job) throws Throwable {
-        System.out.println(JSONUtils.toJSONString(job));
+        System.out.println(JSON.toJSONString(job));
 
         return new Result(Action.EXECUTE_SUCCESS);
     }

+ 1 - 1
lts-startup/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>lts-parent</artifactId>
         <groupId>com.lts</groupId>
-        <version>1.6.2</version>
+        <version>1.6.3-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 1 - 1
lts-tasktracker/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>lts-parent</artifactId>
         <groupId>com.lts</groupId>
-        <version>1.6.2</version>
+        <version>1.6.3-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 1 - 1
lts/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>lts-parent</artifactId>
         <groupId>com.lts</groupId>
-        <version>1.6.2</version>
+        <version>1.6.3-SNAPSHOT</version>
     </parent>
     <packaging>jar</packaging>
     <modelVersion>4.0.0</modelVersion>

+ 13 - 1
pom.xml

@@ -7,7 +7,7 @@
     <groupId>com.lts</groupId>
     <artifactId>lts-parent</artifactId>
     <packaging>pom</packaging>
-    <version>1.6.2</version>
+    <version>1.6.3-SNAPSHOT</version>
     <modules>
         <module>lts-core</module>
         <module>lts-jobtracker</module>
@@ -49,6 +49,8 @@
         <hessian.version>4.0.38</hessian.version>
         <mapdb.version>2.0-beta10</mapdb.version>
         <groovy.version>2.4.5</groovy.version>
+        <jackson.version>2.6.3</jackson.version>
+        <aspectj.version>1.7.2</aspectj.version>
     </properties>
 
     <dependencyManagement>
@@ -230,6 +232,16 @@
                     </exclusion>
                 </exclusions>
             </dependency>
+            <dependency>
+                <groupId>com.fasterxml.jackson.core</groupId>
+                <artifactId>jackson-core</artifactId>
+                <version>${jackson.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.fasterxml.jackson.core</groupId>
+                <artifactId>jackson-databind</artifactId>
+                <version>${jackson.version}</version>
+            </dependency>
         </dependencies>
     </dependencyManagement>
     <build>