diff --git a/build.xml b/build.xml
index 81f002e76c69ea95d12307901081c84e052581fb..1cf9e28cd6057abbaed2f8ab1b222b0eed899516 100644
--- a/build.xml
+++ b/build.xml
@@ -45,14 +45,14 @@
project.setNewProperty("length_aix_mb", length_aix_mbytes);
]]>
-
-
+
+
@@ -116,14 +116,14 @@
"url": "/download/o2server-${VERSION}-aix.zip",
"sha256": "${build_aix.sha}"
},
- "raspberrypi": {
+ "raspi": {
"system": "raspberrypi",
"name": "o2server-${VERSION}-raspi.zip",
"fileName": "o2server-${VERSION}-raspi.zip",
"fileSize": "${length_raspberrypi_mb}MB",
"updateTime": "${TODAY}",
"url": "/download/o2server-${VERSION}-raspi.zip",
- "sha256": "${build_raspberrypi.sha}"
+ "sha256": "${build_raspi.sha}"
},
"mips": {
"system": "mips",
@@ -185,14 +185,14 @@
"url": "/download/o2server-${VERSION}-aix.zip",
"sha256": "${build_aix.sha}"
},
- "raspberrypi": {
- "system": "raspberrypi",
+ "raspi": {
+ "system": "raspi",
"name": "o2server-${VERSION}-raspi.zip",
"fileName": "o2server-${VERSION}-raspi.zip",
- "fileSize": "${length_raspberrypi_mb}MB",
+ "fileSize": "${length_raspi_mb}MB",
"updateTime": "${TODAY}",
"url": "/download/o2server-${VERSION}-raspi.zip",
- "sha256": "${build_raspberrypi.sha}"
+ "sha256": "${build_raspi.sha}"
},
"mips": {
"system": "mips",
@@ -220,7 +220,7 @@
}
}
-
+
@@ -308,7 +308,7 @@
-
+
@@ -320,7 +320,7 @@
-
+
diff --git a/gulpfile.js b/gulpfile.js
index b3e14a849a2f8814747cec43d2e0880806def360..c1039f0add596b13dcbcb4b0d309a0baf00baee5 100644
--- a/gulpfile.js
+++ b/gulpfile.js
@@ -19,6 +19,8 @@ var fg = require('fast-glob');
var logger = require('gulp-logger');
var assetRev = require('gulp-tm-asset-rev');
const os = require('os');
+var through2 = require('through2');
+var path = require('path');
//var downloadHost = "download.o2oa.net";
// var downloadHost = "release.o2oa.net";
@@ -46,7 +48,7 @@ var jvmUrls = {
"arm": "/o2oa/evn-o2server-jvm/-/archive/master/evn-o2server-jvm-master.tar.gz?path=jvm/arm",
"macos": "/o2oa/evn-o2server-jvm/-/archive/master/evn-o2server-jvm-master.tar.gz?path=jvm/macos",
"risc": "/o2oa/evn-o2server-jvm/-/archive/master/evn-o2server-jvm-master.tar.gz?path=jvm/risc",
- "raspberrypi": "/o2oa/evn-o2server-jvm/-/archive/master/evn-o2server-jvm-master.tar.gz?path=jvm/raspberrypi",
+ "raspi": "/o2oa/evn-o2server-jvm/-/archive/master/evn-o2server-jvm-master.tar.gz?path=jvm/raspi",
"windows": "/o2oa/evn-o2server-jvm/-/archive/master/evn-o2server-jvm-master.tar.gz?path=jvm/windows"
};
@@ -57,15 +59,16 @@ var scripts = {
"arm": ["o2server/*arm*", "o2server/*.jar", "o2server/*.html", "o2server/version.o2"],
"macos": ["o2server/*macos*", "o2server/*.jar", "o2server/*.html", "o2server/version.o2"],
"risc": ["o2server/*risc*", "o2server/*.jar", "o2server/*.html", "o2server/version.o2"],
- "raspberrypi": ["o2server/*raspberrypi*", "o2server/*.jar", "o2server/*.html", "o2server/version.o2"],
+ "raspi": ["o2server/*raspi*", "o2server/*.jar", "o2server/*.html", "o2server/version.o2"],
"windows": ["o2server/*windows*", "o2server/*.jar", "o2server/*.html", "o2server/version.o2"]
};
var o_options = minimist(process.argv.slice(2), {//upload: local ftp or sftp
- string: ["e"]
+ string: ["e", "lp"]
});
var options = {};
options.ev = o_options.e || "all";
+options.lp = o_options.lp || "zh-cn";
var jvmUrl = jvmUrls[options.ev];
var scriptSource = scripts[options.ev];
@@ -460,6 +463,8 @@ function build_concat_xform(){
'o2web/source/' + path + '/DatagridPC.js',
'o2web/source/' + path + '/Textfield.js',
'o2web/source/' + path + '/Personfield.js',
+ 'o2web/source/' + path + '/Button.js',
+ 'o2web/source/' + path + '/ViewSelector.js',
'o2web/source/' + path + '/*.js',
'o2web/source/x_component_process_Work/Processor.js',
'!o2web/source/' + path + '/Office.js'
@@ -491,9 +496,100 @@ function build_bundle(){
.pipe(gulp.dest(dest))
}
-function build_concat_basework() {
+
+function concat_Actions(){
+ return through2.obj(function (file, enc, cb) {
+ if (file.isNull()) {
+ this.push(file);
+ return cb();
+ }
+
+ if (file.isStream()) {
+ this.emit('error', new gutil.PluginError(PLUGIN_NAME, 'Streaming not supported'));
+ return cb();
+ }
+ var content = file.contents.toString();
+
+ var o = path.parse(file.path);
+ var name = o.name;
+ content = "var actionJson = "+content;
+ content = content+"\nif (!o2.xAction.RestActions.Action[\""+name+"\"]) o2.xAction.RestActions.Action[\""+name+"\"] = new Class({Extends: o2.xAction.RestActions.Action});";
+ content = content+"\no2.Actions.actions[\""+name+"\"] = new o2.xAction.RestActions.Action[\""+name+"\"](\""+name+"\", actionJson);";
+
+ file.contents = new Buffer.from(content);
+ this.push(file);
+ cb();
+ });
+}
+function concat_Style(){
+ return through2.obj(function (file, enc, cb) {
+ if (file.isNull()) {
+ this.push(file);
+ return cb();
+ }
+
+ if (file.isStream()) {
+ this.emit('error', new gutil.PluginError(PLUGIN_NAME, 'Streaming not supported'));
+ return cb();
+ }
+ var content = file.contents.toString();
+ var name = file.path.replace(process.cwd(), "").replace(/\\/g, "/")
+ name = ".."+name.substring(name.indexOf("/source")+7);
+ content = "var csskey = encodeURIComponent(\""+name+"\");\no2.widget.css[csskey]="+content;
+
+ file.contents = new Buffer.from(content);
+ this.push(file);
+ cb();
+ });
+}
+
+function build_concat_basework_style(){
+ return gulp.src([
+ "o2web/source/x_component_process_Work/$Main/default/css.wcss",
+ "o2web/source/x_component_process_Xform/$Form/default/css.wcss",
+ "o2web/source/o2_core/o2/widget/$Tab/mobileForm/css.wcss",
+ "o2web/source/o2_core/o2/widget/$Menu/tab/css.wcss",
+ "o2web/source/o2_core/o2/widget/$Tab/form/css.wcss",
+ "o2web/source/x_component_process_Xform/$Form/default/doc.wcss",
+ "o2web/source/o2_core/o2/widget/$Toolbar/documentEdit/css.wcss",
+ "o2web/source/o2_core/o2/widget/$Toolbar/documentEdit_side/css.wcss",
+ "o2web/source/x_component_process_Xform/$Form/default/css.wcss"
+ ])
+ .pipe(concat_Style())
+ .pipe(concat('js/base_work_style_temp.js'))
+ .pipe(gulp.dest('o2web/source/x_desktop/'));
+}
+
+function build_concat_basework_action(){
+ return gulp.src([
+ "o2web/source/o2_core/o2/xAction/services/x_organization_assemble_authentication.json",
+ "o2web/source/o2_core/o2/xAction/services/x_processplatform_assemble_surface.json",
+ "o2web/source/o2_core/o2/xAction/services/x_organization_assemble_control.json",
+ "o2web/source/o2_core/o2/xAction/services/x_query_assemble_surface.json",
+ "o2web/source/o2_core/o2/xAction/services/x_cms_assemble_control.json",
+ "o2web/source/o2_core/o2/xAction/services/x_program_center.json",
+ "o2web/source/o2_core/o2/xAction/services/x_organization_assemble_personal.json"
+ ])
+ .pipe(concat_Actions())
+ .pipe(concat('js/base_work_actions_temp.js'))
+ .pipe(gulp.dest('o2web/source/x_desktop/'));
+}
+
+function build_concat_basework_clean(cb) {
+ var dest = [
+ 'o2web/source/x_desktop/js/base_work_actions_temp.js',
+ 'o2web/source/x_desktop/js/base_work_style_temp.js'
+ ];
+ return del(dest, cb);
+}
+
+function build_concat_basework_body() {
var src = [
- 'o2web/source/x_desktop/js/base_work_begin.js',
+ 'o2web/source/x_desktop/js/base_concat_head.js',
+ 'o2web/source/o2_core/o2/lp/'+(options.lp || 'zh-cn')+'.js',
+
+ 'o2web/source/x_desktop/js/base_work_style_temp.js',
+
'o2web/source/o2_core/o2/widget/Common.js',
'o2web/source/o2_core/o2/widget/Dialog.js',
'o2web/source/o2_core/o2/widget/UUID.js',
@@ -511,6 +607,12 @@ function build_concat_basework() {
'o2web/source/o2_core/o2/xDesktop/Dialog.js',
'o2web/source/o2_core/o2/xDesktop/Window.js',
'o2web/source/x_component_Common/Main.js',
+
+ 'o2web/source/o2_core/o2/lp/'+(options.lp || 'zh-cn')+'.js',
+ 'o2web/source/x_component_process_Work/lp/'+(options.lp || 'zh-cn')+'.js',
+ 'o2web/source/x_component_process_Xform/lp/'+(options.lp || 'zh-cn')+'.js',
+ 'o2web/source/x_component_Selector/lp/'+(options.lp || 'zh-cn')+'.js',
+
'o2web/source/x_component_process_Work/Main.js',
'o2web/source/x_component_Selector/package.js',
'o2web/source/x_component_Selector/Person.js',
@@ -526,13 +628,16 @@ function build_concat_basework() {
'o2web/source/o2_core/o2/xScript/Environment.js',
'o2web/source/x_component_Template/MTooltips.js',
'o2web/source/x_component_Template/MSelector.js',
+
'o2web/source/o2_core/o2/xAction/services/x_organization_assemble_authentication.js',
'o2web/source/o2_core/o2/xAction/services/x_processplatform_assemble_surface.js',
'o2web/source/o2_core/o2/xAction/services/x_cms_assemble_control.js',
'o2web/source/o2_core/o2/xAction/services/x_organization_assemble_control.js',
'o2web/source/o2_core/o2/xAction/services/x_query_assemble_surface.js',
'o2web/source/o2_core/o2/xAction/services/x_organization_assemble_personal.js',
- 'o2web/source/x_desktop/js/base_work_end.js',
+
+ 'o2web/source/x_desktop/js/base_work_actions_temp.js',
+
'o2web/source/x_desktop/js/base.js'
];
var dest = 'target/o2server/servers/webServer/x_desktop/js/';
@@ -543,10 +648,116 @@ function build_concat_basework() {
.pipe(rename({ extname: '.min.js' }))
.pipe(gulp.dest(dest));
}
-// function build_concat(){
-// return gulp.parallel(build_concat_o2, build_concat_desktop, build_concat_xform);
-// }
-exports.build_concat = gulp.parallel(build_concat_o2, build_concat_desktop, build_concat_xform, build_bundle, build_concat_basework);
+
+function build_concat_baseportal_style(){
+ return gulp.src([
+ "o2web/source/x_component_process_Work/$Main/default/css.wcss",
+ "o2web/source/x_component_portal_Portal/$Main/default/css.wcss",
+ "o2web/source/x_component_process_Xform/$Form/default/css.wcss",
+ "o2web/source/o2_core/o2/widget/$Tab/mobileForm/css.wcss",
+ "o2web/source/o2_core/o2/widget/$Menu/tab/css.wcss",
+ ])
+ .pipe(concat_Style())
+ .pipe(concat('js/base_portal_style_temp.js'))
+ .pipe(gulp.dest('o2web/source/x_desktop/'));
+}
+
+function build_concat_baseportal_action(){
+ return gulp.src([
+ "o2web/source/o2_core/o2/xAction/services/x_organization_assemble_authentication.json",
+ "o2web/source/o2_core/o2/xAction/services/x_portal_assemble_surface.json",
+ "o2web/source/o2_core/o2/xAction/services/x_organization_assemble_control.json",
+ "o2web/source/o2_core/o2/xAction/services/x_query_assemble_surface.json",
+ "o2web/source/o2_core/o2/xAction/services/x_cms_assemble_control.json",
+ "o2web/source/o2_core/o2/xAction/services/x_program_center.json",
+ "o2web/source/o2_core/o2/xAction/services/x_organization_assemble_personal.json"
+ ])
+ .pipe(concat_Actions())
+ .pipe(concat('js/base_portal_actions_temp.js'))
+ .pipe(gulp.dest('o2web/source/x_desktop/'));
+}
+
+function build_concat_baseportal_clean(cb) {
+ var dest = [
+ 'o2web/source/x_desktop/js/base_portal_actions_temp.js',
+ 'o2web/source/x_desktop/js/base_portal_style_temp.js'
+ ];
+ return del(dest, cb);
+}
+
+function build_concat_baseportal_body() {
+ var src = [
+ 'o2web/source/x_desktop/js/base_concat_head.js',
+ 'o2web/source/o2_core/o2/lp/'+(options.lp || 'zh-cn')+'.js',
+
+ 'o2web/source/x_desktop/js/base_portal_style_temp.js',
+
+ 'o2web/source/o2_core/o2/widget/Common.js',
+ 'o2web/source/o2_core/o2/widget/Dialog.js',
+ 'o2web/source/o2_core/o2/widget/UUID.js',
+ 'o2web/source/o2_core/o2/widget/Menu.js',
+ 'o2web/source/o2_core/o2/widget/Toolbar.js',
+ 'o2web/source/o2_core/o2/xDesktop/Common.js',
+ 'o2web/source/o2_core/o2/xDesktop/Actions/RestActions.js',
+ 'o2web/source/o2_core/o2/xAction/RestActions.js',
+ 'o2web/source/o2_core/o2/xDesktop/Access.js',
+ 'o2web/source/o2_core/o2/xDesktop/Dialog.js',
+ 'o2web/source/o2_core/o2/xDesktop/Menu.js',
+ 'o2web/source/o2_core/o2/xDesktop/UserData.js',
+ 'o2web/source/x_component_Template/MPopupForm.js',
+ 'o2web/source/o2_core/o2/xDesktop/Authentication.js',
+ 'o2web/source/o2_core/o2/xDesktop/Window.js',
+
+ 'o2web/source/x_component_Common/Main.js',
+
+ 'o2web/source/x_component_process_Work/lp/'+(options.lp || 'zh-cn')+'.js',
+ 'o2web/source/x_component_portal_Portal/lp/'+(options.lp || 'zh-cn')+'.js',
+ 'o2web/source/x_component_process_Xform/lp/'+(options.lp || 'zh-cn')+'.js',
+ 'o2web/source/x_component_Selector/lp/'+(options.lp || 'zh-cn')+'.js',
+
+ 'o2web/source/x_component_portal_Portal/Main.js',
+
+ 'o2web/source/x_component_Selector/package.js',
+ 'o2web/source/x_component_Selector/Person.js',
+ 'o2web/source/x_component_Selector/Identity.js',
+ 'o2web/source/x_component_Selector/Unit.js',
+ 'o2web/source/x_component_Selector/IdentityWidthDuty.js',
+ 'o2web/source/x_component_Selector/IdentityWidthDutyCategoryByUnit.js',
+ 'o2web/source/x_component_Selector/UnitWithType.js',
+
+ 'o2web/source/o2_core/o2/xScript/Actions/UnitActions.js',
+ 'o2web/source/o2_core/o2/xScript/Actions/ScriptActions.js',
+ 'o2web/source/o2_core/o2/xScript/Actions/CMSScriptActions.js',
+ 'o2web/source/o2_core/o2/xScript/Actions/PortalScriptActions.js',
+ 'o2web/source/o2_core/o2/xScript/PageEnvironment.js',
+
+ 'o2web/source/o2_core/o2/xAction/services/x_organization_assemble_authentication.js',
+ 'o2web/source/o2_core/o2/xAction/services/x_cms_assemble_control.js',
+ 'o2web/source/o2_core/o2/xAction/services/x_organization_assemble_control.js',
+ 'o2web/source/o2_core/o2/xAction/services/x_query_assemble_surface.js',
+ 'o2web/source/o2_core/o2/xAction/services/x_organization_assemble_personal.js',
+
+ 'o2web/source/x_desktop/js/base_portal_actions_temp.js',
+
+ 'o2web/source/x_desktop/js/base.js'
+ ];
+ var dest = 'target/o2server/servers/webServer/x_desktop/js/';
+ return gulp.src(src)
+ .pipe(concat('base_portal.js'))
+ .pipe(gulp.dest(dest))
+ .pipe(uglify())
+ .pipe(rename({ extname: '.min.js' }))
+ .pipe(gulp.dest(dest));
+}
+
+exports.build_concat = gulp.parallel(
+ build_concat_o2,
+ build_concat_desktop,
+ build_concat_xform,
+ build_bundle,
+ gulp.series(build_concat_basework_style, build_concat_basework_action, build_concat_basework_body,build_concat_basework_clean),
+ gulp.series(build_concat_baseportal_style, build_concat_baseportal_action, build_concat_baseportal_body,build_concat_baseportal_clean)
+);
function build_web_v_html() {
@@ -638,7 +849,20 @@ function chmod_sh(){
function chmod_servers(){
return (shell.task('chmod 777 -R target/o2server/servers'))();
}
-exports.build_web = gulp.series(build_web_minimize, build_web_move, gulp.parallel(build_concat_o2, build_concat_desktop, build_concat_xform, build_bundle, build_concat_basework), build_web_v_html, build_web_v_o2);
+exports.build_web = gulp.series(
+ build_web_minimize,
+ build_web_move,
+ gulp.parallel(
+ build_concat_o2,
+ build_concat_desktop,
+ build_concat_xform,
+ gulp.series(build_concat_basework_style, build_concat_basework_action, build_concat_basework_body,build_concat_basework_clean),
+ gulp.series(build_concat_baseportal_style, build_concat_baseportal_action, build_concat_baseportal_body,build_concat_baseportal_clean),
+ build_bundle
+ ),
+ build_web_v_html,
+ build_web_v_o2);
+
if (os.platform().indexOf("win")==-1){
exports.deploy = gulp.series(deploy_server, chmod_jvm, chmod_commons, chmod_sh, chmod_servers);
}else{
diff --git a/o2server/configSample/centerServer.json b/o2server/configSample/centerServer.json
index 9a8a25e125f1291667f256e75a45dd3d3133bf1f..de869d1039b5fa6212c9b525510c6d37b4bc7844 100644
--- a/o2server/configSample/centerServer.json
+++ b/o2server/configSample/centerServer.json
@@ -13,6 +13,7 @@
"statExclusions": "*.js,*.gif,*.jpg,*.png,*.css,*.ico",
"maxFormContent": 20.0,
"exposeJest": true,
+ "persistentConnectionsEnable": true,
"###enable": "是否启用###",
"###order": "center节点顺序,顺序排列0,1,2...###",
"###sslEnable": "是否启用ssl传输加密,如果启用将使用config/keystore文件作为密钥文件.使用config/token.json文件中的sslKeyStorePassword字段为密钥密码,sslKeyManagerPassword为管理密码.###",
@@ -27,5 +28,6 @@
"###statEnable": "启用统计,默认启用统计.###",
"###statExclusions": "统计忽略路径,默认忽略*.js,*.gif,*.jpg,*.png,*.css,*.ico###",
"###maxFormContent": "最大提交数据限制(M),限制有所上传的内容大小,包括附件.###",
- "###exposeJest": "暴露jest接口.###"
+ "###exposeJest": "暴露jest接口.###",
+ "###persistentConnectionsEnable": "是否启用长连接,默认false.###"
}
\ No newline at end of file
diff --git a/o2server/configSample/dingding.json b/o2server/configSample/dingding.json
index 1ee8b2c1d8d29dda299d0c40a1c91b68a28e97b9..838d323e5425e011cc56d1d454c38253b74d64f7 100644
--- a/o2server/configSample/dingding.json
+++ b/o2server/configSample/dingding.json
@@ -19,7 +19,7 @@
"###agentId": "agentId###",
"###appKey": "应用的key,唯一标识###",
"###appSecret": "应用的密钥###",
- "###syncCron": "组织同步cron,默认每10分钟同步一次.###",
+ "###syncCron": "回调信号触发同步检查,默认每10分钟运行一次,如果期间内有钉钉回调信号接收到,那么触发同步任务进行人员同步.###",
"###forceSyncCron": "强制拉入同步cron,默认在每天的8点和12点强制进行同步.###",
"###oapiAddress": "oapi服务器地址###",
"###workUrl": "钉钉消息打开工作的url地址,如:http://dev.o2oa.net/x_desktop/###",
diff --git a/o2server/configSample/externalStorageSources.json b/o2server/configSample/externalStorageSources.json
index 2f2c8996accf46968ef7addfff2b8229ac85f314..3c4199eb8a430e2ff8d9c7d4d79396cbe54f59e7 100644
--- a/o2server/configSample/externalStorageSources.json
+++ b/o2server/configSample/externalStorageSources.json
@@ -286,5 +286,29 @@
"###name": "存储节点名,对应存储名称,谨慎修改.###",
"###deepPath": "是否使用更深的路径.###"
}
+ ],
+ "general": [
+ {
+ "protocol": "webdav",
+ "username": "admin",
+ "password": "admin",
+ "host": "127.0.0.1",
+ "port": 8080.0,
+ "prefix": "",
+ "enable": true,
+ "weight": 100.0,
+ "name": "251",
+ "deepPath": false,
+ "###protocol": "协议,可选值ftp,webdav###",
+ "###username": "登录用户名.###",
+ "###password": "登录密码.###",
+ "###host": "主机地址.###",
+ "###port": "端口.###",
+ "###prefix": "前缀路径.###",
+ "###enable": "是否启用###",
+ "###weight": "设置权重.###",
+ "###name": "存储节点名,对应存储名称,谨慎修改.###",
+ "###deepPath": "是否使用更深的路径.###"
+ }
]
}
\ No newline at end of file
diff --git a/o2server/configSample/manifest.cfg b/o2server/configSample/manifest.cfg
index cc35f009db5b28e713e874239f00762e17868236..da4c786d84479b4af16da964f9c3aa47b88fa392 100644
--- a/o2server/configSample/manifest.cfg
+++ b/o2server/configSample/manifest.cfg
@@ -33,5 +33,6 @@
"vfs.json":"虚拟文件存储配置",
"welink.json":"华为WeLink配置",
"workTime.json":"工作时间配置",
- "zhengwuDingding.json":"政务钉钉配置"
+ "zhengwuDingding.json":"政务钉钉配置",
+ "web.json":"前端相关配置"
}
\ No newline at end of file
diff --git a/o2server/configSample/node_127.0.0.1.json b/o2server/configSample/node_127.0.0.1.json
index a50eeae2e00568755b61bfc76afff6e9730b55ec..778a757aa6478ca598173cb10efa6fcf40f99320 100644
--- a/o2server/configSample/node_127.0.0.1.json
+++ b/o2server/configSample/node_127.0.0.1.json
@@ -16,6 +16,7 @@
"statExclusions": "*.js,*.gif,*.jpg,*.png,*.css,*.ico",
"maxFormContent": 20.0,
"exposeJest": true,
+ "persistentConnectionsEnable": true,
"###enable": "是否启用###",
"###order": "center节点顺序,顺序排列0,1,2...###",
"###sslEnable": "是否启用ssl传输加密,如果启用将使用config/keystore文件作为密钥文件.使用config/token.json文件中的sslKeyStorePassword字段为密钥密码,sslKeyManagerPassword为管理密码.###",
@@ -30,7 +31,8 @@
"###statEnable": "启用统计,默认启用统计.###",
"###statExclusions": "统计忽略路径,默认忽略*.js,*.gif,*.jpg,*.png,*.css,*.ico###",
"###maxFormContent": "最大提交数据限制(M),限制有所上传的内容大小,包括附件.###",
- "###exposeJest": "暴露jest接口.###"
+ "###exposeJest": "暴露jest接口.###",
+ "###persistentConnectionsEnable": "是否启用长连接,默认false.###"
},
"application": {
"enable": true,
@@ -48,6 +50,7 @@
"statExclusions": "*.js,*.gif,*.jpg,*.png,*.css,*.ico",
"maxFormContent": 20.0,
"exposeJest": true,
+ "persistentConnectionsEnable": true,
"###enable": "是否启用###",
"###port": "http/https端口,负责向前端提供数据访问接口.默认为20020端口.###",
"###sslEnable": "是否启用ssl传输加密,如果启用将使用config/keystore文件作为密钥文件.使用config/token.json文件中的sslKeyStorePassword字段为密钥密码,sslKeyManagerPassword为管理密码.###",
@@ -62,7 +65,8 @@
"###statEnable": "启用统计,默认启用统计.###",
"###statExclusions": "统计忽略路径,默认忽略*.js,*.gif,*.jpg,*.png,*.css,*.ico###",
"###maxFormContent": "最大提交数据限制(M),限制有所上传的内容大小,包括附件.###",
- "###exposeJest": "暴露jest接口.###"
+ "###exposeJest": "暴露jest接口.###",
+ "###persistentConnectionsEnable": "是否启用长连接,默认false.###"
},
"web": {
"enable": true,
@@ -73,6 +77,7 @@
"statEnable": false,
"statExclusions": "*.gif,*.jpg,*.png,*.ico",
"cacheControlMaxAge": 0.0,
+ "persistentConnectionsEnable": true,
"###enable": "是否启用###",
"###port": "http/https端口,用户输入网址后实际访问的第一个端口.http协议默认为80端口,https默认为443端口.###",
"###sslEnable": "是否启用ssl传输加密,如果启用将使用config/keystore文件作为密钥文件.使用config/token.json文件中的sslKeyStorePassword字段为密钥密码,sslKeyManagerPassword为管理密码.###",
@@ -84,7 +89,8 @@
"###statExclusions": "统计忽略路径,默认忽略*.gif,*.jpg,*.png,*.ico###",
"###cacheControlMaxAge": "服务器max-age缓存时间(秒)###",
"###proxyCenterEnable": "是否启用center服务器代理.###",
- "###proxyApplicationEnable": "是否启用application服务器代理###"
+ "###proxyApplicationEnable": "是否启用application服务器代理###",
+ "###persistentConnectionsEnable": "是否启用长连接,默认true.###"
},
"data": {
"enable": true,
@@ -108,7 +114,7 @@
"###excludes": "在此节点上不存储的类,和includes一起设置实际存储的类,可以使用通配符*###",
"###jmxEnable": "是否启动jmx,如果启用,可以通过本地的jmx客户端进行访问,不支持远程jmx客户端.###",
"###cacheSize": "H2数据库缓存大小,设置H2用于作为缓存的内存大小,以M作为单位,这里默认为512M.###",
- "###logLevel": "默认日志级别,FATAL, ERROR, WARN, INFO, TRACE. 完成的配置为DefaultLevel\u003dWARN, Tool\u003dTRACE, Enhance\u003dTRACE, METADATA\u003dTRACE, Runtime\u003dTRACE, Query\u003dTRACE, DataCache\u003dTRACE, JDBC\u003dTRACE, SQL\u003dTRACE###",
+ "###logLevel": "默认日志级别,FATAL, ERROR, WARN, INFO, TRACE. 完整的配置为DefaultLevel\u003dWARN, Tool\u003dTRACE, Enhance\u003dTRACE, METADATA\u003dTRACE, Runtime\u003dTRACE, Query\u003dTRACE, DataCache\u003dTRACE, JDBC\u003dTRACE, SQL\u003dTRACE###",
"###maxTotal": "最大使用连接数###",
"###maxIdle": "最大空闲连接数###",
"###statEnable": "启用统计,默认启用###",
@@ -135,12 +141,12 @@
},
"logLevel": "warn",
"dumpData": {
- "enable": true,
+ "enable": false,
"cron": "",
"size": 7.0,
"path": "",
- "###enable": "是否启用,默认每天凌晨2点进行备份.###",
- "###cron": "定时任务cron表达式###",
+ "###enable": "是否启用,默认禁用.###",
+ "###cron": "定时任务cron表达式,默认每天凌晨2点进行备份.###",
"###size": "最大保留份数,超过将自动删除最久的数据.###",
"###path": "备份路径###"
},
diff --git a/o2server/configSample/qiyeweixin.json b/o2server/configSample/qiyeweixin.json
index 109d3c13614d87291d63a56bd3a11a3698979fa0..a01f75fe8c9707096ed2dd5062f622b491bfdd22 100644
--- a/o2server/configSample/qiyeweixin.json
+++ b/o2server/configSample/qiyeweixin.json
@@ -17,7 +17,7 @@
"attendanceSyncAgentId": "",
"attendanceSyncSecret": "",
"###enable": "是否启用.###",
- "###syncCron": "拉入同步cron,默认每10分钟同步一次.###",
+ "###syncCron": "回调信号触发同步检查,默认每10分钟运行一次,如果期间内有企业微信回调信号接收到,那么触发同步任务进行人员同步.###",
"###forceSyncCron": "强制拉入同步cron,默认在每天的8点和12点强制进行同步.###",
"###apiAddress": "api服务器地址###",
"###corpId": "企业微信corpId###",
diff --git a/o2server/configSample/vfs.json b/o2server/configSample/vfs.json
index a5428ea8f93542a1cd7d1f1d54623a522824680c..6d6b22858344748b837b2ae6892b6b4933b1ae3d 100644
--- a/o2server/configSample/vfs.json
+++ b/o2server/configSample/vfs.json
@@ -4,5 +4,8 @@
},
"ftps": {
"passive": true
+ },
+ "sftp": {
+ "passive": true
}
}
\ No newline at end of file
diff --git a/o2server/configSample/web.json b/o2server/configSample/web.json
new file mode 100644
index 0000000000000000000000000000000000000000..122e7c7ede322c0acef4b28555906d766ed52c0f
--- /dev/null
+++ b/o2server/configSample/web.json
@@ -0,0 +1,4 @@
+{
+ "mock": {},
+ "###mock": "使用Post模拟Put,Get模拟Delete的模块.###"
+}
\ No newline at end of file
diff --git a/o2server/configSample/zhengwuDingding.json b/o2server/configSample/zhengwuDingding.json
index 40d4b3c326eb0bda739bb2390ab07ea797139d27..6e3b4e7ba63d2c0f8e58c5b393fde07ed0a2adf8 100644
--- a/o2server/configSample/zhengwuDingding.json
+++ b/o2server/configSample/zhengwuDingding.json
@@ -21,7 +21,7 @@
"###appId": "政务钉钉appId###",
"###appSecret": "政务钉钉appSecret###",
"###agentId": "政务钉钉agentId###",
- "###syncCron": "拉入同步cron,默认每10分钟同步一次.###",
+ "###syncCron": "回调信号触发同步检查,默认每10分钟运行一次,如果期间内有政务钉钉回调信号接收到,那么触发同步任务进行人员同步.###",
"###forceSyncCron": "强制拉入同步cron,默认在每天的8点和12点强制进行同步.###",
"###oapiAddress": "oapi服务器地址###",
"###corpId": "政务钉钉corpId###",
diff --git a/o2server/pom.xml b/o2server/pom.xml
index 26f69acc5dc3e8c298222c1acc9cc52d8a894bdd..9662987b3e78c59f3432a332dc8d34ef811ced1f 100644
--- a/o2server/pom.xml
+++ b/o2server/pom.xml
@@ -1017,4 +1017,10 @@
+
+
+ o2oa-release
+ http://maven.o2oa.net/repository/o2oa-release/
+
+
diff --git a/o2server/x_attendance_assemble_control/pom.xml b/o2server/x_attendance_assemble_control/pom.xml
index 641ae1c6866a7ac0471f20c2fd4a25d7929745e0..bf0ee4c05852ea645537d0388410aa62902501d3 100644
--- a/o2server/x_attendance_assemble_control/pom.xml
+++ b/o2server/x_attendance_assemble_control/pom.xml
@@ -128,6 +128,12 @@
+
+ maven-deploy-plugin
+
+ true
+
+
diff --git a/o2server/x_base_core_project/src/main/java/com/x/base/core/container/EntityManagerContainer.java b/o2server/x_base_core_project/src/main/java/com/x/base/core/container/EntityManagerContainer.java
index bb314cff4fa9cfc72c1d80d52603ed20182e6ee2..f5e9bc1592463eb57b5b413f8e1d5a34a5440241 100644
--- a/o2server/x_base_core_project/src/main/java/com/x/base/core/container/EntityManagerContainer.java
+++ b/o2server/x_base_core_project/src/main/java/com/x/base/core/container/EntityManagerContainer.java
@@ -10,6 +10,7 @@ import java.util.Date;
import java.util.List;
import java.util.Map.Entry;
import java.util.Objects;
+import java.util.Optional;
import java.util.stream.Collectors;
import javax.persistence.EntityManager;
@@ -17,7 +18,6 @@ import javax.persistence.Query;
import javax.persistence.Tuple;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaDelete;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
@@ -644,6 +644,61 @@ public class EntityManagerContainer extends EntityManagerContainerBasic {
return os.stream().findFirst().orElse(null);
}
+ public Optional firstEqualAndLessThanOrEqualTo(Class cls, String attribute,
+ Object value, String otherAttribute, Comparable otherValue) throws Exception {
+ EntityManager em = this.get(cls);
+ CriteriaBuilder cb = em.getCriteriaBuilder();
+ CriteriaQuery cq = cb.createQuery(cls);
+ Root root = cq.from(cls);
+ cq.select(root)
+ .where(cb.and(cb.equal(root.get(attribute), value),
+ cb.lessThanOrEqualTo(root.get(otherAttribute), otherValue)))
+ .orderBy(cb.desc(root.get(otherAttribute)));
+ List os = em.createQuery(cq).setMaxResults(1).getResultList();
+ return os.stream().findFirst();
+ }
+
+ public Optional firstEqualAndLessThan(Class cls, String attribute, Object value,
+ String otherAttribute, Comparable otherValue) throws Exception {
+ EntityManager em = this.get(cls);
+ CriteriaBuilder cb = em.getCriteriaBuilder();
+ CriteriaQuery cq = cb.createQuery(cls);
+ Root root = cq.from(cls);
+ cq.select(root)
+ .where(cb.and(cb.equal(root.get(attribute), value), cb.lessThan(root.get(otherAttribute), otherValue)))
+ .orderBy(cb.desc(root.get(otherAttribute)));
+ List os = em.createQuery(cq).setMaxResults(1).getResultList();
+ return os.stream().findFirst();
+ }
+
+ public Optional firstEqualAndGreaterThanOrEqualTo(Class cls, String attribute,
+ Object value, String otherAttribute, Comparable otherValue) throws Exception {
+ EntityManager em = this.get(cls);
+ CriteriaBuilder cb = em.getCriteriaBuilder();
+ CriteriaQuery cq = cb.createQuery(cls);
+ Root root = cq.from(cls);
+ cq.select(root)
+ .where(cb.and(cb.equal(root.get(attribute), value),
+ cb.greaterThanOrEqualTo(root.get(otherAttribute), otherValue)))
+ .orderBy(cb.asc(root.get(otherAttribute)));
+ List os = em.createQuery(cq).setMaxResults(1).getResultList();
+ return os.stream().findFirst();
+ }
+
+ public Optional firstEqualAndGreaterThan(Class cls, String attribute, Object value,
+ String otherAttribute, Comparable otherValue) throws Exception {
+ EntityManager em = this.get(cls);
+ CriteriaBuilder cb = em.getCriteriaBuilder();
+ CriteriaQuery cq = cb.createQuery(cls);
+ Root root = cq.from(cls);
+ cq.select(root)
+ .where(cb.and(cb.equal(root.get(attribute), value),
+ cb.greaterThan(root.get(otherAttribute), otherValue)))
+ .orderBy(cb.asc(root.get(otherAttribute)));
+ List os = em.createQuery(cq).setMaxResults(1).getResultList();
+ return os.stream().findFirst();
+ }
+
public Long count(Class cls) throws Exception {
EntityManager em = this.get(cls);
CriteriaBuilder cb = em.getCriteriaBuilder();
@@ -888,8 +943,7 @@ public class EntityManagerContainer extends EntityManagerContainerBasic {
CriteriaQuery cq = cb.createQuery(String.class);
Root root = cq.from(cls);
cq.select(root.get(JpaObject.id_FIELDNAME)).where(cb.isMember(root.get(attribute), cb.literal(values)));
- return new ArrayList<>(
- em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList()));
+ return new ArrayList<>(em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList()));
}
public List idsNotIn(Class cls, String attribute,
diff --git a/o2server/x_base_core_project/src/main/java/com/x/base/core/container/factory/PersistenceXmlHelper.java b/o2server/x_base_core_project/src/main/java/com/x/base/core/container/factory/PersistenceXmlHelper.java
index 76254845c8765cb3e1db4426e6b9842b3ae79240..cae34a96a8bb8dfeee8f3f2f7b39eaf1baca8e47 100644
--- a/o2server/x_base_core_project/src/main/java/com/x/base/core/container/factory/PersistenceXmlHelper.java
+++ b/o2server/x_base_core_project/src/main/java/com/x/base/core/container/factory/PersistenceXmlHelper.java
@@ -172,7 +172,7 @@ public class PersistenceXmlHelper {
mapped_element.addText(o.getName());
}
}
- if(dynamicFlag) {
+ if (dynamicFlag) {
for (String className : names) {
if (className.startsWith(DynamicEntity.CLASS_PACKAGE)) {
dyClasses.add(className);
@@ -192,7 +192,7 @@ public class PersistenceXmlHelper {
mapped_element.addText(dyClass);
}
for (Class> o : JpaObjectTools.scanMappedSuperclass(DynamicBaseEntity.class)) {
- if(!o.getName().equals(DynamicBaseEntity.class.getName())) {
+ if (!o.getName().equals(DynamicBaseEntity.class.getName())) {
Element mapped_element = unit.addElement("class");
mapped_element.addText(o.getName());
}
@@ -296,6 +296,9 @@ public class PersistenceXmlHelper {
if (Config.externalDataSources().hasSchema()) {
properties.put("openjpa.jdbc.Schema", JpaObject.default_schema);
}
+ if (StringUtils.isNotEmpty(Config.externalDataSources().getTransactionIsolation())) {
+ properties.put("openjpa.jdbc.TransactionIsolation", Config.externalDataSources().getTransactionIsolation());
+ }
for (String name : Config.externalDataSources().findNamesOfContainerEntity(className)) {
properties.put("openjpa.ConnectionFactoryName", Config.RESOURCE_JDBC_PREFIX + name);
properties.put("openjpa.Log", Config.externalDataSources().log(name));
diff --git a/o2server/x_base_core_project/src/main/java/com/x/base/core/entity/JpaObject.java b/o2server/x_base_core_project/src/main/java/com/x/base/core/entity/JpaObject.java
index 57a5541e5f18dd4b9b8499441bfece0cf7115e4f..e27110a95339b40e395267463ece7efef9d92098 100644
--- a/o2server/x_base_core_project/src/main/java/com/x/base/core/entity/JpaObject.java
+++ b/o2server/x_base_core_project/src/main/java/com/x/base/core/entity/JpaObject.java
@@ -20,6 +20,7 @@ import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.reflect.FieldUtils;
import org.apache.openjpa.persistence.jdbc.ContainerTable;
+import org.apache.openjpa.persistence.jdbc.Strategy;
import com.x.base.core.entity.annotation.Flag;
import com.x.base.core.entity.annotation.RestrictFlag;
@@ -309,8 +310,15 @@ public abstract class JpaObject extends GsonPropertyObject implements Serializab
if (BooleanUtils.isTrue(excludeInvisible) && FieldsInvisible.contains(field.getName())) {
continue;
}
- if (BooleanUtils.isTrue(excludeLob) && (null != field.getAnnotation(Lob.class))) {
- continue;
+ if (BooleanUtils.isTrue(excludeLob)) {
+ if (null != field.getAnnotation(Lob.class)) {
+ continue;
+ } else {
+ Strategy strategy = field.getAnnotation(Strategy.class);
+ if ((null != strategy) && StringUtils.equals(JsonPropertiesValueHandler, strategy.value())) {
+ continue;
+ }
+ }
}
names.add(field.getName());
}
diff --git a/o2server/x_base_core_project/src/main/java/com/x/base/core/entity/StorageObject.java b/o2server/x_base_core_project/src/main/java/com/x/base/core/entity/StorageObject.java
index 51306750691480f82ea16a1b909ed06ece555e08..e65218fc7741f45b759c10b4fd7e3914810cb250 100644
--- a/o2server/x_base_core_project/src/main/java/com/x/base/core/entity/StorageObject.java
+++ b/o2server/x_base_core_project/src/main/java/com/x/base/core/entity/StorageObject.java
@@ -117,14 +117,6 @@ public abstract class StorageObject extends SliceJpaObject {
return this.updateContent(mapping, input);
}
- // /** 更新Content内容 */
- // public Long updateContent(StorageMapping mapping, byte[] bytes) throws
- // Exception {
- // try (ByteArrayInputStream bais = new ByteArrayInputStream(bytes)) {
- // return updateContent(mapping, bais);
- // }
- // }
-
/** 更新Content内容 */
public Long updateContent(StorageMapping mapping, byte[] bytes, String name) throws Exception {
try (ByteArrayInputStream bais = new ByteArrayInputStream(bytes)) {
@@ -148,64 +140,6 @@ public abstract class StorageObject extends SliceJpaObject {
/** 更新Content内容 */
public Long updateContent(StorageMapping mapping, InputStream input) throws Exception {
return updateContent(mapping, IOUtils.toByteArray(input));
- // long length = -1L;
- // FileSystemManager manager = this.getFileSystemManager();
- // String prefix = this.getPrefix(mapping);
- // String path = this.path();
- // if (StringUtils.isEmpty(path)) {
- // throw new Exception("path can not be empty.");
- // }
- // FileSystemOptions options = this.getOptions(mapping);
- // try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
- // /* 由于可以在传输过程中取消传输,先拷贝到内存 */
- // IOUtils.copyLarge(input, baos);
- // FileObject fo = null;
- // OutputStream output = null;
- // try {
- // /*
- // * 需要进行两次判断,在前端使用nginx分发的情况下,可能同时触发多个文件的上传,多个文件同时上传可能会同时创建文件的存储目录,会在后台导致错误
- // * org.apache.commons.vfs2.FileSystemException: Could not create folder
- // *
- // "ftp://processPlatform:***@o2.server01.com:20040/20200601/1beb018a-5009-4baa-a9ef-7e903f9d48ef".
- // * 这种情况下再次发起请求尝试获取文件可以解决这个问题.
- // */
- // try {
- // fo = manager.resolveFile(prefix + PATHSEPARATOR + path, options);
- // output = fo.getContent().getOutputStream();
- // } catch (FileSystemException fse) {
- // // 此段代码全部关闭对象,并要进行webdav判断进行关闭。
- // if (null != output) {
- // output.close();
- // }
- // if (null != fo) {
- // if (!Objects.equals(StorageProtocol.webdav, mapping.getProtocol())) {
- // /* webdav关闭会试图去关闭commons.httpClient */
- // manager.closeFileSystem(fo.getFileSystem());
- // }
- // fo.close();
- // }
- // fo = manager.resolveFile(prefix + PATHSEPARATOR + path, options);
- // output = fo.getContent().getOutputStream();
- // }
- // length = IOUtils.copyLarge(new ByteArrayInputStream(baos.toByteArray()),
- // output);
- // this.setLength(length);
- // if (!Objects.equals(StorageProtocol.webdav, mapping.getProtocol())) {
- // /* webdav关闭会试图去关闭commons.httpClient */
- // manager.closeFileSystem(fo.getFileSystem());
- // }
- // } finally {
- // if (null != output) {
- // output.close();
- // }
- // if (null != fo) {
- // fo.close();
- // }
- // }
- // }
- // this.setStorage(mapping.getName());
- // this.setLastUpdateTime(new Date());
- // return length;
}
/** 更新Content内容 */
@@ -229,7 +163,8 @@ public abstract class StorageObject extends SliceJpaObject {
OutputStream output = fo.getContent().getOutputStream()) {
length = IOUtils.copyLarge(new ByteArrayInputStream(bytes), output);
this.setLength(length);
- if (!Objects.equals(StorageProtocol.webdav, mapping.getProtocol())) {
+ if ((!Objects.equals(StorageProtocol.webdav, mapping.getProtocol()))
+ && (!Objects.equals(StorageProtocol.sftp, mapping.getProtocol()))) {
/* webdav关闭会试图去关闭commons.httpClient */
manager.closeFileSystem(fo.getFileSystem());
}
@@ -339,6 +274,12 @@ public abstract class StorageObject extends SliceJpaObject {
+ URLEncoder.encode(mapping.getPassword(), DefaultCharset.name) + "@" + mapping.getHost() + ":"
+ mapping.getPort();
break;
+ case sftp:
+ // ftps://[ username[: password]@] hostname[: port][ relative-path]
+ prefix = "sftp://" + URLEncoder.encode(mapping.getUsername(), DefaultCharset.name) + ":"
+ + URLEncoder.encode(mapping.getPassword(), DefaultCharset.name) + "@" + mapping.getHost() + ":"
+ + mapping.getPort();
+ break;
case cifs:
// smb://[ username[: password]@] hostname[: port][ absolute-path]
prefix = "smb://" + URLEncoder.encode(mapping.getUsername(), DefaultCharset.name) + ":"
@@ -369,6 +310,19 @@ public abstract class StorageObject extends SliceJpaObject {
switch (mapping.getProtocol()) {
// bzip2,file, ftp, ftps, gzip, hdfs, http, https, jar, ram, res, sftp,
// tar, temp, webdav, zip, cifs, mime;
+ case sftp:
+ FtpFileSystemConfigBuilder sftpBuilder = FtpFileSystemConfigBuilder.getInstance();
+ sftpBuilder.setPassiveMode(opts, Config.vfs().getSftp().getPassive());
+ /** 强制不校验IP */
+ sftpBuilder.setRemoteVerification(opts, false);
+ sftpBuilder.setFileType(opts, FtpFileType.BINARY);
+ sftpBuilder.setConnectTimeout(opts, 10000);
+ sftpBuilder.setSoTimeout(opts, 10000);
+ sftpBuilder.setControlEncoding(opts, DefaultCharset.name);
+ // By default, the path is relative to the user's home directory. This can be
+ // changed with:
+ sftpBuilder.setUserDirIsRoot(opts, false);
+ break;
case ftp:
FtpFileSystemConfigBuilder ftpBuilder = FtpFileSystemConfigBuilder.getInstance();
/*
diff --git a/o2server/x_base_core_project/src/main/java/com/x/base/core/entity/StorageProtocol.java b/o2server/x_base_core_project/src/main/java/com/x/base/core/entity/StorageProtocol.java
index 99a0745cd48bcc6e2b4ed8b2331e7123c355bd73..257d95355d4555594140e8a2fa87f0a1e5a91a78 100644
--- a/o2server/x_base_core_project/src/main/java/com/x/base/core/entity/StorageProtocol.java
+++ b/o2server/x_base_core_project/src/main/java/com/x/base/core/entity/StorageProtocol.java
@@ -1,6 +1,7 @@
package com.x.base.core.entity;
public enum StorageProtocol {
- ftp, ftps, webdav, cifs, file;
+ ftp, ftps, webdav, cifs, file, sftp;
+
public static final int length = JpaObject.length_16B;
}
diff --git a/o2server/x_base_core_project/src/main/java/com/x/base/core/entity/dynamic/DynamicEntityBuilder.java b/o2server/x_base_core_project/src/main/java/com/x/base/core/entity/dynamic/DynamicEntityBuilder.java
index 95439255327e033cbe86d1f4cce3cf703ffbf417..a088a7fc59d0a1ee48667699f070a8272b28ee97 100644
--- a/o2server/x_base_core_project/src/main/java/com/x/base/core/entity/dynamic/DynamicEntityBuilder.java
+++ b/o2server/x_base_core_project/src/main/java/com/x/base/core/entity/dynamic/DynamicEntityBuilder.java
@@ -16,7 +16,6 @@ import javax.persistence.OrderColumn;
import javax.persistence.Table;
import javax.persistence.Temporal;
-import org.apache.commons.lang3.StringUtils;
import org.apache.openjpa.persistence.PersistentCollection;
import org.apache.openjpa.persistence.PersistentMap;
import org.apache.openjpa.persistence.jdbc.ContainerTable;
@@ -42,6 +41,7 @@ import com.x.base.core.entity.annotation.ContainerEntity;
import com.x.base.core.entity.dynamic.DynamicEntity.Field;
import com.x.base.core.project.annotation.FieldDescribe;
import com.x.base.core.project.tools.ListTools;
+import com.x.base.core.project.tools.StringTools;
public class DynamicEntityBuilder {
@@ -196,10 +196,10 @@ public class DynamicEntityBuilder {
FieldSpec fieldSpec = FieldSpec.builder(typeClass, field.getName(), Modifier.PRIVATE)
.addAnnotation(this.fieldDescribe(field)).addAnnotation(this.index(field))
.addAnnotation(this.checkPersist(field)).addAnnotation(column).build();
- MethodSpec get = MethodSpec.methodBuilder("get" + StringUtils.capitalize(field.getName()))
+ MethodSpec get = MethodSpec.methodBuilder(StringTools.getMethodName(field.getName()))
.addModifiers(Modifier.PUBLIC).returns(typeClass).addStatement("return this." + field.getName())
.build();
- MethodSpec set = MethodSpec.methodBuilder("set" + StringUtils.capitalize(field.getName()))
+ MethodSpec set = MethodSpec.methodBuilder(StringTools.setMethodName(field.getName()))
.addModifiers(Modifier.PUBLIC).returns(void.class).addParameter(typeClass, field.getName())
.addStatement("this." + field.getName() + " = " + field.getName()).build();
builder.addField(this.fieldName(field)).addField(fieldSpec).addMethod(get).addMethod(set);
@@ -222,10 +222,10 @@ public class DynamicEntityBuilder {
FieldSpec fieldSpec = FieldSpec.builder(Date.class, field.getName(), Modifier.PRIVATE)
.addAnnotation(this.fieldDescribe(field)).addAnnotation(this.index(field))
.addAnnotation(this.checkPersist(field)).addAnnotation(column).addAnnotation(temporal).build();
- MethodSpec get = MethodSpec.methodBuilder("get" + StringUtils.capitalize(field.getName()))
+ MethodSpec get = MethodSpec.methodBuilder(StringTools.getMethodName(field.getName()))
.addModifiers(Modifier.PUBLIC).returns(Date.class).addStatement("return this." + field.getName())
.build();
- MethodSpec set = MethodSpec.methodBuilder("set" + StringUtils.capitalize(field.getName()))
+ MethodSpec set = MethodSpec.methodBuilder(StringTools.setMethodName(field.getName()))
.addModifiers(Modifier.PUBLIC).returns(void.class).addParameter(Date.class, field.getName())
.addStatement("this." + field.getName() + " = " + field.getName()).build();
builder.addField(this.fieldName(field)).addField(fieldSpec).addMethod(get).addMethod(set);
@@ -249,10 +249,10 @@ public class DynamicEntityBuilder {
FieldSpec fieldSpec = FieldSpec.builder(Date.class, field.getName(), Modifier.PRIVATE)
.addAnnotation(this.fieldDescribe(field)).addAnnotation(this.index(field))
.addAnnotation(this.checkPersist(field)).addAnnotation(column).addAnnotation(temporal).build();
- MethodSpec get = MethodSpec.methodBuilder("get" + StringUtils.capitalize(field.getName()))
+ MethodSpec get = MethodSpec.methodBuilder(StringTools.getMethodName(field.getName()))
.addModifiers(Modifier.PUBLIC).returns(Date.class).addStatement("return this." + field.getName())
.build();
- MethodSpec set = MethodSpec.methodBuilder("set" + StringUtils.capitalize(field.getName()))
+ MethodSpec set = MethodSpec.methodBuilder(StringTools.setMethodName(field.getName()))
.addModifiers(Modifier.PUBLIC).returns(void.class).addParameter(Date.class, field.getName())
.addStatement("this." + field.getName() + " = " + field.getName()).build();
builder.addField(this.fieldName(field)).addField(fieldSpec).addMethod(get).addMethod(set);
@@ -276,10 +276,10 @@ public class DynamicEntityBuilder {
FieldSpec fieldSpec = FieldSpec.builder(Date.class, field.getName(), Modifier.PRIVATE)
.addAnnotation(this.fieldDescribe(field)).addAnnotation(this.index(field))
.addAnnotation(this.checkPersist(field)).addAnnotation(column).addAnnotation(temporal).build();
- MethodSpec get = MethodSpec.methodBuilder("get" + StringUtils.capitalize(field.getName()))
+ MethodSpec get = MethodSpec.methodBuilder(StringTools.getMethodName(field.getName()))
.addModifiers(Modifier.PUBLIC).returns(Date.class).addStatement("return this." + field.getName())
.build();
- MethodSpec set = MethodSpec.methodBuilder("set" + StringUtils.capitalize(field.getName()))
+ MethodSpec set = MethodSpec.methodBuilder(StringTools.setMethodName(field.getName()))
.addModifiers(Modifier.PUBLIC).returns(void.class).addParameter(Date.class, field.getName())
.addStatement("this." + field.getName() + " = " + field.getName()).build();
builder.addField(this.fieldName(field)).addField(fieldSpec).addMethod(get).addMethod(set);
@@ -365,10 +365,10 @@ public class DynamicEntityBuilder {
FieldSpec fieldSpec = FieldSpec.builder(list_type, field.getName(), Modifier.PRIVATE)
.addAnnotation(this.fieldDescribe(field)).addAnnotation(containerTable).addAnnotation(elementIndex)
.addAnnotation(persistentCollection).addAnnotation(orderColumn).addAnnotation(elementColumn).build();
- MethodSpec get = MethodSpec.methodBuilder("get" + StringUtils.capitalize(field.getName()))
+ MethodSpec get = MethodSpec.methodBuilder(StringTools.getMethodName(field.getName()))
.addModifiers(Modifier.PUBLIC).returns(list_type).addStatement("return this." + field.getName())
.build();
- MethodSpec set = MethodSpec.methodBuilder("set" + StringUtils.capitalize(field.getName()))
+ MethodSpec set = MethodSpec.methodBuilder(StringTools.setMethodName(field.getName()))
.addModifiers(Modifier.PUBLIC).returns(void.class).addParameter(list_type, field.getName())
.addStatement("this." + field.getName() + " = " + field.getName()).build();
builder.addField(this.fieldName(field)).addField(fieldSpec).addMethod(get).addMethod(set);
@@ -401,10 +401,10 @@ public class DynamicEntityBuilder {
FieldSpec fieldSpec = FieldSpec.builder(String.class, field.getName(), Modifier.PRIVATE)
.addAnnotation(this.fieldDescribe(field)).addAnnotation(lob).addAnnotation(basic).addAnnotation(column)
.build();
- MethodSpec get = MethodSpec.methodBuilder("get" + StringUtils.capitalize(field.getName()))
+ MethodSpec get = MethodSpec.methodBuilder(StringTools.getMethodName(field.getName()))
.addModifiers(Modifier.PUBLIC).returns(String.class).addStatement("return this." + field.getName())
.build();
- MethodSpec set = MethodSpec.methodBuilder("set" + StringUtils.capitalize(field.getName()))
+ MethodSpec set = MethodSpec.methodBuilder(StringTools.setMethodName(field.getName()))
.addModifiers(Modifier.PUBLIC).returns(void.class).addParameter(String.class, field.getName())
.addStatement("this." + field.getName() + " = " + field.getName()).build();
builder.addField(this.fieldName(field)).addField(fieldSpec).addMethod(get).addMethod(set);
@@ -467,9 +467,9 @@ public class DynamicEntityBuilder {
.addAnnotation(keyColumn).addAnnotation(elementColumn).addAnnotation(elementIndex)
.addAnnotation(keyIndex).build();
- MethodSpec get = MethodSpec.methodBuilder("get" + StringUtils.capitalize(field.getName()))
+ MethodSpec get = MethodSpec.methodBuilder(StringTools.getMethodName(field.getName()))
.addModifiers(Modifier.PUBLIC).returns(map_type).addStatement("return this." + field.getName()).build();
- MethodSpec set = MethodSpec.methodBuilder("set" + StringUtils.capitalize(field.getName()))
+ MethodSpec set = MethodSpec.methodBuilder(StringTools.setMethodName(field.getName()))
.addModifiers(Modifier.PUBLIC).returns(void.class).addParameter(map_type, field.getName())
.addStatement("this." + field.getName() + " = " + field.getName()).build();
builder.addField(this.fieldName(field)).addField(fieldSpec).addMethod(get).addMethod(set);
diff --git a/o2server/x_base_core_project/src/main/java/com/x/base/core/openjpa/jdbc/sql/Kingbase8Dictionary.java b/o2server/x_base_core_project/src/main/java/com/x/base/core/openjpa/jdbc/sql/Kingbase8Dictionary.java
index 10a987734cbdd9d891753288f34d72c65cda6fa0..254e071a17a236dbdbd5ee990688c92d7ab11376 100644
--- a/o2server/x_base_core_project/src/main/java/com/x/base/core/openjpa/jdbc/sql/Kingbase8Dictionary.java
+++ b/o2server/x_base_core_project/src/main/java/com/x/base/core/openjpa/jdbc/sql/Kingbase8Dictionary.java
@@ -27,7 +27,7 @@ public class Kingbase8Dictionary extends DBDictionary {
public String namedSequenceFromOneSchemaSQL = "select SYS_NAMESPACE.NSPNAME as SEQUENCE_SCHEMA, SYS_CLASS.RELNAME as SEQUENCE_NAME from SYS_NAMESPACE,SYS_CLASS where SYS_NAMESPACE.OID=SYS_CLASS.RELNAMESPACE and SYS_CLASS.RELKIND='S' AND SYS_CLASS.RELNAME = ? AND SYS_NAMESPACE.NSPNAME = ?";
public Kingbase8Dictionary() {
- this.platform = "KingbaseES";
+ this.platform = "KingbaseES8";
this.validationSQL = "SELECT NOW()";
this.supportsSelectStartIndex = true;
this.supportsSelectEndIndex = true;
diff --git a/o2server/x_base_core_project/src/main/java/com/x/base/core/openjpa/jdbc/sql/Kingbase8DictionaryBack.java b/o2server/x_base_core_project/src/main/java/com/x/base/core/openjpa/jdbc/sql/Kingbase8DictionaryBack.java
deleted file mode 100644
index 004034793e63e6b33a270ffff23580683bff2e3a..0000000000000000000000000000000000000000
--- a/o2server/x_base_core_project/src/main/java/com/x/base/core/openjpa/jdbc/sql/Kingbase8DictionaryBack.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package com.x.base.core.openjpa.jdbc.sql;
-
-import java.sql.Connection;
-import java.sql.DatabaseMetaData;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-
-import org.apache.openjpa.jdbc.schema.Column;
-import org.apache.openjpa.jdbc.sql.BooleanRepresentation;
-import org.apache.openjpa.jdbc.sql.BooleanRepresentationFactory;
-import org.apache.openjpa.jdbc.sql.DBDictionary;
-import org.apache.openjpa.lib.util.Localizer;
-
-public class Kingbase8DictionaryBack extends DBDictionary {
-
- public static final String VENDOR_DAMENG = "Kingbase8";
- private static final Localizer _loc = Localizer.forPackage(DMDictionary.class);
-
- public Kingbase8DictionaryBack() {
- this.platform = "Kingbase8";
- supportsDeferredConstraints = false;
- }
-
- public void connectedConfiguration(Connection conn) throws SQLException {
- super.connectedConfiguration(conn);
- boolean requiresWarnings = true;
- DatabaseMetaData meta = conn.getMetaData();
- String driverName = meta.getDriverName();
- String url = meta.getURL();
- if (this.driverVendor == null) {
- if ((driverName != null) && (driverName.equalsIgnoreCase("com.kingbase8.Driver"))) {
- this.driverVendor = "Kingbase8JdbcDriver";
- if ((url != null) && (url.startsWith("jdbc:kingbase8://"))) {
- requiresWarnings = false;
- }
- } else {
- this.driverVendor = "other";
- }
- }
- if (("Kingbase8JdbcDriver".equalsIgnoreCase(this.driverVendor)) && (requiresWarnings)) {
- this.log.warn(_loc.get("kingbase8 Jdbc connection", url));
- }
- }
-
- protected BooleanRepresentation booleanRepresentation = BooleanRepresentationFactory.BOOLEAN;
-
- /**
- * Convert the specified column of the SQL ResultSet to the proper java type.
- */
- public boolean getBoolean(ResultSet rs, int column) throws SQLException {
- return booleanRepresentation.getBoolean(rs, column);
- }
-
- /**
- * Set the given value as a parameter to the statement.
- */
- public void setBoolean(PreparedStatement stmnt, int idx, boolean val, Column col) throws SQLException {
- booleanRepresentation.setBoolean(stmnt, idx, val);
- }
-
- public String booleanTypeName = "BOOL";
-
-}
diff --git a/o2server/x_base_core_project/src/main/java/com/x/base/core/openjpa/jdbc/sql/Kingbase8R6Dictionary.java b/o2server/x_base_core_project/src/main/java/com/x/base/core/openjpa/jdbc/sql/Kingbase8R6Dictionary.java
new file mode 100644
index 0000000000000000000000000000000000000000..1fba7c79094f032d2b1a6e4e397adab36ec084b1
--- /dev/null
+++ b/o2server/x_base_core_project/src/main/java/com/x/base/core/openjpa/jdbc/sql/Kingbase8R6Dictionary.java
@@ -0,0 +1,254 @@
+package com.x.base.core.openjpa.jdbc.sql;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Arrays;
+import java.util.Date;
+
+import org.apache.openjpa.jdbc.kernel.exps.FilterValue;
+import org.apache.openjpa.jdbc.schema.Column;
+import org.apache.openjpa.jdbc.schema.Sequence;
+import org.apache.openjpa.jdbc.schema.Table;
+import org.apache.openjpa.jdbc.sql.BooleanRepresentation;
+import org.apache.openjpa.jdbc.sql.BooleanRepresentationFactory;
+import org.apache.openjpa.jdbc.sql.DBDictionary;
+import org.apache.openjpa.jdbc.sql.SQLBuffer;
+import org.apache.openjpa.lib.jdbc.DelegatingConnection;
+import org.apache.openjpa.lib.jdbc.DelegatingPreparedStatement;
+
+public class Kingbase8R6Dictionary extends DBDictionary {
+ public String allSequencesSQL = "select SYS_NAMESPACE.NSPNAME as SEQUENCE_SCHEMA, SYS_CLASS.RELNAME as SEQUENCE_NAME from SYS_NAMESPACE,SYS_CLASS where SYS_NAMESPACE.OID=SYS_CLASS.RELNAMESPACE and SYS_CLASS.RELKIND='S'";
+ public String namedSequencesFromAllSchemasSQL = "select SYS_NAMESPACE.NSPNAME as SEQUENCE_SCHEMA, SYS_CLASS.RELNAME as SEQUENCE_NAME from SYS_NAMESPACE,SYS_CLASS where SYS_NAMESPACE.OID=SYS_CLASS.RELNAMESPACE and SYS_CLASS.RELKIND='S' AND SYS_CLASS.RELNAME = ?";
+ public String allSequencesFromOneSchemaSQL = "select SYS_NAMESPACE.NSPNAME as SEQUENCE_SCHEMA, SYS_CLASS.RELNAME as SEQUENCE_NAME from SYS_NAMESPACE,SYS_CLASS where SYS_NAMESPACE.OID=SYS_CLASS.RELNAMESPACE and SYS_CLASS.RELKIND='S' AND SYS_NAMESPACE.NSPNAME = ?";
+ public String namedSequenceFromOneSchemaSQL = "select SYS_NAMESPACE.NSPNAME as SEQUENCE_SCHEMA, SYS_CLASS.RELNAME as SEQUENCE_NAME from SYS_NAMESPACE,SYS_CLASS where SYS_NAMESPACE.OID=SYS_CLASS.RELNAMESPACE and SYS_CLASS.RELKIND='S' AND SYS_CLASS.RELNAME = ? AND SYS_NAMESPACE.NSPNAME = ?";
+
+ public Kingbase8R6Dictionary() {
+ this.platform = "KingbaseES8R6";
+ // 适配 V8R6
+ this.schemaCase = SCHEMA_CASE_LOWER;
+ // 适配 V8R6
+ this.doubleTypeName = "DOUBLE PRECISION";
+ this.validationSQL = "SELECT NOW()";
+ this.supportsSelectStartIndex = true;
+ this.supportsSelectEndIndex = true;
+ this.supportsLockingWithDistinctClause = false;
+ this.maxTableNameLength = 63;
+ this.maxColumnNameLength = 63;
+ this.maxIndexNameLength = 63;
+ this.maxConstraintNameLength = 63;
+ this.maxAutoAssignNameLength = 63;
+ this.lastGeneratedKeyQuery = "SELECT CURRVAL(''{2}'')";
+ this.supportsAutoAssign = true;
+ this.autoAssignTypeName = "INT IDENTITY";
+ this.nextSequenceQuery = "SELECT NEXTVAL(''{0}'')";
+ this.binaryTypeName = "BYTEA";
+ this.longVarbinaryTypeName = "BYTEA";
+ this.varbinaryTypeName = "BYTEA";
+ this.longVarcharTypeName = "TEXT";
+ this.charTypeName = "CHAR{0}";
+ this.varcharTypeName = "VARCHAR{0}";
+ /* add by Ray */
+ this.bitTypeName = "BOOL";
+ this.systemSchemaSet.addAll(Arrays.asList(new String[] { "INFORMATION_SCHEMA", "SYS_CATALOG" }));
+ this.fixedSizeTypeNameSet.addAll(Arrays.asList(new String[] { "TEXT", "XML", "INTERVAL YEAR", "INTERVAL MONTH",
+ "INTERVAL DAY", "INTERVAL HOUR", "INTERVAL MINUTE", "INTERVAL SECOND", " INTERVAL YEAR TO MONTH",
+ "INTERVAL DAY TO SECOND", "BIT VARYING", "BYTEA", "BOOLEAN" }));
+ this.reservedWordSet.addAll(Arrays.asList(new String[] { "ABORT", "ABSOLUTE", "ACCESS", "ACTION", "ADD",
+ "ADMIN", "AFTER", "AGGREGATE", "ALL", "ALSO", "ALTER", "ANALYSE", "ANALYZE", "AND", "ANY", "ARRAY",
+ "AS", "ASC", "ASSERTION", "ASSIGNMENT", "ASYMMETRIC", "AT", "AUTHID", "AUTHORIZATION", "BACKWARD",
+ "BEFORE", "BEGIN", "BETWEEN", "BIGINT", "BINARY", "BIT", "BODY", "BOOLEAN", "BOTH", "BY", "CACHE",
+ "CALL", "CALLED", "CASCADE", "CASCADED", "CASE", "CAST", "CHAIN", "CHAR", "CHARACTER",
+ "CHARACTERISTICS", "CHECK", "CHECKALLOCATE", "CHECKCATALOG", "CHECKDB", "CHECKINDEX", "CHECKPOINT",
+ "CHECKTABLE", "CHECKTABLESPACE", "CLASS", "CLOSE", "CLUSTER", "COALESCE", "COLLATE", "COLUMN",
+ "COMMENT", "COMMIT", "COMMITTED", "CONCURRENTLY", "CONNECTION", "CONSTANT", "CONSTRAINT", "CONSTRAINTS",
+ "CONVERSION", "CONVERT", "COPY", "CREATE", "CREATEDB", "CREATEROLE", "CREATEUSER", "CROSS", "CSV",
+ "CURRENT_DATE", "CURRENT_ROLE", "CURRENT_TIME", "CURRENT_TIMESTAMP", "CURRENT_USER", "CURSOR", "CYCLE",
+ "DATABASE", "DATAFILE", "DATEADD", "DATEDIFF", "DATEPART", "DAY", "DBCC", "DEALLOCATE", "DEC",
+ "DECIMAL", "DECLARE", "DEFAULT", "DEFAULTS", "DEFERRABLE", "DEFERRED", "DEFINER", "DELETE", "DELIMITER",
+ "DELIMITERS", "DESC", "DISABLE", "DISTINCT", "DO", "DOMAIN", "DOUBLE", "DROP", "EACH", "ELSE", "ENABLE",
+ "ENCODING", "ENCRYPTED", "END", "ESCAPE", "EXCEPT", "EXCLUDING", "EXCLUSIVE", "EXECUTE", "EXISTS",
+ "EXPLAIN", "EXTERNAL", "EXTERNALLY", "EXTRACT", "FALSE", "FETCH", "FILEGROWTH", "FILENAME", "FIRST",
+ "FLOAT", "FOR", "FORCE", "FOREIGN", "FORWARD", "FREEZE", "FROM", "FULL", "FUNCTION", "GETDATE",
+ "GLOBAL", "GRANT", "GRANTED", "GREATEST", "GROUP", "HANDLER", "HAVING", "HOLD", "HOUR", "IDENTIFIED",
+ "IDENTITY", "IF", "IFNULL", "ILIKE", "IMMEDIATE", "IMMUTABLE", "IMPLICIT", "IN", "INCLUDING",
+ "INCREMENT", "INDEX", "INDEXES", "INHERIT", "INHERITS", "INITIALLY", "INNER", "INOUT", "INPUT",
+ "INSENSITIVE", "INSERT", "INSTEAD", "INT", "INTEGER", "INTERNAL", "INTERSECT", "INTERVAL", "INTO",
+ "INVOKER", "IS", "ISNULL", "ISOLATION", "JOIN", "KEY", "LANCOMPILER", "LANGUAGE", "LARGE", "LAST",
+ "LEADING", "LEAST", "LEFT", "LEVEL", "LIKE", "LIMIT", "LINK", "LIST", "LISTEN", "LOAD", "LOCAL",
+ "LOCALTIME", "LOCALTIMESTAMP", "LOCATION", "LOCK", "LOGFILE", "LOGIN", "MATCH", "MAXSIZE", "MAXVALUE",
+ "MINUTE", "MINVALUE", "MODE", "MODIFY", "MONTH", "MOVE", "NAME", "NAMES", "NATIONAL", "NATURAL",
+ "NCHAR", "NEW", "NEXT", "NO", "NOALLOCATE", "NOCONSTRAINT", "NOCREATEDB", "NOCREATEROLE",
+ "NOCREATEUSER", "NOINDEX", "NOINHERIT", "NOLOGIN", "NONE", "NOSUPERUSER", "NOT", "NOTHING", "NOTIFY",
+ "NOTNULL", "NOWAIT", "NULL", "NULLIF", "NUMERIC", "OBJECT", "OF", "OFF", "OFFSET", "OIDS", "OLD", "ON",
+ "ONLY", "OPERATOR", "OPTION", "OR", "ORDER", "OUT", "OUTER", "OVERLAPS", "OVERLAY", "OWNED", "OWNER",
+ "PACKAGE", "PARTIAL", "PASSWORD", "PERCENT", "PLACING", "POSITION", "PRECISION", "PREPARE", "PREPARED",
+ "PRESERVE", "PRIMARY", "PRIOR", "PRIVILEGES", "PROCEDURAL", "PROCEDURE", "QUOTE", "READ", "REAL",
+ "REASSIGN", "RECHECK", "REFERENCES", "REINDEX", "RELATIVE", "RELEASE", "REMOVE", "RENAME", "REPEATABLE",
+ "REPLACE", "RESET", "RESIZE", "RESTART", "RESTRICT", "RETURNING", "RETURNS", "REVOKE", "RIGHT", "ROLE",
+ "ROLLBACK", "ROW", "ROWNUM", "ROWS", "ROWTYPE", "RULE", "SAVEPOINT", "SCHEMA", "SCROLL", "SECOND",
+ "SECURITY", "SELECT", "SEQUENCE", "SERIALIZABLE", "SESSION", "SESSION_USER", "SET", "SETOF", "SHARE",
+ "SHOW", "SIMILAR", "SIMPLE", "SIZE", "SMALLINT", "SOME", "STABLE", "START", "STATEMENT", "STATISTICS",
+ "STDIN", "STDOUT", "STORAGE", "STRICT", "SUBSTRING", "SUPERUSER", "SWITCH", "SYMMETRIC", "SYSDATE",
+ "SYSID", "SYSTEM", "TABLE", "TABLESPACE", "TEMP", "TEMPFILE", "TEMPLATE", "TEMPORARY", "THEN", "TIME",
+ "TIMESTAMP", "TIMESTAMPADD", "TIMESTAMPDIFF", "TINYINT", "TO", "TOP", "TRAILING", "TRANSACTION",
+ "TREAT", "TRIGGER", "TRIM", "TRUE", "TRUNCATE", "TRUSTED", "TYPE", "UNCOMMITTED", "UNENCRYPTED",
+ "UNION", "UNIQUE", "UNKNOWN", "UNLISTEN", "UNTIL", "UPDATE", "USAGE", "USER", "USING", "VACUUM",
+ "VALID", "VALIDATOR", "VALUES", "VARCHAR", "VARCHAR2", "VARYING", "VERBOSE", "VIEW", "VOLATILE", "WHEN",
+ "WHERE", "WITH", "WITHOUT", "WORK", "WRITE", "YEAR", "ZONE", "BLOB", "BYTEA", "CLOB", "DATE", "TEXT",
+ "TIMESTAMPTZ", "TIMETZ", "RETURN", "ROWCOUNT", "CMAX", "CMIN", "CTID", "OID", "TABLEOID", "XMAX",
+ "XMIN" }));
+ }
+
+ public Date getDate(ResultSet paramResultSet, int paramInt) throws SQLException {
+ try {
+ return super.getDate(paramResultSet, paramInt);
+ } catch (StringIndexOutOfBoundsException localStringIndexOutOfBoundsException) {
+ String str = paramResultSet.getString(paramInt);
+ SimpleDateFormat localSimpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.SS");
+ try {
+ return localSimpleDateFormat.parse(str);
+ } catch (ParseException localParseException) {
+ throw new SQLException(localParseException.toString());
+ }
+ }
+ }
+
+ /* add by Ray */
+ protected BooleanRepresentation booleanRepresentation = BooleanRepresentationFactory.BOOLEAN;
+
+ /**
+ * Convert the specified column of the SQL ResultSet to the proper java type.
+ */
+ public boolean getBoolean(ResultSet rs, int column) throws SQLException {
+ return booleanRepresentation.getBoolean(rs, column);
+ }
+
+ /**
+ * Set the given value as a parameter to the statement.
+ */
+ public void setBoolean(PreparedStatement stmnt, int idx, boolean val, Column col) throws SQLException {
+ booleanRepresentation.setBoolean(stmnt, idx, val);
+ }
+
+// public void setBoolean(PreparedStatement paramPreparedStatement, int paramInt, boolean paramBoolean,
+// Column paramColumn) throws SQLException {
+// paramPreparedStatement.setBoolean(paramInt, paramBoolean);
+// }
+
+ /* add by Ray end */
+
+ protected void appendSelectRange(SQLBuffer paramSQLBuffer, long paramLong1, long paramLong2, boolean paramBoolean) {
+ if (paramLong2 != Long.MAX_VALUE) {
+ paramSQLBuffer.append(" LIMIT ").appendValue(paramLong2 - paramLong1);
+ }
+ if (paramLong1 != 0L) {
+ paramSQLBuffer.append(" OFFSET ").appendValue(paramLong1);
+ }
+ }
+
+ public void indexOf(SQLBuffer paramSQLBuffer, FilterValue paramFilterValue1, FilterValue paramFilterValue2,
+ FilterValue paramFilterValue3) {
+ paramSQLBuffer.append("(POSITION(");
+ paramFilterValue2.appendTo(paramSQLBuffer);
+ paramSQLBuffer.append(" IN ");
+ if (paramFilterValue3 != null) {
+ substring(paramSQLBuffer, paramFilterValue1, paramFilterValue3, null);
+ } else {
+ paramFilterValue1.appendTo(paramSQLBuffer);
+ }
+ paramSQLBuffer.append(") - 1");
+ if (paramFilterValue3 != null) {
+ paramSQLBuffer.append(" + ");
+ paramFilterValue3.appendTo(paramSQLBuffer);
+ }
+ paramSQLBuffer.append(")");
+ }
+
+ public String[] getCreateSequenceSQL(Sequence paramSequence) {
+ String[] arrayOfString = super.getCreateSequenceSQL(paramSequence);
+ if (paramSequence.getAllocate() > 1) {
+ int tmp23_22 = 0;
+ String[] tmp23_21 = arrayOfString;
+ tmp23_21[tmp23_22] = (tmp23_21[tmp23_22] + " CACHE " + paramSequence.getAllocate());
+ }
+ return arrayOfString;
+ }
+
+ protected String getSequencesSQL(String paramString1, String paramString2) {
+ if ((paramString1 == null) && (paramString2 == null)) {
+ return this.allSequencesSQL;
+ }
+ if (paramString1 == null) {
+ return this.namedSequencesFromAllSchemasSQL;
+ }
+ if (paramString2 == null) {
+ return this.allSequencesFromOneSchemaSQL;
+ }
+ return this.namedSequenceFromOneSchemaSQL;
+ }
+
+ public boolean isSystemSequence(String paramString1, String paramString2, boolean paramBoolean) {
+ if (super.isSystemSequence(paramString1, paramString2, paramBoolean)) {
+ return true;
+ }
+ int i = paramString1.indexOf('_');
+ return (i != -1) && (i != paramString1.length() - 4) && (paramString1.toUpperCase().endsWith("_SEQ"));
+ }
+
+ public boolean isSystemTable(String paramString1, String paramString2, boolean paramBoolean) {
+ return (super.isSystemTable(paramString1, paramString2, paramBoolean))
+ || ((paramString1 != null) && (paramString1.toLowerCase().startsWith("sys_")));
+ }
+
+ public boolean isSystemIndex(String paramString, Table paramTable) {
+ return (super.isSystemIndex(paramString, paramTable))
+ || ((paramString != null) && (paramString.toLowerCase().startsWith("sys_")));
+ }
+
+ public Connection decorate(Connection paramConnection) throws SQLException {
+ return new KingbaseConnection(super.decorate(paramConnection), this);
+ }
+
+ private static class KingbasePreparedStatement extends DelegatingPreparedStatement {
+ public KingbasePreparedStatement(PreparedStatement paramPreparedStatement, Connection paramConnection,
+ Kingbase8R6Dictionary paramKingbaseDictionary) {
+ super(paramPreparedStatement, paramConnection);
+ }
+
+ protected ResultSet executeQuery(boolean paramBoolean) throws SQLException {
+ try {
+ return super.executeQuery(paramBoolean);
+ } catch (SQLException localSQLException) {
+ ResultSet localResultSet = getResultSet(paramBoolean);
+ if (localResultSet == null) {
+ throw localSQLException;
+ }
+ return localResultSet;
+ }
+ }
+ }
+
+ private static class KingbaseConnection extends DelegatingConnection {
+ private final Kingbase8R6Dictionary _dict;
+
+ public KingbaseConnection(Connection paramConnection, Kingbase8R6Dictionary paramKingbaseDictionary) {
+ super(paramConnection);
+ this._dict = paramKingbaseDictionary;
+ }
+
+ protected PreparedStatement prepareStatement(String paramString, boolean paramBoolean) throws SQLException {
+ return new Kingbase8R6Dictionary.KingbasePreparedStatement(super.prepareStatement(paramString, false), this,
+ this._dict);
+ }
+
+ protected PreparedStatement prepareStatement(String paramString, int paramInt1, int paramInt2,
+ boolean paramBoolean) throws SQLException {
+ return new Kingbase8R6Dictionary.KingbasePreparedStatement(
+ super.prepareStatement(paramString, paramInt1, paramInt2, false), this, this._dict);
+ }
+ }
+}
diff --git a/o2server/x_base_core_project/src/main/java/com/x/base/core/openjpa/jdbc/sql/OscarDictionary.java b/o2server/x_base_core_project/src/main/java/com/x/base/core/openjpa/jdbc/sql/OscarDictionary.java
index a3a3349b14793e44b1f2008750448bfef0c39491..4e5bfb1e7196bfa481f758ebc4a87ae484c2569b 100644
--- a/o2server/x_base_core_project/src/main/java/com/x/base/core/openjpa/jdbc/sql/OscarDictionary.java
+++ b/o2server/x_base_core_project/src/main/java/com/x/base/core/openjpa/jdbc/sql/OscarDictionary.java
@@ -1,5 +1,6 @@
package com.x.base.core.openjpa.jdbc.sql;
+import org.apache.openjpa.jdbc.sql.BooleanRepresentationFactory;
import org.apache.openjpa.jdbc.sql.DBDictionary;
import org.apache.openjpa.lib.util.Localizer;
@@ -18,6 +19,10 @@ public class OscarDictionary extends DBDictionary {
maxEmbeddedClobSize = -1;
maxEmbeddedBlobSize = -1;
doubleTypeName = "DOUBLE PRECISION";
+ booleanTypeName = "BOOL";
+ useGetStringForClobs = true;
+ useSetStringForClobs = true;
+ booleanRepresentation = BooleanRepresentationFactory.BOOLEAN;
}
}
diff --git a/o2server/x_base_core_project/src/main/java/com/x/base/core/project/annotation/ApiAllBuilder.java b/o2server/x_base_core_project/src/main/java/com/x/base/core/project/annotation/ApiAllBuilder.java
new file mode 100644
index 0000000000000000000000000000000000000000..e651f1e5e8d355fd3fe47fe1e58fe7d890684b14
--- /dev/null
+++ b/o2server/x_base_core_project/src/main/java/com/x/base/core/project/annotation/ApiAllBuilder.java
@@ -0,0 +1,910 @@
+package com.x.base.core.project.annotation;
+
+import java.io.File;
+import java.io.IOException;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.lang.reflect.Parameter;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import javax.persistence.Table;
+import javax.ws.rs.ApplicationPath;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.FormParam;
+import javax.ws.rs.GET;
+import javax.ws.rs.HEAD;
+import javax.ws.rs.OPTIONS;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.MediaType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Lob;
+import javax.persistence.OrderColumn;
+import org.apache.openjpa.persistence.jdbc.ElementColumn;
+import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
+import org.glassfish.jersey.media.multipart.FormDataParam;
+import org.apache.openjpa.persistence.jdbc.ContainerTable;
+
+import org.apache.commons.collections4.list.SetUniqueList;
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.lang3.ArrayUtils;
+import org.apache.commons.lang3.ClassUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.reflect.FieldUtils;
+import org.apache.commons.lang3.reflect.MethodUtils;
+
+import com.google.gson.JsonElement;
+import com.x.base.core.project.annotation.ApiBuilder.JaxrsApiMethod;
+import com.x.base.core.project.annotation.ApiBuilder.JaxrsClass;
+import com.x.base.core.project.annotation.ApiBuilder.JaxrsField;
+import com.x.base.core.project.annotation.ApiBuilder.JaxrsFormParameter;
+import com.x.base.core.project.annotation.ApiBuilder.JaxrsMethod;
+import com.x.base.core.project.annotation.ApiBuilder.JaxrsPathParameter;
+import com.x.base.core.project.annotation.ApiBuilder.JaxrsQueryParameter;
+import com.x.base.core.project.bean.WrapCopier;
+import com.x.base.core.project.gson.XGsonBuilder;
+import com.x.base.core.project.jaxrs.StandardJaxrsAction;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.base.core.project.tools.DefaultCharset;
+import com.x.base.core.project.tools.ListTools;
+
+import io.github.classgraph.ClassGraph;
+import io.github.classgraph.ClassInfo;
+import io.github.classgraph.ScanResult;
+
+public class ApiAllBuilder {
+
+ private static Logger logger = LoggerFactory.getLogger(ApiAllBuilder.class);
+
+ public static void main(String[] args) throws IOException {
+ String filePath = args[0];
+ filePath = filePath.substring(0, filePath.lastIndexOf(File.separator));
+ filePath = filePath + File.separator+"x_program_center";
+ File dir = new File(filePath ,"src/main/webapp/describe/api");
+ ApiAllBuilder builder = new ApiAllBuilder();
+ builder.scan(dir);
+ }
+
+ private void scan(File dir) {
+ try {
+ ArrayList List = new ArrayList();
+ List.add("x_processplatform_assemble_surface");
+ List.add("x_portal_assemble_surface");
+ List.add("x_query_assemble_surface");
+ List.add("x_cms_assemble_control");
+ List.add("x_organization_assemble_express");
+ List.add("x_organization_assemble_control");
+
+ if (dir.isDirectory()) {
+ LinkedHashMap mapList = new LinkedHashMap<>();
+ File[] fs = dir.listFiles();
+ for(File f:fs){
+ if(f.isFile()) {
+ String fileNameJosn = f.getName();
+ if(!fileNameJosn.equalsIgnoreCase("apiList.json")) {
+ if(List.contains(fileNameJosn.substring(0,fileNameJosn.lastIndexOf(".")))) {
+ mapList.put(fileNameJosn.substring(0,fileNameJosn.lastIndexOf(".")), FileUtils.readFileToString(f,"UTF-8"));
+ }
+ }
+ }
+ }
+ File fileList = new File(dir, "apiList.json");
+ FileUtils.writeStringToFile(fileList, XGsonBuilder.toJson(mapList), DefaultCharset.charset);
+ }
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ private void scan0(File dir,String fileName) {
+ try {
+ List jaxrsClasses = new ArrayList<>();
+ List> classes = this.scanJaxrsClass();
+ for (Class> clz : classes) {
+ if (StandardJaxrsAction.class.isAssignableFrom(clz)) {
+ jaxrsClasses.add(this.jaxrsClass(clz));
+ }
+ }
+
+
+ LinkedHashMap> map = new LinkedHashMap<>();
+ jaxrsClasses = jaxrsClasses.stream().sorted(Comparator.comparing(JaxrsClass::getName))
+ .collect(Collectors.toList());
+ map.put("jaxrs", jaxrsClasses);
+ File file = new File(dir, fileName + ".json");
+ FileUtils.writeStringToFile(file, XGsonBuilder.toJson(map), DefaultCharset.charset);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ private List> scanJaxrsClass() throws Exception {
+ try (ScanResult scanResult = new ClassGraph().disableJarScanning().enableAnnotationInfo().scan()) {
+ SetUniqueList> classes = SetUniqueList.setUniqueList(new ArrayList>());
+ for (ClassInfo info : scanResult.getClassesWithAnnotation(ApplicationPath.class.getName())) {
+ Class> applicationPathClass = ClassUtils.getClass(info.getName());
+ for (Class> o : (Set>) MethodUtils.invokeMethod(applicationPathClass.newInstance(),
+ "getClasses")) {
+ Path path = o.getAnnotation(Path.class);
+ JaxrsDescribe jaxrsDescribe = o.getAnnotation(JaxrsDescribe.class);
+ if (null != path && null != jaxrsDescribe) {
+ classes.add(o);
+ }
+ }
+ }
+ return classes;
+ }
+ }
+
+ private JaxrsClass jaxrsClass(Class> clz) throws Exception {
+ logger.print("describe class:{}.", clz.getName());
+ JaxrsDescribe jaxrsDescribe = clz.getAnnotation(JaxrsDescribe.class);
+ JaxrsClass jaxrsClass = new JaxrsClass();
+ jaxrsClass.setName(clz.getSimpleName());
+ for (Method method : clz.getMethods()) {
+ JaxrsMethodDescribe jaxrsMethodDescribe = method.getAnnotation(JaxrsMethodDescribe.class);
+ if (null != jaxrsMethodDescribe) {
+
+ jaxrsClass.getMethods().add(this.jaxrsApiMethod(clz, method));
+ }
+ }
+
+ return jaxrsClass;
+
+ }
+
+
+ private List