sort) {
65 | if (sort == null || sort.isEmpty()) {
66 | return sql;
67 | }
68 | StringBuffer buffer = new StringBuffer("select * from (").append(sql)
69 | .append(") dialect order by ");
70 | for (Sorting s : sort) {
71 | buffer.append(s.getColumn()).append(" ").append(s.getSort())
72 | .append(", ");
73 | }
74 | buffer.delete(buffer.length() - 2, buffer.length());
75 | return buffer.toString();
76 | }
77 |
78 | }
--------------------------------------------------------------------------------
/src/main/webapp/Html/js/libs/url/cmg.open.url.builder.tianpin.js:
--------------------------------------------------------------------------------
1 | var MessageDigest = java.security.MessageDigest;
2 | var String = java.lang.String;
3 | var StringBuffer = java.lang.StringBuffer;
4 | var Integer = java.lang.Integer;
5 | var Hashtable = java.util.Hashtable;
6 | var Iteractor = java.util.Iteractor;
7 | var DecimalFormat = java.text.DecimalFormat;
8 | var URI = org.apache.commons.httpclient.URI;
9 | var TreeMap = java.util.TreeMap;
10 | var Date = java.util.Date;
11 |
12 | function TianpinRESTAPI(treeMap){
13 | this.ht = treeMap;
14 | }
15 |
16 | TianpinRESTAPI.prototype.put = function (key, value) {
17 | this.ht.put(key, value);
18 | }
19 |
20 | TianpinRESTAPI.prototype.encrypt = function (app_secret) {
21 | var orgin = new StringBuffer();
22 | //orgin.append(app_secret);
23 |
24 | var map = new TreeMap();
25 | map.putAll(this.ht);
26 |
27 | var iter = map.keySet().iterator();
28 | while (iter.hasNext()) {
29 | var name = String.valueOf(iter.next());
30 | if (new String(map.get(name)).length() > 0) {
31 | orgin.append(name).append(map.get(name));
32 | }
33 | }
34 |
35 | orgin.append(app_secret);
36 |
37 | // get the md5 digest algorithm
38 | var algorithm = MessageDigest.getInstance("MD5");
39 |
40 | // get the input as bytes
41 | var bytes = new String(orgin).getBytes("UTF-8");
42 |
43 | // calculate the digest
44 | algorithm.reset();
45 | algorithm.update(bytes);
46 | var md5Digest = algorithm.digest();
47 |
48 | // turn the digest into a hex-string representation
49 | var hexString = new StringBuffer();
50 |
51 | for (var i = 0; i < md5Digest.length; i++){
52 | var hex = Integer.toHexString(md5Digest[i] & 0xFF);
53 | if (hex.length() == 1){
54 | hexString.append('0').append("");
55 | }
56 | hexString.append(hex);
57 | }
58 |
59 | // write output value
60 | var sign = hexString.toString();
61 | return sign;
62 | }
63 |
64 | TianpinRESTAPI.prototype.URLEncode = function (ru, rp) {
65 | var request_url = ru;
66 | var request_params = rp;
67 | for (var it = this.ht.entrySet().iterator(); it.hasNext();) {
68 | var e = it.next();
69 | if (new String(e.getValue()).length() > 0) {
70 | request_params.append("&").append(e.getKey()).append("=").append(e.getValue());
71 | }
72 | }
73 | var url = request_url + "?" + request_params.toString().substring(1);
74 |
75 | return encodeURI(url);
76 | }
--------------------------------------------------------------------------------
/src/main/webapp/Html/js/libs/url/cmg.open.url.builder.yihaodian.js:
--------------------------------------------------------------------------------
1 | var MessageDigest = java.security.MessageDigest;
2 | var String = java.lang.String;
3 | var StringBuffer = java.lang.StringBuffer;
4 | var Integer = java.lang.Integer;
5 | var Hashtable = java.util.Hashtable;
6 | var Iteractor = java.util.Iteractor;
7 | var DecimalFormat = java.text.DecimalFormat;
8 | var URI = org.apache.commons.httpclient.URI;
9 | var TreeMap = java.util.TreeMap;
10 | var Date = java.util.Date;
11 |
12 | function YihaodianRESTAPI(baseURL, treeMap){
13 | this.baseURL = baseURL;
14 | this.ht = treeMap;
15 | }
16 |
17 | YihaodianRESTAPI.prototype.put = function (key, value) {
18 | this.ht.put(key, value);
19 | }
20 |
21 | YihaodianRESTAPI.prototype.encrypt = function (app_secret) {
22 | var orgin = new StringBuffer();
23 | orgin.append(app_secret);
24 |
25 | var map = new TreeMap();
26 | map.putAll(this.ht);
27 |
28 | var iter = map.keySet().iterator();
29 | while (iter.hasNext()) {
30 | var name = String.valueOf(iter.next());
31 | if (new String(map.get(name)).length() > 0) {
32 | orgin.append(name).append(map.get(name));
33 | }
34 | }
35 |
36 | orgin.append(app_secret);
37 |
38 | // get the md5 digest algorithm
39 | var algorithm = MessageDigest.getInstance("MD5");
40 |
41 | // get the input as bytes
42 | var bytes = new String(orgin).getBytes("UTF-8");
43 |
44 | // calculate the digest
45 | algorithm.reset();
46 | algorithm.update(bytes);
47 | var md5Digest = algorithm.digest();
48 |
49 | // turn the digest into a hex-string representation
50 | var hexString = new StringBuffer();
51 |
52 | for (var i = 0; i < md5Digest.length; i++){
53 | if (md5Digest[i] >= 0 && md5Digest[i] < 16) {
54 | hexString.append('0');
55 | }
56 | hexString.append(Integer.toHexString(md5Digest[i] & 0XFF));
57 | }
58 |
59 | // write output value
60 | var sign = hexString.toString();
61 | return sign
62 | }
63 |
64 | YihaodianRESTAPI.prototype.URLEncode = function (rp) {
65 | var request_params = rp;
66 | for (var it = this.ht.entrySet().iterator(); it.hasNext();) {
67 | var e = it.next();
68 | if (new String(e.getValue()).length() > 0) {
69 | request_params.append("&").append(e.getKey()).append("=").append(e.getValue());
70 | }
71 | }
72 | var url = this.baseURL + "?" + request_params.toString().substring(1);
73 |
74 | return new URI(url).toString();
75 | }
--------------------------------------------------------------------------------
/src/main/webapp/Html/js/libs/url/cmg.open.url.builder.jd.js:
--------------------------------------------------------------------------------
1 | var MessageDigest = java.security.MessageDigest;
2 | var String = java.lang.String;
3 | var StringBuffer = java.lang.StringBuffer;
4 | var Integer = java.lang.Integer;
5 | var Hashtable = java.util.Hashtable;
6 | var Iteractor = java.util.Iteractor;
7 | var DecimalFormat = java.text.DecimalFormat;
8 | var URI = org.apache.commons.httpclient.URI;
9 | var TreeMap = java.util.TreeMap;
10 | var Date = java.util.Date;
11 |
12 | function JDRESTAPI(treeMap){
13 | this.ht = treeMap;
14 | }
15 |
16 | JDRESTAPI.prototype.put = function (key, value) {
17 | this.ht.put(key, value);
18 | }
19 |
20 | JDRESTAPI.prototype.encrypt = function (app_secret) {
21 | var orgin = new StringBuffer();
22 | orgin.append(app_secret);
23 |
24 | var map = new TreeMap();
25 | map.putAll(this.ht);
26 |
27 | var iter = map.keySet().iterator();
28 | while (iter.hasNext()) {
29 | var name = String.valueOf(iter.next());
30 | if (new String(map.get(name)).length() > 0) {
31 | orgin.append(name).append(map.get(name));
32 | }
33 | }
34 |
35 | orgin.append(app_secret);
36 |
37 | // get the md5 digest algorithm
38 | var algorithm = MessageDigest.getInstance("MD5");
39 |
40 | // get the input as bytes
41 | var bytes = new String(orgin).getBytes("UTF-8");
42 |
43 | // calculate the digest
44 | algorithm.reset();
45 | algorithm.update(bytes);
46 | var md5Digest = algorithm.digest();
47 |
48 | // turn the digest into a hex-string representation
49 | var hexString = new StringBuffer();
50 |
51 | for (var i = 0; i < md5Digest.length; i++){
52 | var hex = Integer.toHexString(md5Digest[i] & 0XFF);
53 | if (hex.length() == 1){
54 | hexString.append('0').append("");
55 | }
56 | hexString.append(hex);
57 | }
58 |
59 | // write output value
60 | var sign = hexString.toString().toUpperCase();
61 | return sign
62 | }
63 |
64 | JDRESTAPI.prototype.URLEncode = function (ru, rp) {
65 | var request_url = ru;
66 | var request_params = rp;
67 | for (var it = this.ht.entrySet().iterator(); it.hasNext();) {
68 | var e = it.next();
69 | if (new String(e.getValue()).length() > 0) {
70 | request_params.append("&").append(e.getKey()).append("=").append(e.getValue());
71 | }
72 | }
73 | var url = request_url + "?" + request_params.toString().substring(1);
74 |
75 | return new URI(url).toString();
76 | }
--------------------------------------------------------------------------------
/src/main/webapp/Html/js/libs/url/cmg.open.url.builder.coo8.js:
--------------------------------------------------------------------------------
1 | var MessageDigest = java.security.MessageDigest;
2 | var String = java.lang.String;
3 | var StringBuffer = java.lang.StringBuffer;
4 | var Integer = java.lang.Integer;
5 | var Hashtable = java.util.Hashtable;
6 | var Iteractor = java.util.Iteractor;
7 | var DecimalFormat = java.text.DecimalFormat;
8 | var URI = org.apache.commons.httpclient.URI;
9 | var TreeMap = java.util.TreeMap;
10 | var Date = java.util.Date;
11 |
12 | function Coo8RESTAPI(treeMap){
13 | this.ht = treeMap;
14 | }
15 |
16 | Coo8RESTAPI.prototype.put = function (key, value) {
17 | this.ht.put(key, value);
18 | }
19 |
20 | Coo8RESTAPI.prototype.encrypt = function (app_secret) {
21 | var orgin = new StringBuffer();
22 | orgin.append(app_secret);
23 |
24 | var map = new TreeMap();
25 | map.putAll(this.ht);
26 |
27 | var iter = map.keySet().iterator();
28 | while (iter.hasNext()) {
29 | var name = String.valueOf(iter.next());
30 | if (new String(map.get(name)).length() > 0) {
31 | orgin.append(name).append(map.get(name));
32 | }
33 | }
34 |
35 | orgin.append(app_secret);
36 |
37 | // get the md5 digest algorithm
38 | var algorithm = MessageDigest.getInstance("MD5");
39 |
40 | // get the input as bytes
41 | var bytes = new String(orgin).getBytes("UTF-8");
42 |
43 | // calculate the digest
44 | algorithm.reset();
45 | algorithm.update(bytes);
46 | var md5Digest = algorithm.digest();
47 |
48 | // turn the digest into a hex-string representation
49 | var hexString = new StringBuffer();
50 |
51 | for (var i = 0; i < md5Digest.length; i++){
52 | var hex = Integer.toHexString(md5Digest[i] & 0XFF);
53 | if (hex.length() == 1){
54 | hexString.append('0').append("");
55 | }
56 | hexString.append(hex);
57 | }
58 |
59 | // write output value
60 | var sign = hexString.toString().toUpperCase();
61 | return sign
62 | }
63 |
64 | Coo8RESTAPI.prototype.URLEncode = function (ru, rp) {
65 | var request_url = ru;
66 | var request_params = rp;
67 | for (var it = this.ht.entrySet().iterator(); it.hasNext();) {
68 | var e = it.next();
69 | if (new String(e.getValue()).length() > 0) {
70 | request_params.append("&").append(e.getKey()).append("=").append(e.getValue());
71 | }
72 | }
73 | var url = request_url + "?" + request_params.toString().substring(1);
74 |
75 | return new URI(url).toString();
76 | }
--------------------------------------------------------------------------------
/src/main/webapp/Html/js/libs/url/cmg.open.url.builder.ehub.js:
--------------------------------------------------------------------------------
1 | var MessageDigest = java.security.MessageDigest;
2 | var String = java.lang.String;
3 | var StringBuffer = java.lang.StringBuffer;
4 | var Integer = java.lang.Integer;
5 | var Hashtable = java.util.Hashtable;
6 | var Iteractor = java.util.Iteractor;
7 | var DecimalFormat = java.text.DecimalFormat;
8 | var URI = org.apache.commons.httpclient.URI;
9 | var TreeMap = java.util.TreeMap;
10 | var Date = java.util.Date;
11 |
12 | function EHubRESTAPI(treeMap){
13 | this.ht = treeMap;
14 | }
15 |
16 | EHubRESTAPI.prototype.put = function (key, value) {
17 | this.ht.put(key, value);
18 | }
19 |
20 | EHubRESTAPI.prototype.encrypt = function (app_secret) {
21 | var orgin = new StringBuffer();
22 | orgin.append(app_secret);
23 |
24 | var map = new TreeMap();
25 | map.putAll(this.ht);
26 |
27 | var iter = map.keySet().iterator();
28 | while (iter.hasNext()) {
29 | var name = String.valueOf(iter.next());
30 | if (new String(map.get(name)).length() > 0) {
31 | orgin.append(name).append(map.get(name));
32 | }
33 | }
34 |
35 | orgin.append(app_secret);
36 |
37 | // get the md5 digest algorithm
38 | var algorithm = MessageDigest.getInstance("MD5");
39 |
40 | // get the input as bytes
41 | var bytes = new String(orgin).getBytes("UTF-8");
42 |
43 | // calculate the digest
44 | algorithm.reset();
45 | algorithm.update(bytes);
46 | var md5Digest = algorithm.digest();
47 |
48 | // turn the digest into a hex-string representation
49 | var hexString = new StringBuffer();
50 |
51 | for (var i = 0; i < md5Digest.length; i++){
52 | var hex = Integer.toHexString(md5Digest[i] & 0XFF);
53 | if (hex.length() == 1){
54 | hexString.append('0').append("");
55 | }
56 | hexString.append(hex);
57 | }
58 |
59 | // write output value
60 | var sign = hexString.toString().toUpperCase();
61 | return sign
62 | }
63 |
64 | EHubRESTAPI.prototype.URLEncode = function (ru, rp) {
65 | var request_url = ru;
66 | var request_params = rp;
67 | for (var it = this.ht.entrySet().iterator(); it.hasNext();) {
68 | var e = it.next();
69 | if (new String(e.getValue()).length() > 0) {
70 | request_params.append("&").append(e.getKey()).append("=").append(e.getValue());
71 | }
72 | }
73 | var url = request_url + "?" + request_params.toString().substring(1);
74 |
75 | return new URI(url).toString();
76 | }
--------------------------------------------------------------------------------
/src/main/java/org/ukettle/service/router/entity/Message.java:
--------------------------------------------------------------------------------
1 | package org.ukettle.service.router.entity;
2 |
3 |
4 | import com.thoughtworks.xstream.annotations.XStreamAlias;
5 | import org.ukettle.basics.base.entity.BaseEntity;
6 | import org.ukettle.www.xstream.annotations.XStream2Field;
7 |
8 | @XStreamAlias("response")
9 | public class Message extends BaseEntity {
10 |
11 | private static final long serialVersionUID = 3668575797512981091L;
12 |
13 | @XStreamAlias("code")
14 | @XStream2Field
15 | private String code;
16 | @XStreamAlias("message")
17 | @XStream2Field
18 | private String message;
19 |
20 | public Message() {
21 | }
22 |
23 | public Message(Error code) {
24 | this.code = String.valueOf(code.getKey());
25 | this.message = code.getMessage();
26 | }
27 |
28 | public Message(Error code, String message) {
29 | this.code = String.valueOf(code.getKey());
30 | this.message = message;
31 | }
32 |
33 | public String getCode() {
34 | return code;
35 | }
36 |
37 | public void setCode(String code) {
38 | this.code = code;
39 | }
40 |
41 | public String getMessage() {
42 | return message;
43 | }
44 |
45 | public void setMessage(String message) {
46 | this.message = message;
47 | }
48 |
49 | public enum Error {
50 | /** 访问权限 */
51 | ACCESS_VALID_FAIL(100, "Authentication Failed"),
52 | ACCESS_VALID_ERROR(101, "Permission Error"),
53 | /** 系统权限 */
54 | SYSTEM_VALID_USER(200, "Uknown User"),
55 | SYSTEM_VALID_ERROR(201,"Unknown Error"),
56 | /** API业务参数 */
57 | API_MISSING_PARAMS(300, "Missing Parameter"),
58 | API_MISSING_ID(201,"Missing id"),
59 | API_MISSING_SIGNATURE(302, "Missing signature"),
60 | API_MISSING_TIMESTAMP(303, "Missing timestamp"),
61 | API_INVALID_TIMESTAMP(304, "Invalid timestamp"),
62 | API_VALID_FAIL(305, "Valid Fail"),
63 | /** 其他参数 */
64 | ERROR(0, "service error"), UNKNOWN(-1, "unknown error");
65 | final int key;
66 | final String message;
67 |
68 | private Error(int key, String message) {
69 | this.key = key;
70 | this.message = message;
71 | }
72 |
73 | public static Error getErrorCode(int key) {
74 | for (Error err : values()) {
75 | if (err.key == key)
76 | return err;
77 | }
78 | return UNKNOWN;
79 | }
80 |
81 | public int getKey() {
82 | return key;
83 | }
84 |
85 | public String getMessage() {
86 | return message;
87 | }
88 | }
89 |
90 | }
--------------------------------------------------------------------------------
/src/main/java/org/ukettle/widget/kettle/ibatis/KettleLogs.Mapper.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
7 | insert into K_LOGS (
8 | id
9 | , mid
10 | , logs
11 | , creator
12 | , created
13 | )
14 | values (
15 | #{id},
16 | #{mid},
17 | #{logs},
18 | #{creator},
19 | #{created}
20 | )
21 |
22 |
23 |
24 | delete from K_LOGS where mid = #{mid}
25 |
26 |
27 |
28 | update K_LOGS
29 |
30 |
31 | logs = #{logs},
32 |
33 |
34 | mid = #{mid},
35 |
36 |
37 | creator = #{creator},
38 |
39 |
40 | created = #{created}
41 |
42 |
43 | where id = #{id}
44 |
45 |
46 |
64 |
65 |
93 |
94 |
--------------------------------------------------------------------------------
/src/main/java/org/ukettle/basics/page/dialect/db/HSQLDialect.java:
--------------------------------------------------------------------------------
1 | package org.ukettle.basics.page.dialect.db;
2 |
3 | import java.util.List;
4 |
5 | import org.ukettle.basics.page.Sorting;
6 | import org.ukettle.basics.page.dialect.Dialect;
7 | import org.ukettle.basics.page.plugin.BaseParameter;
8 |
9 |
10 | /**
11 | * Dialect for HSQLDB
12 | *
13 | * @author Kimi Liu
14 | * @Date Aug 19, 2014
15 | * @Time 10:23:45
16 | * @email 839536@QQ.com
17 | * @version 1.0
18 | * @since JDK 1.6
19 | */
20 | public class HSQLDialect implements Dialect {
21 | @Override
22 | public boolean limit() {
23 | return true;
24 | }
25 |
26 | @Override
27 | public String getLimit(String sql, int offset, int limit) {
28 | return getLimit(sql, offset, Integer.toString(offset),
29 | Integer.toString(limit));
30 | }
31 |
32 | /**
33 | * 将sql变成分页sql语句,提供将offset及limit使用占位符号(placeholder)替换.
34 | *
35 | *
36 | * 如mysql
37 | * dialect.getLimit("select * from user", 12, ":offset",0,":limit") 将返回
38 | * select * from user limit :offset,:limit
39 | *
40 | *
41 | * @param sql
42 | * 实际SQL语句
43 | * @param offset
44 | * 分页开始纪录条数
45 | * @param offsetPlaceholder
46 | * 分页开始纪录条数-占位符号
47 | * @param limitPlaceholder
48 | * 分页纪录条数占位符号
49 | * @return 包含占位符的分页sql
50 | */
51 | public String getLimit(String sql, int offset, String offsetPlaceholder,
52 | String limitPlaceholder) {
53 | boolean hasOffset = offset > 0;
54 | return new StringBuffer(sql.length() + 10)
55 | .append(sql)
56 | .insert(sql.toLowerCase().indexOf("select") + 6,
57 | hasOffset ? " limit " + offsetPlaceholder + " "
58 | + limitPlaceholder : " top " + limitPlaceholder)
59 | .toString();
60 | }
61 |
62 | @Override
63 | public String getCount(String sql) {
64 | return "select count(1) from (" + BaseParameter.removeOrders(sql)
65 | + ") as dialect";
66 | }
67 |
68 | @Override
69 | public String getSort(String sql, List sort) {
70 | if (sort == null || sort.isEmpty()) {
71 | return sql;
72 | }
73 | StringBuffer buffer = new StringBuffer("select * from (").append(sql)
74 | .append(") dialect order by ");
75 | for (Sorting s : sort) {
76 | buffer.append(s.getColumn()).append(" ").append(s.getSort())
77 | .append(", ");
78 | }
79 | buffer.delete(buffer.length() - 2, buffer.length());
80 | return buffer.toString();
81 | }
82 |
83 | }
--------------------------------------------------------------------------------
/src/main/java/org/ukettle/basics/page/dialect/db/PostgreSQLDialect.java:
--------------------------------------------------------------------------------
1 | package org.ukettle.basics.page.dialect.db;
2 |
3 | import java.util.List;
4 |
5 | import org.ukettle.basics.page.Sorting;
6 | import org.ukettle.basics.page.dialect.Dialect;
7 | import org.ukettle.basics.page.plugin.BaseParameter;
8 |
9 |
10 | /**
11 | * Postgre Sql的方言实现
12 | *
13 | * @author Kimi Liu
14 | * @Date Aug 17, 2014
15 | * @Time 12:01:31
16 | * @email 839536@QQ.com
17 | * @version 1.0
18 | * @since JDK 1.6
19 | */
20 | public class PostgreSQLDialect implements Dialect {
21 |
22 | public boolean limit() {
23 | return true;
24 | }
25 |
26 | @Override
27 | public String getLimit(String sql, int offset, int limit) {
28 | return getLimit(sql, offset, Integer.toString(offset),
29 | Integer.toString(limit));
30 | }
31 |
32 | /**
33 | * 将sql变成分页sql语句,提供将offset及limit使用占位符号(placeholder)替换.
34 | *
35 | *
36 | * 如mysql
37 | * dialect.getLimit("select * from user", 12, ":offset",0,":limit") 将返回
38 | * select * from user limit :offset,:limit
39 | *
40 | *
41 | * @param sql
42 | * 实际SQL语句
43 | * @param offset
44 | * 分页开始纪录条数
45 | * @param offsetPlaceholder
46 | * 分页开始纪录条数-占位符号
47 | * @param limitPlaceholder
48 | * 分页纪录条数占位符号
49 | * @return 包含占位符的分页sql
50 | */
51 | public String getLimit(String sql, int offset, String offsetPlaceholder,
52 | String limitPlaceholder) {
53 | StringBuilder pageSql = new StringBuilder().append(sql);
54 | pageSql = offset <= 0 ? pageSql.append(" limit ").append(
55 | limitPlaceholder) : pageSql.append(" limit ")
56 | .append(limitPlaceholder).append(" offset ")
57 | .append(offsetPlaceholder);
58 | return pageSql.toString();
59 | }
60 |
61 | @Override
62 | public String getCount(String sql) {
63 | return "select count(1) from (" + BaseParameter.removeOrders(sql)
64 | + ") as dialect";
65 | }
66 |
67 | @Override
68 | public String getSort(String sql, List sort) {
69 | if (sort == null || sort.isEmpty()) {
70 | return sql;
71 | }
72 | StringBuffer buffer = new StringBuffer("select * from (").append(sql)
73 | .append(") dialect order by ");
74 | for (Sorting s : sort) {
75 | buffer.append(s.getColumn()).append(" ").append(s.getSort())
76 | .append(", ");
77 | }
78 | buffer.delete(buffer.length() - 2, buffer.length());
79 | return buffer.toString();
80 | }
81 |
82 | }
--------------------------------------------------------------------------------
/src/main/java/org/ukettle/basics/shiro/extend/filter/Authentication2Filter.java:
--------------------------------------------------------------------------------
1 | package org.ukettle.basics.shiro.extend.filter;
2 |
3 | import javax.servlet.ServletRequest;
4 | import javax.servlet.ServletResponse;
5 | import javax.servlet.http.HttpServletRequest;
6 |
7 | import org.apache.shiro.SecurityUtils;
8 | import org.apache.shiro.session.Session;
9 | import org.apache.shiro.subject.Subject;
10 | import org.apache.shiro.web.filter.authc.AuthenticationFilter;
11 | import org.apache.shiro.web.util.SavedRequest;
12 | import org.apache.shiro.web.util.WebUtils;
13 |
14 | import org.ukettle.basics.shiro.extend.web.Saved2Request;
15 |
16 |
17 | public class Authentication2Filter extends AuthenticationFilter {
18 |
19 | protected boolean isAccessAllowed(ServletRequest request,
20 | ServletResponse response, Object mappedValue) {
21 | Subject subject = getSubject(request, response);
22 | return subject.isAuthenticated();
23 | }
24 |
25 | protected boolean onAccessDenied(ServletRequest request,
26 | ServletResponse response) throws Exception {
27 | String backUrl = request.getParameter("backUrl");
28 | saveRequest(request, backUrl,
29 | getDefaultBackUrl(WebUtils.toHttp(request)));
30 | return false;
31 | }
32 |
33 | protected void saveRequest(ServletRequest request, String backUrl,
34 | String fallbackUrl) {
35 | Subject subject = SecurityUtils.getSubject();
36 | Session session = subject.getSession();
37 | HttpServletRequest httpRequest = WebUtils.toHttp(request);
38 | session.setAttribute("authc.fallbackUrl", fallbackUrl);
39 | SavedRequest savedRequest = new Saved2Request(httpRequest, backUrl);
40 | session.setAttribute(WebUtils.SAVED_REQUEST_KEY, savedRequest);
41 | }
42 |
43 | private String getDefaultBackUrl(HttpServletRequest request) {
44 | String scheme = request.getScheme();
45 | String domain = request.getServerName();
46 | int port = request.getServerPort();
47 | String contextPath = request.getContextPath();
48 | StringBuilder backUrl = new StringBuilder(scheme);
49 | backUrl.append("://");
50 | backUrl.append(domain);
51 | if ("http".equalsIgnoreCase(scheme) && port != 80) {
52 | backUrl.append(":").append(String.valueOf(port));
53 | } else if ("https".equalsIgnoreCase(scheme) && port != 443) {
54 | backUrl.append(":").append(String.valueOf(port));
55 | }
56 | backUrl.append(contextPath);
57 | backUrl.append(getSuccessUrl());
58 | return backUrl.toString();
59 | }
60 | }
--------------------------------------------------------------------------------
/src/main/java/org/ukettle/basics/page/dialect/db/MySQLDialect.java:
--------------------------------------------------------------------------------
1 | package org.ukettle.basics.page.dialect.db;
2 |
3 | import java.util.List;
4 |
5 | import org.ukettle.basics.page.Sorting;
6 | import org.ukettle.basics.page.dialect.Dialect;
7 | import org.ukettle.basics.page.plugin.BaseParameter;
8 |
9 |
10 | /**
11 | * Mysql方言的实现
12 | *
13 | * @author Kimi Liu
14 | * @Date Aug 16, 2014
15 | * @Time 11:12:31
16 | * @email 839536@QQ.com
17 | * @version 1.0
18 | * @since JDK 1.6
19 | */
20 | public class MySQLDialect implements Dialect {
21 |
22 | public boolean limit() {
23 | return true;
24 | }
25 |
26 | @Override
27 | public String getLimit(String sql, int offset, int limit) {
28 | return getLimit(sql, offset, Integer.toString(offset),
29 | Integer.toString(limit));
30 | }
31 |
32 | /**
33 | * 将sql变成分页sql语句,提供将offset及limit使用占位符号(placeholder)替换.
34 | *
35 | *
36 | * 如mysql
37 | * dialect.getLimit("select * from user", 12, ":offset",0,":limit") 将返回
38 | * select * from user limit :offset,:limit
39 | *
40 | *
41 | * @param sql
42 | * 实际SQL语句
43 | * @param offset
44 | * 分页开始纪录条数
45 | * @param offsetPlaceholder
46 | * 分页开始纪录条数-占位符号
47 | * @param limitPlaceholder
48 | * 分页纪录条数占位符号
49 | * @return 包含占位符的分页sql
50 | */
51 | public String getLimit(String sql, int offset, String offsetPlaceholder,
52 | String limitPlaceholder) {
53 | StringBuilder stringBuilder = new StringBuilder(sql);
54 | stringBuilder.append(" limit ");
55 | if (offset > 0) {
56 | stringBuilder.append(offsetPlaceholder).append(",")
57 | .append(limitPlaceholder);
58 | } else {
59 | stringBuilder.append(limitPlaceholder);
60 | }
61 | return stringBuilder.toString();
62 | }
63 |
64 | @Override
65 | public String getCount(String sql) {
66 | return "select count(1) from (" + BaseParameter.removeOrders(sql)
67 | + ") as dialect";
68 | }
69 |
70 | @Override
71 | public String getSort(String sql, List sort) {
72 | if (sort == null || sort.isEmpty()) {
73 | return sql;
74 | }
75 | StringBuffer buffer = new StringBuffer("select * from (").append(sql)
76 | .append(") dialect order by ");
77 | for (Sorting s : sort) {
78 | buffer.append(s.getColumn()).append(" ").append(s.getSort())
79 | .append(", ");
80 | }
81 | buffer.delete(buffer.length() - 2, buffer.length());
82 | return buffer.toString();
83 | }
84 |
85 | }
--------------------------------------------------------------------------------
/src/main/webapp/Html/js/libs/url/cmg.open.url.builder.dangdang.js:
--------------------------------------------------------------------------------
1 | var MessageDigest = java.security.MessageDigest;
2 | var String = java.lang.String;
3 | var StringBuffer = java.lang.StringBuffer;
4 | var Integer = java.lang.Integer;
5 | var Hashtable = java.util.Hashtable;
6 | var Iteractor = java.util.Iteractor;
7 | var DecimalFormat = java.text.DecimalFormat;
8 | var URI = org.apache.commons.httpclient.URI;
9 | var TreeMap = java.util.TreeMap;
10 | var Date = java.util.Date;
11 |
12 | function DangDangRESTAPI(baseURL, method, treeMap){
13 | this.baseURL = baseURL;
14 | this.method = method;
15 | this.ht = treeMap;
16 | }
17 |
18 | DangDangRESTAPI.prototype.put = function (key, value) {
19 | this.ht.put(key, value);
20 | }
21 |
22 | DangDangRESTAPI.prototype.encrypt = function (app_secret) {
23 | var orgin = new StringBuffer();
24 |
25 | var map = new TreeMap();
26 | map.putAll(this.ht);
27 |
28 | //append value for each key
29 | var iter = map.keySet().iterator();
30 | while (iter.hasNext()) {
31 | var name = String.valueOf(iter.next());
32 | if (new String(map.get(name)).length() > 0) {
33 | orgin.append(map.get(name));
34 | }
35 | }
36 |
37 | orgin.append(app_secret);
38 |
39 | // get the md5 digest algorithm
40 | var algorithm = MessageDigest.getInstance("MD5");
41 |
42 | // get the input as bytes
43 | var bytes = new String(orgin).getBytes("UTF-8");
44 |
45 | // calculate the digest
46 | algorithm.reset();
47 | algorithm.update(bytes);
48 | var md5Digest = algorithm.digest();
49 |
50 | // turn the digest into a hex-string representation
51 | var hexString = new StringBuffer();
52 |
53 | for (var i = 0; i < md5Digest.length; i++){
54 | var hex = Integer.toHexString(md5Digest[i] & 0XFF);
55 | if (hex.length() == 1){
56 | hexString.append('0').append("");
57 | }
58 | hexString.append(hex);
59 | }
60 |
61 | // write output value
62 | var sign = hexString.toString();
63 | return sign
64 | }
65 |
66 | DangDangRESTAPI.prototype.URLEncode = function (rp) {
67 | var request_params = rp;
68 | for (var it = this.ht.entrySet().iterator(); it.hasNext();) {
69 | var e = it.next();
70 | if (new String(e.getValue()).length() > 0) {
71 | request_params.append("&").append(e.getKey()).append("=").append(e.getValue());
72 | }
73 | }
74 | var url = this.baseURL + "/" + this.method + ".php?" + request_params.toString().substring(1);
75 |
76 | return new URI(url).toString();
77 | }
--------------------------------------------------------------------------------
/src/main/java/org/ukettle/basics/page/dialect/Client.java:
--------------------------------------------------------------------------------
1 | package org.ukettle.basics.page.dialect;
2 |
3 | import java.io.Serializable;
4 | import java.util.HashMap;
5 | import java.util.Map;
6 |
7 | import org.ukettle.basics.page.dialect.db.DB2Dialect;
8 | import org.ukettle.basics.page.dialect.db.H2Dialect;
9 | import org.ukettle.basics.page.dialect.db.HSQLDialect;
10 | import org.ukettle.basics.page.dialect.db.MySQLDialect;
11 | import org.ukettle.basics.page.dialect.db.OracleDialect;
12 | import org.ukettle.basics.page.dialect.db.PostgreSQLDialect;
13 | import org.ukettle.basics.page.dialect.db.SQLServer2005Dialect;
14 | import org.ukettle.basics.page.dialect.db.SQLServerDialect;
15 | import org.ukettle.basics.page.dialect.db.SybaseDialect;
16 |
17 |
18 | /**
19 | * @author Kimi Liu
20 | * @Date Apr 19, 2014
21 | * @Time 10:21:33
22 | * @email 839536@QQ.com
23 | * @version 1.0
24 | * @since JDK 1.6
25 | */
26 | public class Client implements Serializable {
27 | private static final long serialVersionUID = 8107330250767760951L;
28 | private static final Map DB_DIALECT = new HashMap();
29 |
30 | /**
31 | * 根据数据库名称获取数据库分页查询的方言实现。
32 | *
33 | * @param db
34 | * 数据库名称
35 | * @return 数据库分页方言实现
36 | */
37 | public static Dialect getDialect(DB db) {
38 | if (DB_DIALECT.containsKey(db)) {
39 | return DB_DIALECT.get(db);
40 | }
41 | Dialect dialect = createDialect(db);
42 | DB_DIALECT.put(db, dialect);
43 | return dialect;
44 | }
45 |
46 | /**
47 | * 插入自定义方言的实例
48 | *
49 | * @param exDialect
50 | * 方言实现
51 | */
52 | public static void putEx(Dialect exDialect) {
53 | DB_DIALECT.put(DB.EX, exDialect);
54 | }
55 |
56 | /**
57 | * 创建数据库方言
58 | *
59 | * @param db
60 | * 数据库
61 | * @return 数据库
62 | */
63 | private static Dialect createDialect(DB db) {
64 | switch (db) {
65 | case MYSQL:
66 | return new MySQLDialect();
67 | case ORACLE:
68 | return new OracleDialect();
69 | case DB2:
70 | return new DB2Dialect();
71 | case POSTGRE:
72 | return new PostgreSQLDialect();
73 | case SQLSERVER:
74 | return new SQLServerDialect();
75 | case SQLSERVER2005:
76 | return new SQLServer2005Dialect();
77 | case SYBASE:
78 | return new SybaseDialect();
79 | case H2:
80 | return new H2Dialect();
81 | case HSQL:
82 | return new HSQLDialect();
83 | default:
84 | throw new UnsupportedOperationException("Empty db dialect");
85 | }
86 | }
87 |
88 | }
--------------------------------------------------------------------------------
/src/main/java/org/ukettle/basics/page/dialect/db/SQLServerDialect.java:
--------------------------------------------------------------------------------
1 | package org.ukettle.basics.page.dialect.db;
2 |
3 | import java.util.List;
4 |
5 | import org.ukettle.basics.page.Sorting;
6 | import org.ukettle.basics.page.dialect.Dialect;
7 | import org.ukettle.basics.page.plugin.BaseParameter;
8 |
9 |
10 | /**
11 | * MSSQLServer 数据库实现分页方言
12 | *
13 | * @author Kimi Liu
14 | * @Date Aug 17, 2014
15 | * @Time 11:09:56
16 | * @email 839536@QQ.com
17 | * @version 1.0
18 | * @since JDK 1.6
19 | */
20 | public class SQLServerDialect implements Dialect {
21 |
22 | public boolean limit() {
23 | return true;
24 | }
25 |
26 | static int getAfterSelectInsertPoint(String sql) {
27 | int selectIndex = sql.toLowerCase().indexOf("select");
28 | final int selectDistinctIndex = sql.toLowerCase().indexOf(
29 | "select distinct");
30 | return selectIndex + (selectDistinctIndex == selectIndex ? 15 : 6);
31 | }
32 |
33 | public String getLimitString(String sql, int offset, int limit) {
34 | return getLimit(sql, offset, limit);
35 | }
36 |
37 | /**
38 | * 将sql变成分页sql语句,提供将offset及limit使用占位符号(placeholder)替换.
39 | *
40 | *
41 | * 如mysql
42 | * dialect.getLimit("select * from user", 12, ":offset",0,":limit") 将返回
43 | * select * from user limit :offset,:limit
44 | *
45 | *
46 | * @param sql
47 | * 实际SQL语句
48 | * @param offset
49 | * 分页开始纪录条数
50 | * @param limit
51 | * 分页每页显示纪录条数
52 | * @return 包含占位符的分页sql
53 | */
54 | public String getLimit(String sql, int offset, int limit) {
55 | if (offset > 0) {
56 | throw new UnsupportedOperationException("sql server has no offset");
57 | }
58 | return new StringBuffer(sql.length() + 8).append(sql)
59 | .insert(getAfterSelectInsertPoint(sql), " top " + limit)
60 | .toString();
61 | }
62 |
63 | @Override
64 | public String getCount(String sql) {
65 | return "select count(1) from (" + BaseParameter.removeOrders(sql)
66 | + ") as dialect";
67 | }
68 |
69 | @Override
70 | public String getSort(String sql, List sort) {
71 | if (sort == null || sort.isEmpty()) {
72 | return sql;
73 | }
74 | StringBuffer buffer = new StringBuffer("select * from (").append(sql)
75 | .append(") dialect order by ");
76 | for (Sorting s : sort) {
77 | buffer.append(s.getColumn()).append(" ").append(s.getSort())
78 | .append(", ");
79 | }
80 | buffer.delete(buffer.length() - 2, buffer.length());
81 | return buffer.toString();
82 | }
83 |
84 | }
--------------------------------------------------------------------------------
/src/main/webapp/Html/js/libs/url/cmg.open.url.builder.amazon.js:
--------------------------------------------------------------------------------
1 | var String = java.lang.String;
2 | var StringBuffer = java.lang.StringBuffer;
3 | var Integer = java.lang.Integer;
4 | var Hashtable = java.util.Hashtable;
5 | var Iteractor = java.util.Iteractor;
6 | var TreeMap = java.util.TreeMap;
7 | var Date = java.util.Date;
8 | var Mac = javax.crypto.Mac;
9 | var SecretKeySpec = javax.crypto.spec.SecretKeySpec;
10 | var Base64 = org.apache.commons.codec.binary.Base64;
11 | var URLEncoder = java.net.URLEncoder;
12 |
13 |
14 | function AmazonRESTAPI(treeMap){
15 | this.ht = treeMap;
16 | }
17 |
18 | AmazonRESTAPI.prototype.put = function (key, value) {
19 | this.ht.put(key, value);
20 | }
21 |
22 | AmazonRESTAPI.prototype.encrypt = function (url, method, version, app_secret) {
23 | var orgin = new StringBuffer();
24 | orgin.append("POST\n");
25 | orgin.append(url+"\n");
26 | orgin.append("/"+method+"/"+version+"\n");
27 |
28 |
29 | var map = new TreeMap();
30 | map.putAll(this.ht);
31 |
32 | var iter = map.keySet().iterator();
33 | var i = 0;
34 | while (iter.hasNext()) {
35 | var name = String.valueOf(iter.next());
36 | if (new String(map.get(name)).length() > 0) {
37 | if (i > 0){
38 | orgin.append("&").append(name).append("=" + URLEncoder.encode(map.get(name),"utf-8"));
39 | } else {
40 | orgin.append(name).append("=" + URLEncoder.encode(map.get(name),"utf-8"));
41 | i = i + 1;
42 | }
43 | }
44 | }
45 | //Alert(new String(orgin));
46 | //var sign = CryptoJS.HmacSHA256("abc", "dJ9CtVeqWTKXsnqzavUf+AQTOnRqA+0EzPVWN2t1");
47 | //Alert(new String(app_secret));
48 | var sha256_HMAC = Mac.getInstance("HmacSHA256");
49 | var secret_key = new SecretKeySpec(new String(app_secret).getBytes(), new String("HmacSHA256"));
50 | sha256_HMAC.init(secret_key);
51 | var sign = sha256_HMAC.doFinal(new String(orgin).getBytes());
52 |
53 | var signBase64 = new Base64().encodeBase64(new String(sign).getBytes());
54 |
55 | return new String(signBase64);
56 | }
57 |
58 | AmazonRESTAPI.prototype.URLEncode = function (ru, rp) {
59 | var request_url = ru;
60 | var request_params = rp;
61 | for (var it = this.ht.entrySet().iterator(); it.hasNext();) {
62 | var e = it.next();
63 | if (new String(e.getValue()).length() > 0) {
64 | request_params.append("&").append(e.getKey()).append("=").append(URLEncoder.encode(e.getValue(),"utf-8"));
65 | }
66 | }
67 | var url = request_url + "?" + request_params.toString().substring(1);
68 | return url;
69 | }
--------------------------------------------------------------------------------
/src/main/java/org/ukettle/system/service/impl/UserServiceImpl.java:
--------------------------------------------------------------------------------
1 | package org.ukettle.system.service.impl;
2 |
3 | import java.util.List;
4 |
5 | import org.springframework.beans.factory.annotation.Autowired;
6 | import org.springframework.dao.DataAccessException;
7 | import org.springframework.stereotype.Service;
8 | import org.ukettle.basics.shiro.entity.Shiro;
9 | import org.ukettle.engine.loader.BasicMapper;
10 | import org.ukettle.system.entity.User;
11 | import org.ukettle.system.service.UserService;
12 | import org.ukettle.www.toolkit.DateUtils;
13 | import org.ukettle.www.toolkit.Encode;
14 | import org.ukettle.www.toolkit.ObjectID;
15 | import org.ukettle.www.toolkit.Random;
16 |
17 |
18 | @Service
19 | public class UserServiceImpl implements UserService {
20 |
21 | @Autowired
22 | private BasicMapper mapper;
23 |
24 | @Override
25 | public Object insert(T entity) throws DataAccessException {
26 | if (null != entity) {
27 | entity.setId(ObjectID.id());
28 | entrypt(entity);
29 | entity.setCreator(Shiro.get().getEmail());
30 | entity.setCreated(DateUtils.getTime24());
31 | if (((Integer) mapper.iUserMapper.insert(entity)) > 0) {
32 | return entity.getId();
33 | }
34 | }
35 | return null;
36 | }
37 |
38 | @Override
39 | public Object update(T entity) throws DataAccessException {
40 | if (null != entity) {
41 | entrypt(entity);
42 | if (((Integer) mapper.iUserMapper.update(entity)) > 0) {
43 | return entity.getId();
44 | }
45 | }
46 | return null;
47 | }
48 |
49 | @Override
50 | public Object delete(String id) throws DataAccessException {
51 | if (null != id && !"".equals(id)) {
52 | if (((Integer) mapper.iUserMapper.delete(id)) > 0) {
53 | return id;
54 | }
55 | }
56 | return null;
57 | }
58 |
59 | @Override
60 | public Object select(T entity) throws DataAccessException {
61 | if (null != entity) {
62 | return mapper.iUserMapper.select(entity);
63 | }
64 | return null;
65 | }
66 |
67 | @Override
68 | public List> selectByWhere(T entity) throws DataAccessException {
69 | if (null != entity) {
70 | return mapper.iUserMapper.selectByWhere(entity);
71 | }
72 | return null;
73 | }
74 |
75 | private void entrypt(T entity) {
76 | byte[] random = Random.generate(Random.CODE_SIZE);
77 | entity.setRandom(Encode.encodeHex(random));
78 | byte[] password = Random.sha1(entity.getPassword().getBytes(), random,
79 | Random.ITERATION);
80 | entity.setPassword(Encode.encodeHex(password));
81 | }
82 |
83 | }
--------------------------------------------------------------------------------
/src/main/webapp/WEB-INF/iPage/Widget/Kettle/Spoon/tree.jsp:
--------------------------------------------------------------------------------
1 | <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><%@ include file="../../../Comm/tags.jsp"%>
2 |
3 |
4 |
5 |
6 |
7 | <%@ include file="../../../Comm/resource.jsp"%>
8 |
9 |
10 |
91 |
92 |
93 |
--------------------------------------------------------------------------------
/src/main/java/org/ukettle/basics/page/proxy/Pagination.java:
--------------------------------------------------------------------------------
1 | package org.ukettle.basics.page.proxy;
2 |
3 | import org.apache.ibatis.session.RowBounds;
4 |
5 | import java.util.Collections;
6 | import java.util.List;
7 |
8 | /**
9 | *
10 | * 分页对象.
11 | *
12 | *
13 | * @author Kimi Liu
14 | * @Date Aug 22, 2014
15 | * @Time 10:21:21
16 | * @email 839536@QQ.com
17 | * @version 1.0
18 | * @since JDK 1.6
19 | */
20 | public class Pagination {
21 |
22 | private long total;
23 | private int page;
24 | private int offset;
25 | private int limit;
26 | private int pageSize;
27 |
28 | private List datas = Collections.emptyList();
29 |
30 | public Pagination() {
31 | this(1, 15);
32 | }
33 |
34 | public Pagination(int page) {
35 | this(page, 15);
36 | }
37 |
38 | public Pagination(int page, int limit) {
39 | setPage(page);
40 | setLimit(limit);
41 | }
42 |
43 | public Pagination(RowBounds rowBounds) {
44 | this.limit = rowBounds.getLimit();
45 | this.offset = rowBounds.getOffset();
46 | this.page = offset / limit + 1;
47 | }
48 |
49 | public void setPage(int page) {
50 | if (page < 0) {
51 | page = 1;
52 | }
53 | this.page = page;
54 | onInit();
55 | }
56 |
57 | public void setLimit(int limit) {
58 | if (limit < 1) {
59 | limit = 15;
60 | }
61 | this.limit = limit;
62 | onInit();
63 | }
64 |
65 | protected void onInit() {
66 | offset = (page - 1) * limit;
67 | }
68 |
69 | protected void onSetRowsize() {
70 | pageSize = (int) (total / limit);
71 | if (total % limit > 0) {
72 | pageSize++;
73 | }
74 | if (page > pageSize) {
75 | page = pageSize;
76 | onInit();
77 | }
78 | }
79 |
80 | protected void onSetList() {
81 | if (datas == null || datas.isEmpty()) {
82 | total = 0;
83 | page = 1;
84 | offset = 0;
85 | }
86 | }
87 |
88 | public long getTotal() {
89 | return total;
90 | }
91 |
92 | public void setTotal(long rowSize) {
93 | this.total = rowSize;
94 | onSetRowsize();
95 | }
96 |
97 | public int getPageSize() {
98 | return pageSize;
99 | }
100 |
101 | public List getDatas() {
102 | return datas;
103 | }
104 |
105 | public void setDatas(List datas) {
106 | this.datas = datas;
107 | onSetList();
108 | }
109 |
110 | public int getOffset() {
111 | return offset;
112 | }
113 |
114 | public int getLimit() {
115 | return limit;
116 | }
117 |
118 | public int getPage() {
119 | return page;
120 | }
121 |
122 | }
--------------------------------------------------------------------------------
/src/main/resources/sqlMapConfig.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
--------------------------------------------------------------------------------
/src/main/java/org/ukettle/service/execute/KettleExecService.java:
--------------------------------------------------------------------------------
1 | package org.ukettle.service.execute;
2 |
3 | import org.quartz.JobExecutionContext;
4 | import org.quartz.JobExecutionException;
5 | import org.springframework.beans.factory.annotation.Autowired;
6 | import org.springframework.scheduling.quartz.QuartzJobBean;
7 | import org.ukettle.engine.loader.BasicService;
8 | import org.ukettle.widget.kettle.entity.KettleSpoon;
9 | import org.ukettle.www.toolkit.Constant;
10 | import org.ukettle.www.toolkit.DateUtils;
11 |
12 | /**
13 | *
14 | * 简单的实现了Spring QuartzJobBean接口
15 | *
16 | *
17 | * @author Kimi Liu
18 | * @Date Mar 12, 2014
19 | * @Time 10:27:31
20 | * @email 839536@QQ.com
21 | * @version 1.0
22 | * @since JDK 1.6
23 | */
24 | public class KettleExecService extends QuartzJobBean {
25 |
26 | @Autowired
27 | private BasicService service;
28 |
29 | /**
30 | * 执行实际任务
31 | *
32 | * @see execute
33 | */
34 | @Override
35 | protected void executeInternal(JobExecutionContext context)
36 | throws JobExecutionException {
37 | KettleSpoon entity = new KettleSpoon();
38 | // 获取定时任务中的所有参数
39 | for (Object key : context.getJobDetail().getJobDataMap().keySet()) {
40 | String strVal = context.getJobDetail().getJobDataMap().get(key)
41 | .toString();
42 | // 根据定时任务参数封装Kettle所需参数
43 | setValue(key.toString(), strVal, entity);
44 | }
45 | entity.setTid(context.getJobDetail().getKey().toString());
46 | execute(entity);
47 | }
48 |
49 | /**
50 | * 执行Kettle定时任务
51 | */
52 | private void execute(KettleSpoon entity) {
53 | if (null != entity && !"".equals(entity)) {
54 | service.iKettleSpoonService.execute((KettleSpoon) entity);
55 | }
56 | }
57 |
58 | /**
59 | * 封装Kettle定时任务等先关参数
60 | */
61 | private void setValue(String key, String strVal, KettleSpoon entity) {
62 | if (null != strVal) {
63 | if (strVal.startsWith(Constant.STARTS_WITH_USD)) {
64 | int minute = Integer.parseInt(strVal.split("\\"
65 | + Constant.STARTS_WITH_USD)[1]);
66 | strVal = DateUtils.isAssign(null, minute);
67 | // 判断是否为复合参数以"-param:"开始
68 | } else if (strVal.startsWith(Constant.STARTS_WITH_PARAM)) {
69 | String[] array = strVal.split(Constant.SPLIT_PARAM);
70 | for (int i = 1; i < array.length; i++) {
71 | // 分割字符,获取参数、参数值
72 | String[] val = array[i].split(Constant.SPLIT_EQUAL);
73 | if (val[1].startsWith(Constant.STARTS_WITH_USD)) {
74 | // 分割字符,判断是否为自定义日期
75 | int minute = Integer.parseInt(val[1].split("\\"
76 | + Constant.STARTS_WITH_USD)[1]
77 | .replace("@@", ""));
78 | String date = DateUtils.isAssign(null, minute);
79 | if (i + 1 != array.length) {
80 | date = date + "@@";
81 | }
82 | // 重新封装日期参数
83 | strVal = strVal.replace(val[1], date);
84 | }
85 | }
86 | }
87 | entity.setValue(key, strVal);
88 | }
89 | }
90 |
91 | }
--------------------------------------------------------------------------------
/src/main/java/org/ukettle/www/spring/SpringUtils.java:
--------------------------------------------------------------------------------
1 | package org.ukettle.www.spring;
2 |
3 | import org.springframework.beans.BeansException;
4 | import org.springframework.beans.factory.NoSuchBeanDefinitionException;
5 | import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
6 | import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
7 |
8 | /**
9 | * 功能描述:Spring上下文信息
10 | *
11 | * @author Kimi Liu
12 | * @Date Mar 10, 2014
13 | * @Time 21:20:25
14 | * @email 839536@QQ.com
15 | * @version 1.0
16 | * @since JDK 1.6
17 | */
18 | public final class SpringUtils implements BeanFactoryPostProcessor {
19 |
20 | // Spring应用上下文环境
21 | private static ConfigurableListableBeanFactory factory;
22 |
23 | @Override
24 | public void postProcessBeanFactory(
25 | ConfigurableListableBeanFactory beanFactory) throws BeansException {
26 | factory = beanFactory;
27 | }
28 |
29 | /**
30 | * 获取对象
31 | *
32 | * @param name
33 | * @return Object 一个以所给名字注册的bean的实例
34 | * @throws org.springframework.beans.BeansException
35 | *
36 | */
37 | @SuppressWarnings("all")
38 | public static T getBean(String name) throws BeansException {
39 | return (T) factory.getBean(name);
40 | }
41 |
42 | /**
43 | * 获取类型为requiredType的对象
44 | *
45 | * @param clz
46 | * @return
47 | * @throws org.springframework.beans.BeansException
48 | *
49 | */
50 | public static T getBean(Class clazz) throws BeansException {
51 | return (T) factory.getBean(clazz);
52 | }
53 |
54 | /**
55 | * 如果BeanFactory包含一个与所给名称匹配的bean定义,则返回true
56 | *
57 | * @param name
58 | * @return boolean
59 | */
60 | public static boolean containsBean(String name) {
61 | return factory.containsBean(name);
62 | }
63 |
64 | /**
65 | * 判断以给定名字注册的bean定义是一个singleton还是一个prototype。
66 | * 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException)
67 | *
68 | * @param name
69 | * @return boolean
70 | * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException
71 | *
72 | */
73 | public static boolean isSingleton(String name)
74 | throws NoSuchBeanDefinitionException {
75 | return factory.isSingleton(name);
76 | }
77 |
78 | /**
79 | * @param name
80 | * @return Class 注册对象的类型
81 | * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException
82 | *
83 | */
84 | public static Class> getType(String name)
85 | throws NoSuchBeanDefinitionException {
86 | return factory.getType(name);
87 | }
88 |
89 | /**
90 | * 如果给定的bean名字在bean定义中有别名,则返回这些别名
91 | *
92 | * @param name
93 | * @return
94 | * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException
95 | *
96 | */
97 | public static String[] getAliases(String name)
98 | throws NoSuchBeanDefinitionException {
99 | return factory.getAliases(name);
100 | }
101 |
102 | }
--------------------------------------------------------------------------------
/src/main/java/org/ukettle/www/toolkit/spring/SpringUtils.java:
--------------------------------------------------------------------------------
1 | package org.ukettle.www.toolkit.spring;
2 |
3 | import org.springframework.beans.BeansException;
4 | import org.springframework.beans.factory.NoSuchBeanDefinitionException;
5 | import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
6 | import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
7 |
8 | /**
9 | * 功能描述:Spring上下文信息
10 | *
11 | * @author Kimi Liu
12 | * @Date Mar 10, 2014
13 | * @Time 21:20:25
14 | * @email 839536@QQ.com
15 | * @version 1.0
16 | * @since JDK 1.6
17 | */
18 | public final class SpringUtils implements BeanFactoryPostProcessor {
19 |
20 | // Spring应用上下文环境
21 | private static ConfigurableListableBeanFactory factory;
22 |
23 | @Override
24 | public void postProcessBeanFactory(
25 | ConfigurableListableBeanFactory beanFactory) throws BeansException {
26 | factory = beanFactory;
27 | }
28 |
29 | /**
30 | * 获取对象
31 | *
32 | * @param name
33 | * @return Object 一个以所给名字注册的bean的实例
34 | * @throws org.springframework.beans.BeansException
35 | *
36 | */
37 | @SuppressWarnings("all")
38 | public static T getBean(String name) throws BeansException {
39 | return (T) factory.getBean(name);
40 | }
41 |
42 | /**
43 | * 获取类型为requiredType的对象
44 | *
45 | * @param clz
46 | * @return
47 | * @throws org.springframework.beans.BeansException
48 | *
49 | */
50 | public static T getBean(Class clazz) throws BeansException {
51 | return (T) factory.getBean(clazz);
52 | }
53 |
54 | /**
55 | * 如果BeanFactory包含一个与所给名称匹配的bean定义,则返回true
56 | *
57 | * @param name
58 | * @return boolean
59 | */
60 | public static boolean containsBean(String name) {
61 | return factory.containsBean(name);
62 | }
63 |
64 | /**
65 | * 判断以给定名字注册的bean定义是一个singleton还是一个prototype。
66 | * 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException)
67 | *
68 | * @param name
69 | * @return boolean
70 | * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException
71 | *
72 | */
73 | public static boolean isSingleton(String name)
74 | throws NoSuchBeanDefinitionException {
75 | return factory.isSingleton(name);
76 | }
77 |
78 | /**
79 | * @param name
80 | * @return Class 注册对象的类型
81 | * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException
82 | *
83 | */
84 | public static Class> getType(String name)
85 | throws NoSuchBeanDefinitionException {
86 | return factory.getType(name);
87 | }
88 |
89 | /**
90 | * 如果给定的bean名字在bean定义中有别名,则返回这些别名
91 | *
92 | * @param name
93 | * @return
94 | * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException
95 | *
96 | */
97 | public static String[] getAliases(String name)
98 | throws NoSuchBeanDefinitionException {
99 | return factory.getAliases(name);
100 | }
101 |
102 | }
--------------------------------------------------------------------------------
/src/main/webapp/WEB-INF/iPage/Widget/Kettle/Spoon/insert.jsp:
--------------------------------------------------------------------------------
1 | <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><%@ include file="../../../Comm/tags.jsp"%>
2 |
3 |
4 |
5 |
6 |
7 | <%@ include file="../../../Comm/resource.jsp"%>
8 |
9 |
10 |
11 |
12 |
13 | <%@ include file="../../../header.jsp"%>
14 |
15 |
16 | <%@ include file="../../../topnav.jsp"%>
17 |
18 |
59 |
62 |
63 |
64 |
--------------------------------------------------------------------------------
/src/main/java/org/ukettle/widget/quartz/ibatis/QuartzGroup.Mapper.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
7 | insert into Q_GROUP (
8 | id
9 | , name
10 | , type
11 | , status
12 | , description
13 | , creator
14 | , created
15 | )
16 | values (
17 | #{id},
18 | #{name},
19 | #{type},
20 | #{status},
21 | #{description},
22 | #{creator},
23 | #{created}
24 | )
25 |
26 |
27 |
28 | delete from Q_GROUP where id = #{id}
29 |
30 |
31 |
32 | update Q_GROUP
33 |
34 |
35 | name = #{name},
36 |
37 |
38 | type = #{type},
39 |
40 |
41 | status = #{status},
42 |
43 |
44 | description = #{description},
45 |
46 |
47 | creator = #{creator},
48 |
49 |
50 | created = #{created}
51 |
52 |
53 | where id = #{id}
54 |
55 |
56 |
73 |
74 |
110 |
111 |
--------------------------------------------------------------------------------
/src/main/java/org/ukettle/system/service/impl/MenuServiceImpl.java:
--------------------------------------------------------------------------------
1 | package org.ukettle.system.service.impl;
2 |
3 | import java.util.List;
4 |
5 | import org.springframework.beans.factory.annotation.Autowired;
6 | import org.springframework.dao.DataAccessException;
7 | import org.springframework.stereotype.Service;
8 |
9 | import org.ukettle.basics.shiro.entity.Shiro;
10 | import org.ukettle.engine.loader.BasicMapper;
11 | import org.ukettle.system.entity.Menu;
12 | import org.ukettle.system.service.MenuService;
13 | import org.ukettle.www.toolkit.Constant;
14 | import org.ukettle.www.toolkit.DateUtils;
15 | import org.ukettle.www.toolkit.ObjectID;
16 |
17 |
18 | @Service
19 | public class MenuServiceImpl implements MenuService {
20 |
21 | @Autowired
22 | private BasicMapper mapper;
23 |
24 | @Override
25 | public Object insert(T entity) throws DataAccessException {
26 | if (null != entity) {
27 | entity.setId(ObjectID.id());
28 | entity.setCreator(Shiro.get().getEmail());
29 | entity.setCreated(DateUtils.getTime24());
30 | if (((Integer) mapper.iMenuMapper.insert(entity)) > 0) {
31 | return entity.getId();
32 | }
33 | }
34 | return null;
35 | }
36 |
37 | @Override
38 | public Object update(T entity) throws DataAccessException {
39 | if (null != entity) {
40 | if (((Integer) mapper.iMenuMapper.update(entity)) > 0) {
41 | return entity.getId();
42 | }
43 | }
44 | return null;
45 | }
46 |
47 | @Override
48 | public Object delete(String id) throws DataAccessException {
49 | if (null != id && !"".equals(id)) {
50 | if (((Integer) mapper.iMenuMapper.delete(id)) > 0) {
51 | return id;
52 | }
53 | }
54 | return null;
55 | }
56 |
57 | @Override
58 | public Object select(T entity) throws DataAccessException {
59 | if (null != entity) {
60 | return mapper.iMenuMapper.select(entity);
61 | }
62 | return null;
63 | }
64 |
65 | @Override
66 | public List> selectByWhere(T entity) throws DataAccessException {
67 | if (null != entity) {
68 | return mapper.iMenuMapper.selectByWhere(entity);
69 | }
70 | return null;
71 | }
72 |
73 | @Override
74 | public List> selectById(T entity) {
75 | if (null != entity) {
76 | entity.setUid(Shiro.get().getId());
77 | entity.setStatus(Constant.STATUS_ENABLED);
78 | return mapper.iMenuMapper.selectById(entity);
79 | }
80 | return null;
81 | }
82 |
83 | @Override
84 | public List> selectByPid(T entity) {
85 | if (null != entity) {
86 | entity.setUid(Shiro.get().getId());
87 | entity.setStatus(Constant.STATUS_ENABLED);
88 | return mapper.iMenuMapper.selectByPid(entity);
89 | }
90 | return null;
91 | }
92 |
93 | @Override
94 | public List> selectByUid(T entity) {
95 | if (null != entity) {
96 | entity.setUid(Shiro.get().getId());
97 | entity.setStatus(Constant.STATUS_ENABLED);
98 | return mapper.iMenuMapper.selectByUid(entity);
99 | }
100 | return null;
101 | }
102 |
103 | }
--------------------------------------------------------------------------------
/src/main/resources/spring-quartz.xml:
--------------------------------------------------------------------------------
1 |
2 |
12 |
13 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 | iQuartz
27 |
28 | AUTO
29 | false
30 | 1500
31 | false
32 | org.quartz.simpl.SimpleThreadPool
33 | true
34 | 5
35 | 5
36 |
37 | org.quartz.impl.jdbcjobstore.JobStoreTX
38 |
39 | org.quartz.impl.jdbcjobstore.StdJDBCDelegate
40 | false
41 | Q_
42 | 20
43 | 60000
44 |
45 | true
46 |
47 | 20000
48 | true
49 |
50 |
51 |
52 |
53 |
--------------------------------------------------------------------------------
/src/main/java/org/ukettle/www/toolkit/ListQueue.java:
--------------------------------------------------------------------------------
1 | package org.ukettle.www.toolkit;
2 |
3 | import java.util.concurrent.atomic.AtomicInteger;
4 | import java.util.concurrent.locks.Condition;
5 | import java.util.concurrent.locks.ReentrantLock;
6 |
7 | public class ListQueue {
8 |
9 | private final AtomicInteger count = new AtomicInteger(0);
10 | private transient Node head;
11 | private transient Node last;
12 | private final ReentrantLock takeLock = new ReentrantLock();
13 | private final Condition notEmpty = this.takeLock.newCondition();
14 | private final ReentrantLock putLock = new ReentrantLock();
15 |
16 | private void signalNotEmpty() {
17 | ReentrantLock takeLock = this.takeLock;
18 | takeLock.lock();
19 | try {
20 | this.notEmpty.signal();
21 | } finally {
22 | takeLock.unlock();
23 | }
24 | }
25 |
26 | private void insert(E x) {
27 | this.last = (this.last.next = new Node(x));
28 | }
29 |
30 | private E extract() {
31 | Node first = this.head.next;
32 | this.head = null;
33 | this.head = first;
34 | E x = first.item;
35 | first.item = null;
36 | this.head.item = null;
37 | first = null;
38 | return x;
39 | }
40 |
41 | private void fullyLock() {
42 | this.putLock.lock();
43 | this.takeLock.lock();
44 | }
45 |
46 | private void fullyUnlock() {
47 | this.takeLock.unlock();
48 | this.putLock.unlock();
49 | }
50 |
51 | public ListQueue() {
52 | this.last = (this.head = new Node(null));
53 | }
54 |
55 | public int size() {
56 | return this.count.get();
57 | }
58 |
59 | public boolean offer(E o) {
60 | if (o == null)
61 | throw new NullPointerException();
62 |
63 | int c = -1;
64 | ReentrantLock putLock = this.putLock;
65 | AtomicInteger count = this.count;
66 | putLock.lock();
67 | try {
68 | insert(o);
69 | c = count.getAndIncrement();
70 | } finally {
71 | putLock.unlock();
72 | }
73 | if (c == 0)
74 | signalNotEmpty();
75 | return c >= 0;
76 | }
77 |
78 | public E take() throws InterruptedException {
79 | int c = -1;
80 | AtomicInteger count = this.count;
81 | ReentrantLock takeLock = this.takeLock;
82 | takeLock.lockInterruptibly();
83 | E x;
84 | try {
85 | try {
86 | while (count.get() == 0)
87 | this.notEmpty.await();
88 | } catch (InterruptedException ie) {
89 | this.notEmpty.signal();
90 | throw ie;
91 | }
92 |
93 | x = extract();
94 | c = count.getAndDecrement();
95 | if (c > 1)
96 | this.notEmpty.signal();
97 | } finally {
98 | takeLock.unlock();
99 | }
100 | return x;
101 | }
102 |
103 | public void clear() {
104 | fullyLock();
105 | try {
106 | this.head.next = null;
107 | assert (this.head.item == null);
108 | this.last = this.head;
109 | } finally {
110 | fullyUnlock();
111 | }
112 | }
113 |
114 | static class Node {
115 | volatile E item;
116 | Node next;
117 |
118 | Node(E x) {
119 | this.item = x;
120 | }
121 | }
122 |
123 | }
--------------------------------------------------------------------------------
/src/main/java/org/ukettle/www/toolkit/Encode.java:
--------------------------------------------------------------------------------
1 | package org.ukettle.www.toolkit;
2 |
3 | import java.io.UnsupportedEncodingException;
4 | import java.net.URLDecoder;
5 | import java.net.URLEncoder;
6 |
7 | import org.apache.commons.codec.DecoderException;
8 | import org.apache.commons.codec.binary.Base64;
9 | import org.apache.commons.codec.binary.Hex;
10 |
11 | import org.ukettle.www.exception.uKettleException;
12 |
13 | /**
14 | *
15 | * 封装各种格式的编码解码工具类. 1.Commons-Codec的 hex/base64 编码 2.自制的base62 编码
16 | * 3.Commons-Lang的xml/html escape 4.JDK提供的URLEncoder
17 | *
18 | *
19 | * @author Kimi Liu
20 | * @Date Mar 15, 2014
21 | * @Time 10:22:21
22 | * @email 839536@QQ.com
23 | * @version 1.0
24 | * @since JDK 1.6
25 | */
26 | public class Encode {
27 |
28 | private static String DEFAULT_URL_ENCODING = Constant.DEFAULT_ENCODING;
29 | private static final char[] BASE62 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
30 | .toCharArray();
31 |
32 | /**
33 | * Hex编码.
34 | */
35 | public static String encodeHex(byte[] input) {
36 | return Hex.encodeHexString(input);
37 | }
38 |
39 | /**
40 | * Hex解码.
41 | */
42 | public static byte[] decodeHex(String input) {
43 | try {
44 | return Hex.decodeHex(input.toCharArray());
45 | } catch (DecoderException e) {
46 | throw uKettleException.unchecked(e);
47 | }
48 | }
49 |
50 | /**
51 | * Base64编码.
52 | */
53 | public static String encodeBase64(byte[] input) {
54 | return Base64.encodeBase64String(input);
55 | }
56 |
57 | /**
58 | * Base64编码, URL安全(将Base64中的URL非法字符'+'和'/'转为'-'和'_', 见RFC3548).
59 | */
60 | public static String encodeUrlSafeBase64(byte[] input) {
61 | return Base64.encodeBase64URLSafeString(input);
62 | }
63 |
64 | /**
65 | * Base64解码.
66 | */
67 | public static byte[] decodeBase64(String input) {
68 | return Base64.decodeBase64(input);
69 | }
70 |
71 | /**
72 | * Base62编码。
73 | */
74 | public static String encodeBase62(byte[] input) {
75 | char[] chars = new char[input.length];
76 | for (int i = 0; i < input.length; i++) {
77 | chars[i] = BASE62[((input[i] & 0xFF) % BASE62.length)];
78 | }
79 | return new String(chars);
80 | }
81 |
82 | /**
83 | * URL 编码, Encode默认为UTF-8.
84 | */
85 | public static String urlEncode(String url, String encoding) {
86 | try {
87 | if (null != encoding && !"".equals(encoding)) {
88 | DEFAULT_URL_ENCODING = encoding;
89 | }
90 | return URLEncoder.encode(url, DEFAULT_URL_ENCODING);
91 | } catch (UnsupportedEncodingException e) {
92 | throw uKettleException.unchecked(e);
93 | }
94 | }
95 |
96 | /**
97 | * URL 解码, Encode默认为UTF-8.
98 | */
99 | public static String urlDecode(String url, String encoding) {
100 | try {
101 | if (null != encoding && !"".equals(encoding)) {
102 | DEFAULT_URL_ENCODING = encoding;
103 | }
104 | return URLDecoder.decode(url, DEFAULT_URL_ENCODING);
105 | } catch (UnsupportedEncodingException e) {
106 | throw uKettleException.unchecked(e);
107 | }
108 | }
109 |
110 | }
--------------------------------------------------------------------------------
/src/main/java/org/ukettle/service/execute/AgainExecService.java:
--------------------------------------------------------------------------------
1 | package org.ukettle.service.execute;
2 |
3 | import java.util.Iterator;
4 | import java.util.List;
5 | import java.util.Map;
6 | import java.util.Map.Entry;
7 |
8 | import org.quartz.JobExecutionContext;
9 | import org.quartz.JobExecutionException;
10 | import org.springframework.beans.factory.annotation.Autowired;
11 | import org.springframework.scheduling.quartz.QuartzJobBean;
12 | import org.ukettle.engine.loader.BasicService;
13 | import org.ukettle.widget.kettle.entity.KettleResult;
14 | import org.ukettle.widget.kettle.entity.KettleSpoon;
15 | import org.ukettle.www.toolkit.Constant;
16 | import org.ukettle.www.toolkit.DateUtils;
17 | import org.ukettle.www.toolkit.JSONUtil;
18 |
19 | /**
20 | *
21 | * 简单的实现了Spring QuartzJobBean接口
22 | *
23 | *
24 | * @author Kimi Liu
25 | * @Date Oct 18, 2014
26 | * @Time 10:21:03
27 | * @email 839536@QQ.com
28 | * @version 1.0
29 | * @since JDK 1.6
30 | */
31 | public class AgainExecService extends QuartzJobBean {
32 |
33 | @Autowired
34 | private BasicService service;
35 |
36 | /**
37 | * 执行实际任务
38 | *
39 | * @see execute
40 | */
41 | @Override
42 | protected void executeInternal(JobExecutionContext context)
43 | throws JobExecutionException {
44 | KettleResult result = new KettleResult();
45 | for (Object key : context.getJobDetail().getJobDataMap().keySet()) {
46 | String strVal = context.getJobDetail().getJobDataMap().get(key)
47 | .toString();
48 | // 获取定时任务中的所有参数
49 | if (strVal.startsWith(Constant.STARTS_WITH_USD)) {
50 | int minute = Integer.parseInt(strVal.split("\\"
51 | + Constant.STARTS_WITH_USD)[1]);
52 | strVal = DateUtils.isAssign(null, minute);
53 | }
54 | result.setValue(key.toString(), strVal);
55 | }
56 | @SuppressWarnings("all")
57 | List list = (List) service.iKettleResultService
58 | .selectByWhere(result);
59 | if (!list.isEmpty()) {
60 | for (KettleResult r : list) {
61 | String json = r.getParams();
62 | if (!Constant.STATUS_ERROR.equals(r.getStatus())) {
63 | json = json.substring(1, json.length() - 1);
64 | }
65 | Map, ?> map = JSONUtil.getMapFromJson(json);
66 | final KettleSpoon entity = new KettleSpoon();
67 | Iterator> it = map.entrySet().iterator();
68 | while (it.hasNext()) {
69 | Map.Entry, ?> ent = (Entry, ?>) it.next();
70 | String key = (String) ent.getKey();
71 | String val = (String) ent.getValue();
72 | if (!Constant.STATUS_ERROR.equals(r.getStatus())) {
73 | if (key.indexOf("start_") != -1) {
74 | val = r.getStartTime();
75 | }
76 | if (key.indexOf("end_") != -1) {
77 | val = r.getEndTime();
78 | }
79 | if (key.indexOf("nick") != -1) {
80 | val = r.getNick();
81 | }
82 | }
83 | if (null != val && !"".equals(val)) {
84 | entity.setValue(key, val);
85 | }
86 | }
87 | entity.setRid(r.getId());
88 | entity.setTid(entity.getName());
89 | entity.setQueue(false);
90 | service.iKettleSpoonService.execute(entity);
91 | }
92 | }
93 | }
94 |
95 | }
--------------------------------------------------------------------------------
/src/main/webapp/WEB-INF/web.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 | uKettle
8 |
9 |
10 | org.springframework.web.context.ContextLoaderListener
11 |
12 |
13 | org.springframework.web.context.request.RequestContextListener
14 |
15 |
16 |
17 | contextConfigLocation
18 | classpath:applicationContext.xml
19 |
20 |
21 |
22 |
23 | dispatcher
24 | org.springframework.web.servlet.DispatcherServlet
25 |
26 | contextConfigLocation
27 | classpath:spring-servlet.xml
28 |
29 | 1
30 |
31 |
32 | dispatcher
33 | /
34 |
35 |
36 |
37 |
38 | characterEncodingFilter
39 | org.springframework.web.filter.CharacterEncodingFilter
40 |
41 | encoding
42 | UTF-8
43 |
44 |
45 | forceEncoding
46 | true
47 |
48 |
49 |
50 | characterEncodingFilter
51 | /*
52 |
53 |
54 |
55 |
56 | org.springframework.web.util.IntrospectorCleanupListener
57 |
58 |
59 |
60 |
61 | shiroFilter
62 | org.springframework.web.filter.DelegatingFilterProxy
63 |
64 | targetFilterLifecycle
65 | true
66 |
67 |
68 |
69 |
70 | shiroFilter
71 | /*
72 |
73 |
74 |
75 | 403
76 | /Html/error.html
77 |
78 |
79 | 404
80 | /Html/error.html
81 |
82 |
83 | 500
84 | /Html/error.html
85 |
86 |
87 |
88 | /
89 |
90 |
91 |
--------------------------------------------------------------------------------
/src/main/java/org/ukettle/basics/page/dialect/db/OracleDialect.java:
--------------------------------------------------------------------------------
1 | package org.ukettle.basics.page.dialect.db;
2 |
3 | import java.util.List;
4 |
5 | import org.ukettle.basics.page.Sorting;
6 | import org.ukettle.basics.page.dialect.Dialect;
7 | import org.ukettle.basics.page.plugin.BaseParameter;
8 |
9 |
10 | /**
11 | * Oracle的方言实现
12 | *
13 | * @author Kimi Liu
14 | * @Date Aug 21, 2014
15 | * @Time 15:23:56
16 | * @email 839536@QQ.com
17 | * @version 1.0
18 | * @since JDK 1.6
19 | */
20 | public class OracleDialect implements Dialect {
21 |
22 | @Override
23 | public boolean limit() {
24 | return true;
25 | }
26 |
27 | @Override
28 | public String getLimit(String sql, int offset, int limit) {
29 | return getLimit(sql, offset, Integer.toString(offset),
30 | Integer.toString(limit));
31 | }
32 |
33 | /**
34 | * 将sql变成分页sql语句,提供将offset及limit使用占位符号(placeholder)替换.
35 | *
36 | *
37 | * 如mysql
38 | * dialect.getLimit("select * from user", 12, ":offset",0,":limit") 将返回
39 | * select * from user limit :offset,:limit
40 | *
41 | *
42 | * @param sql
43 | * 实际SQL语句
44 | * @param offset
45 | * 分页开始纪录条数
46 | * @param offsetPlaceholder
47 | * 分页开始纪录条数-占位符号
48 | * @param limitPlaceholder
49 | * 分页纪录条数占位符号
50 | * @return 包含占位符的分页sql
51 | */
52 | public String getLimit(String sql, int offset, String offsetPlaceholder,
53 | String limitPlaceholder) {
54 | sql = sql.trim();
55 | boolean isForUpdate = false;
56 | if (sql.toLowerCase().endsWith(" for update")) {
57 | sql = sql.substring(0, sql.length() - 11);
58 | isForUpdate = true;
59 | }
60 | StringBuilder pagingSelect = new StringBuilder(sql.length() + 100);
61 | if (offset > 0) {
62 | pagingSelect
63 | .append("select * from ( select row_.*, rownum rownum_ from ( ");
64 | } else {
65 | pagingSelect.append("select * from ( ");
66 | }
67 | pagingSelect.append(sql);
68 | if (offset > 0) {
69 | String endString = offsetPlaceholder + "+" + limitPlaceholder;
70 | pagingSelect.append(" ) row_ ) where rownum_ <= ")
71 | .append(endString).append(" and rownum_ > ")
72 | .append(offsetPlaceholder);
73 | } else {
74 | pagingSelect.append(" ) where rownum <= ").append(limitPlaceholder);
75 | }
76 |
77 | if (isForUpdate) {
78 | pagingSelect.append(" for update");
79 | }
80 |
81 | return pagingSelect.toString();
82 | }
83 |
84 | @Override
85 | public String getCount(String sql) {
86 | return "select count(1) from (" + BaseParameter.removeOrders(sql)
87 | + ") as dialect";
88 | }
89 |
90 | @Override
91 | public String getSort(String sql, List sort) {
92 | if (sort == null || sort.isEmpty()) {
93 | return sql;
94 | }
95 | StringBuffer buffer = new StringBuffer("select * from (").append(sql)
96 | .append(") dialect order by ");
97 | for (Sorting s : sort) {
98 | buffer.append(s.getColumn()).append(" ").append(s.getSort())
99 | .append(", ");
100 | }
101 | buffer.delete(buffer.length() - 2, buffer.length());
102 | return buffer.toString();
103 | }
104 | }
--------------------------------------------------------------------------------
/src/main/java/org/ukettle/basics/page/plugin/PreparePaginationInterceptor.java:
--------------------------------------------------------------------------------
1 | package org.ukettle.basics.page.plugin;
2 |
3 | import java.sql.Connection;
4 | import java.util.Properties;
5 |
6 | import org.apache.ibatis.executor.statement.BaseStatementHandler;
7 | import org.apache.ibatis.executor.statement.RoutingStatementHandler;
8 | import org.apache.ibatis.executor.statement.StatementHandler;
9 | import org.apache.ibatis.mapping.BoundSql;
10 | import org.apache.ibatis.mapping.MappedStatement;
11 | import org.apache.ibatis.plugin.Intercepts;
12 | import org.apache.ibatis.plugin.Invocation;
13 | import org.apache.ibatis.plugin.Plugin;
14 | import org.apache.ibatis.plugin.Signature;
15 | import org.ukettle.basics.page.Page;
16 | import org.ukettle.www.toolkit.Reflection;
17 |
18 | /**
19 | *
20 | * Mybatis数据库分页插件. 拦截StatementHandler的prepare方法
21 | *
22 | *
23 | * @author Kimi Liu
24 | * @Date Aug 26, 2014
25 | * @Time 14:12:09
26 | * @email 839536@QQ.com
27 | * @version 1.0
28 | * @since JDK 1.6
29 | */
30 | @Intercepts({ @Signature(type = StatementHandler.class, method = "prepare", args = { Connection.class }) })
31 | public class PreparePaginationInterceptor extends BaseInterceptor {
32 |
33 | private static final long serialVersionUID = -6075937069117597841L;
34 |
35 | public PreparePaginationInterceptor() {
36 | super();
37 | }
38 |
39 | @Override
40 | public Object intercept(Invocation ivk) throws Throwable {
41 | if (ivk.getTarget().getClass()
42 | .isAssignableFrom(RoutingStatementHandler.class)) {
43 | final RoutingStatementHandler statementHandler = (RoutingStatementHandler) ivk
44 | .getTarget();
45 | final BaseStatementHandler delegate = (BaseStatementHandler) Reflection
46 | .getFieldValue(statementHandler, DELEGATE);
47 | final MappedStatement mappedStatement = (MappedStatement) Reflection
48 | .getFieldValue(delegate, MAPPED_STATEMENT);
49 |
50 | if (mappedStatement.getId().matches(SQL_PATTERN)) {
51 | // 拦截需要分页的SQL
52 | BoundSql boundSql = delegate.getBoundSql();
53 | // 分页SQL