提交 85aa0a61 编写于 作者: NoSubject's avatar NoSubject

Merge branch 'wrdp' into 'feature/async_form'

# Conflicts:
#   o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/service/CmsBatchOperationPersistService.java
#   o2web/gulpfile.js
#   o2web/source/o2_core/o2.js
#   o2web/source/o2_core/o2/xDesktop/Common.js
...@@ -45,14 +45,14 @@ ...@@ -45,14 +45,14 @@
project.setNewProperty("length_aix_mb", length_aix_mbytes); project.setNewProperty("length_aix_mb", length_aix_mbytes);
]]> ]]>
</script> </script>
<checksum file="${preName}-${VERSION}-raspi.zip" property="build_raspberrypi.sha" algorithm="SHA-256" /> <checksum file="${preName}-${VERSION}-raspi.zip" property="build_raspi.sha" algorithm="SHA-256" />
<length file="${preName}-${VERSION}-raspi.zip" property="length_raspberrypi"/> <length file="${preName}-${VERSION}-raspi.zip" property="length_raspi"/>
<script language="javascript"> <script language="javascript">
<![CDATA[ <![CDATA[
var length_raspberrypi_bytes = project.getProperty("length_raspberrypi"); var length_raspi_bytes = project.getProperty("length_raspi");
var length_raspberrypi_kbytes = Math.round((length_raspberrypi_bytes / 1024) * Math.pow(10,2))/ Math.pow(10,2); var length_raspi_kbytes = Math.round((length_raspi_bytes / 1024) * Math.pow(10,2))/ Math.pow(10,2);
var length_raspberrypi_mbytes = Math.round((length_raspberrypi_kbytes / 1024) * Math.pow(10,2))/ Math.pow(10,2); var length_raspi_mbytes = Math.round((length_raspi_kbytes / 1024) * Math.pow(10,2))/ Math.pow(10,2);
project.setNewProperty("length_raspberrypi_mb", length_raspberrypi_mbytes); project.setNewProperty("length_raspi_mb", length_raspi_mbytes);
]]> ]]>
</script> </script>
<checksum file="${preName}-${VERSION}-linux-mips.zip" property="build_mips.sha" algorithm="SHA-256" /> <checksum file="${preName}-${VERSION}-linux-mips.zip" property="build_mips.sha" algorithm="SHA-256" />
...@@ -116,14 +116,14 @@ ...@@ -116,14 +116,14 @@
"url": "/download/o2server-${VERSION}-aix.zip", "url": "/download/o2server-${VERSION}-aix.zip",
"sha256": "${build_aix.sha}" "sha256": "${build_aix.sha}"
}, },
"raspberrypi": { "raspi": {
"system": "raspberrypi", "system": "raspberrypi",
"name": "o2server-${VERSION}-raspi.zip", "name": "o2server-${VERSION}-raspi.zip",
"fileName": "o2server-${VERSION}-raspi.zip", "fileName": "o2server-${VERSION}-raspi.zip",
"fileSize": "${length_raspberrypi_mb}MB", "fileSize": "${length_raspberrypi_mb}MB",
"updateTime": "${TODAY}", "updateTime": "${TODAY}",
"url": "/download/o2server-${VERSION}-raspi.zip", "url": "/download/o2server-${VERSION}-raspi.zip",
"sha256": "${build_raspberrypi.sha}" "sha256": "${build_raspi.sha}"
}, },
"mips": { "mips": {
"system": "mips", "system": "mips",
...@@ -185,14 +185,14 @@ ...@@ -185,14 +185,14 @@
"url": "/download/o2server-${VERSION}-aix.zip", "url": "/download/o2server-${VERSION}-aix.zip",
"sha256": "${build_aix.sha}" "sha256": "${build_aix.sha}"
}, },
"raspberrypi": { "raspi": {
"system": "raspberrypi", "system": "raspi",
"name": "o2server-${VERSION}-raspi.zip", "name": "o2server-${VERSION}-raspi.zip",
"fileName": "o2server-${VERSION}-raspi.zip", "fileName": "o2server-${VERSION}-raspi.zip",
"fileSize": "${length_raspberrypi_mb}MB", "fileSize": "${length_raspi_mb}MB",
"updateTime": "${TODAY}", "updateTime": "${TODAY}",
"url": "/download/o2server-${VERSION}-raspi.zip", "url": "/download/o2server-${VERSION}-raspi.zip",
"sha256": "${build_raspberrypi.sha}" "sha256": "${build_raspi.sha}"
}, },
"mips": { "mips": {
"system": "mips", "system": "mips",
...@@ -220,7 +220,7 @@ ...@@ -220,7 +220,7 @@
} }
}</echo> }</echo>
</target> </target>
<target name="default_zip" depends="version_o2,zip_windows,zip_linux,zip_macos,zip_aix,zip_raspberrypi,zip_mips,zip_arm" /> <target name="default_zip" depends="version_o2,zip_windows,zip_linux,zip_macos,zip_aix,zip_raspi,zip_mips,zip_arm" />
<target name="version_o2"> <target name="version_o2">
<tstamp> <tstamp>
<format property="TODAY" pattern="yyyy-MM-dd HH:mm:ss"/> <format property="TODAY" pattern="yyyy-MM-dd HH:mm:ss"/>
...@@ -308,7 +308,7 @@ ...@@ -308,7 +308,7 @@
</zipfileset> </zipfileset>
</zip> </zip>
</target> </target>
<target name="zip_raspberrypi"> <target name="zip_raspi">
<zip encoding="utf-8" destfile="${preName}-${VERSION}-raspi.zip" update="false"> <zip encoding="utf-8" destfile="${preName}-${VERSION}-raspi.zip" update="false">
<zipfileset dir="${targetdir}/o2server" filemode="777" dirmode="777" encoding="utf-8" prefix="o2server"> <zipfileset dir="${targetdir}/o2server" filemode="777" dirmode="777" encoding="utf-8" prefix="o2server">
<include name="commons/"/> <include name="commons/"/>
...@@ -320,7 +320,7 @@ ...@@ -320,7 +320,7 @@
<include name="index.html"/> <include name="index.html"/>
<include name="version.o2"/> <include name="version.o2"/>
<include name="console.jar"/> <include name="console.jar"/>
<include name="jvm/raspberrypi/"/> <include name="jvm/raspi/"/>
<include name="start_raspi.sh"/> <include name="start_raspi.sh"/>
<include name="start_raspi_debug.sh"/> <include name="start_raspi_debug.sh"/>
<include name="console_raspi.sh"/> <include name="console_raspi.sh"/>
......
...@@ -19,6 +19,8 @@ var fg = require('fast-glob'); ...@@ -19,6 +19,8 @@ var fg = require('fast-glob');
var logger = require('gulp-logger'); var logger = require('gulp-logger');
var assetRev = require('gulp-tm-asset-rev'); var assetRev = require('gulp-tm-asset-rev');
const os = require('os'); const os = require('os');
var through2 = require('through2');
var path = require('path');
//var downloadHost = "download.o2oa.net"; //var downloadHost = "download.o2oa.net";
// var downloadHost = "release.o2oa.net"; // var downloadHost = "release.o2oa.net";
...@@ -46,7 +48,7 @@ var jvmUrls = { ...@@ -46,7 +48,7 @@ var jvmUrls = {
"arm": "/o2oa/evn-o2server-jvm/-/archive/master/evn-o2server-jvm-master.tar.gz?path=jvm/arm", "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", "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", "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" "windows": "/o2oa/evn-o2server-jvm/-/archive/master/evn-o2server-jvm-master.tar.gz?path=jvm/windows"
}; };
...@@ -57,15 +59,16 @@ var scripts = { ...@@ -57,15 +59,16 @@ var scripts = {
"arm": ["o2server/*arm*", "o2server/*.jar", "o2server/*.html", "o2server/version.o2"], "arm": ["o2server/*arm*", "o2server/*.jar", "o2server/*.html", "o2server/version.o2"],
"macos": ["o2server/*macos*", "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"], "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"] "windows": ["o2server/*windows*", "o2server/*.jar", "o2server/*.html", "o2server/version.o2"]
}; };
var o_options = minimist(process.argv.slice(2), {//upload: local ftp or sftp var o_options = minimist(process.argv.slice(2), {//upload: local ftp or sftp
string: ["e"] string: ["e", "lp"]
}); });
var options = {}; var options = {};
options.ev = o_options.e || "all"; options.ev = o_options.e || "all";
options.lp = o_options.lp || "zh-cn";
var jvmUrl = jvmUrls[options.ev]; var jvmUrl = jvmUrls[options.ev];
var scriptSource = scripts[options.ev]; var scriptSource = scripts[options.ev];
...@@ -460,6 +463,8 @@ function build_concat_xform(){ ...@@ -460,6 +463,8 @@ function build_concat_xform(){
'o2web/source/' + path + '/DatagridPC.js', 'o2web/source/' + path + '/DatagridPC.js',
'o2web/source/' + path + '/Textfield.js', 'o2web/source/' + path + '/Textfield.js',
'o2web/source/' + path + '/Personfield.js', 'o2web/source/' + path + '/Personfield.js',
'o2web/source/' + path + '/Button.js',
'o2web/source/' + path + '/ViewSelector.js',
'o2web/source/' + path + '/*.js', 'o2web/source/' + path + '/*.js',
'o2web/source/x_component_process_Work/Processor.js', 'o2web/source/x_component_process_Work/Processor.js',
'!o2web/source/' + path + '/Office.js' '!o2web/source/' + path + '/Office.js'
...@@ -491,9 +496,100 @@ function build_bundle(){ ...@@ -491,9 +496,100 @@ function build_bundle(){
.pipe(gulp.dest(dest)) .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 = [ 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/Common.js',
'o2web/source/o2_core/o2/widget/Dialog.js', 'o2web/source/o2_core/o2/widget/Dialog.js',
'o2web/source/o2_core/o2/widget/UUID.js', 'o2web/source/o2_core/o2/widget/UUID.js',
...@@ -511,6 +607,12 @@ function build_concat_basework() { ...@@ -511,6 +607,12 @@ function build_concat_basework() {
'o2web/source/o2_core/o2/xDesktop/Dialog.js', 'o2web/source/o2_core/o2/xDesktop/Dialog.js',
'o2web/source/o2_core/o2/xDesktop/Window.js', 'o2web/source/o2_core/o2/xDesktop/Window.js',
'o2web/source/x_component_Common/Main.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_process_Work/Main.js',
'o2web/source/x_component_Selector/package.js', 'o2web/source/x_component_Selector/package.js',
'o2web/source/x_component_Selector/Person.js', 'o2web/source/x_component_Selector/Person.js',
...@@ -526,13 +628,16 @@ function build_concat_basework() { ...@@ -526,13 +628,16 @@ function build_concat_basework() {
'o2web/source/o2_core/o2/xScript/Environment.js', 'o2web/source/o2_core/o2/xScript/Environment.js',
'o2web/source/x_component_Template/MTooltips.js', 'o2web/source/x_component_Template/MTooltips.js',
'o2web/source/x_component_Template/MSelector.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_organization_assemble_authentication.js',
'o2web/source/o2_core/o2/xAction/services/x_processplatform_assemble_surface.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_cms_assemble_control.js',
'o2web/source/o2_core/o2/xAction/services/x_organization_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_query_assemble_surface.js',
'o2web/source/o2_core/o2/xAction/services/x_organization_assemble_personal.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' 'o2web/source/x_desktop/js/base.js'
]; ];
var dest = 'target/o2server/servers/webServer/x_desktop/js/'; var dest = 'target/o2server/servers/webServer/x_desktop/js/';
...@@ -543,10 +648,116 @@ function build_concat_basework() { ...@@ -543,10 +648,116 @@ function build_concat_basework() {
.pipe(rename({ extname: '.min.js' })) .pipe(rename({ extname: '.min.js' }))
.pipe(gulp.dest(dest)); .pipe(gulp.dest(dest));
} }
// function build_concat(){
// return gulp.parallel(build_concat_o2, build_concat_desktop, build_concat_xform); function build_concat_baseportal_style(){
// } return gulp.src([
exports.build_concat = gulp.parallel(build_concat_o2, build_concat_desktop, build_concat_xform, build_bundle, build_concat_basework); "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() { function build_web_v_html() {
...@@ -638,7 +849,20 @@ function chmod_sh(){ ...@@ -638,7 +849,20 @@ function chmod_sh(){
function chmod_servers(){ function chmod_servers(){
return (shell.task('chmod 777 -R target/o2server/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){ if (os.platform().indexOf("win")==-1){
exports.deploy = gulp.series(deploy_server, chmod_jvm, chmod_commons, chmod_sh, chmod_servers); exports.deploy = gulp.series(deploy_server, chmod_jvm, chmod_commons, chmod_sh, chmod_servers);
}else{ }else{
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
"statExclusions": "*.js,*.gif,*.jpg,*.png,*.css,*.ico", "statExclusions": "*.js,*.gif,*.jpg,*.png,*.css,*.ico",
"maxFormContent": 20.0, "maxFormContent": 20.0,
"exposeJest": true, "exposeJest": true,
"persistentConnectionsEnable": true,
"###enable": "是否启用###", "###enable": "是否启用###",
"###order": "center节点顺序,顺序排列0,1,2...###", "###order": "center节点顺序,顺序排列0,1,2...###",
"###sslEnable": "是否启用ssl传输加密,如果启用将使用config/keystore文件作为密钥文件.使用config/token.json文件中的sslKeyStorePassword字段为密钥密码,sslKeyManagerPassword为管理密码.###", "###sslEnable": "是否启用ssl传输加密,如果启用将使用config/keystore文件作为密钥文件.使用config/token.json文件中的sslKeyStorePassword字段为密钥密码,sslKeyManagerPassword为管理密码.###",
...@@ -27,5 +28,6 @@ ...@@ -27,5 +28,6 @@
"###statEnable": "启用统计,默认启用统计.###", "###statEnable": "启用统计,默认启用统计.###",
"###statExclusions": "统计忽略路径,默认忽略*.js,*.gif,*.jpg,*.png,*.css,*.ico###", "###statExclusions": "统计忽略路径,默认忽略*.js,*.gif,*.jpg,*.png,*.css,*.ico###",
"###maxFormContent": "最大提交数据限制(M),限制有所上传的内容大小,包括附件.###", "###maxFormContent": "最大提交数据限制(M),限制有所上传的内容大小,包括附件.###",
"###exposeJest": "暴露jest接口.###" "###exposeJest": "暴露jest接口.###",
"###persistentConnectionsEnable": "是否启用长连接,默认false.###"
} }
\ No newline at end of file
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
"###agentId": "agentId###", "###agentId": "agentId###",
"###appKey": "应用的key,唯一标识###", "###appKey": "应用的key,唯一标识###",
"###appSecret": "应用的密钥###", "###appSecret": "应用的密钥###",
"###syncCron": "组织同步cron,默认每10分钟同步一次.###", "###syncCron": "回调信号触发同步检查,默认每10分钟运行一次,如果期间内有钉钉回调信号接收到,那么触发同步任务进行人员同步.###",
"###forceSyncCron": "强制拉入同步cron,默认在每天的8点和12点强制进行同步.###", "###forceSyncCron": "强制拉入同步cron,默认在每天的8点和12点强制进行同步.###",
"###oapiAddress": "oapi服务器地址###", "###oapiAddress": "oapi服务器地址###",
"###workUrl": "钉钉消息打开工作的url地址,如:http://dev.o2oa.net/x_desktop/###", "###workUrl": "钉钉消息打开工作的url地址,如:http://dev.o2oa.net/x_desktop/###",
......
...@@ -286,5 +286,29 @@ ...@@ -286,5 +286,29 @@
"###name": "存储节点名,对应存储名称,谨慎修改.###", "###name": "存储节点名,对应存储名称,谨慎修改.###",
"###deepPath": "是否使用更深的路径.###" "###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
...@@ -33,5 +33,6 @@ ...@@ -33,5 +33,6 @@
"vfs.json":"虚拟文件存储配置", "vfs.json":"虚拟文件存储配置",
"welink.json":"华为WeLink配置", "welink.json":"华为WeLink配置",
"workTime.json":"工作时间配置", "workTime.json":"工作时间配置",
"zhengwuDingding.json":"政务钉钉配置" "zhengwuDingding.json":"政务钉钉配置",
"web.json":"前端相关配置"
} }
\ No newline at end of file
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
"statExclusions": "*.js,*.gif,*.jpg,*.png,*.css,*.ico", "statExclusions": "*.js,*.gif,*.jpg,*.png,*.css,*.ico",
"maxFormContent": 20.0, "maxFormContent": 20.0,
"exposeJest": true, "exposeJest": true,
"persistentConnectionsEnable": true,
"###enable": "是否启用###", "###enable": "是否启用###",
"###order": "center节点顺序,顺序排列0,1,2...###", "###order": "center节点顺序,顺序排列0,1,2...###",
"###sslEnable": "是否启用ssl传输加密,如果启用将使用config/keystore文件作为密钥文件.使用config/token.json文件中的sslKeyStorePassword字段为密钥密码,sslKeyManagerPassword为管理密码.###", "###sslEnable": "是否启用ssl传输加密,如果启用将使用config/keystore文件作为密钥文件.使用config/token.json文件中的sslKeyStorePassword字段为密钥密码,sslKeyManagerPassword为管理密码.###",
...@@ -30,7 +31,8 @@ ...@@ -30,7 +31,8 @@
"###statEnable": "启用统计,默认启用统计.###", "###statEnable": "启用统计,默认启用统计.###",
"###statExclusions": "统计忽略路径,默认忽略*.js,*.gif,*.jpg,*.png,*.css,*.ico###", "###statExclusions": "统计忽略路径,默认忽略*.js,*.gif,*.jpg,*.png,*.css,*.ico###",
"###maxFormContent": "最大提交数据限制(M),限制有所上传的内容大小,包括附件.###", "###maxFormContent": "最大提交数据限制(M),限制有所上传的内容大小,包括附件.###",
"###exposeJest": "暴露jest接口.###" "###exposeJest": "暴露jest接口.###",
"###persistentConnectionsEnable": "是否启用长连接,默认false.###"
}, },
"application": { "application": {
"enable": true, "enable": true,
...@@ -48,6 +50,7 @@ ...@@ -48,6 +50,7 @@
"statExclusions": "*.js,*.gif,*.jpg,*.png,*.css,*.ico", "statExclusions": "*.js,*.gif,*.jpg,*.png,*.css,*.ico",
"maxFormContent": 20.0, "maxFormContent": 20.0,
"exposeJest": true, "exposeJest": true,
"persistentConnectionsEnable": true,
"###enable": "是否启用###", "###enable": "是否启用###",
"###port": "http/https端口,负责向前端提供数据访问接口.默认为20020端口.###", "###port": "http/https端口,负责向前端提供数据访问接口.默认为20020端口.###",
"###sslEnable": "是否启用ssl传输加密,如果启用将使用config/keystore文件作为密钥文件.使用config/token.json文件中的sslKeyStorePassword字段为密钥密码,sslKeyManagerPassword为管理密码.###", "###sslEnable": "是否启用ssl传输加密,如果启用将使用config/keystore文件作为密钥文件.使用config/token.json文件中的sslKeyStorePassword字段为密钥密码,sslKeyManagerPassword为管理密码.###",
...@@ -62,7 +65,8 @@ ...@@ -62,7 +65,8 @@
"###statEnable": "启用统计,默认启用统计.###", "###statEnable": "启用统计,默认启用统计.###",
"###statExclusions": "统计忽略路径,默认忽略*.js,*.gif,*.jpg,*.png,*.css,*.ico###", "###statExclusions": "统计忽略路径,默认忽略*.js,*.gif,*.jpg,*.png,*.css,*.ico###",
"###maxFormContent": "最大提交数据限制(M),限制有所上传的内容大小,包括附件.###", "###maxFormContent": "最大提交数据限制(M),限制有所上传的内容大小,包括附件.###",
"###exposeJest": "暴露jest接口.###" "###exposeJest": "暴露jest接口.###",
"###persistentConnectionsEnable": "是否启用长连接,默认false.###"
}, },
"web": { "web": {
"enable": true, "enable": true,
...@@ -73,6 +77,7 @@ ...@@ -73,6 +77,7 @@
"statEnable": false, "statEnable": false,
"statExclusions": "*.gif,*.jpg,*.png,*.ico", "statExclusions": "*.gif,*.jpg,*.png,*.ico",
"cacheControlMaxAge": 0.0, "cacheControlMaxAge": 0.0,
"persistentConnectionsEnable": true,
"###enable": "是否启用###", "###enable": "是否启用###",
"###port": "http/https端口,用户输入网址后实际访问的第一个端口.http协议默认为80端口,https默认为443端口.###", "###port": "http/https端口,用户输入网址后实际访问的第一个端口.http协议默认为80端口,https默认为443端口.###",
"###sslEnable": "是否启用ssl传输加密,如果启用将使用config/keystore文件作为密钥文件.使用config/token.json文件中的sslKeyStorePassword字段为密钥密码,sslKeyManagerPassword为管理密码.###", "###sslEnable": "是否启用ssl传输加密,如果启用将使用config/keystore文件作为密钥文件.使用config/token.json文件中的sslKeyStorePassword字段为密钥密码,sslKeyManagerPassword为管理密码.###",
...@@ -84,7 +89,8 @@ ...@@ -84,7 +89,8 @@
"###statExclusions": "统计忽略路径,默认忽略*.gif,*.jpg,*.png,*.ico###", "###statExclusions": "统计忽略路径,默认忽略*.gif,*.jpg,*.png,*.ico###",
"###cacheControlMaxAge": "服务器max-age缓存时间(秒)###", "###cacheControlMaxAge": "服务器max-age缓存时间(秒)###",
"###proxyCenterEnable": "是否启用center服务器代理.###", "###proxyCenterEnable": "是否启用center服务器代理.###",
"###proxyApplicationEnable": "是否启用application服务器代理###" "###proxyApplicationEnable": "是否启用application服务器代理###",
"###persistentConnectionsEnable": "是否启用长连接,默认true.###"
}, },
"data": { "data": {
"enable": true, "enable": true,
...@@ -108,7 +114,7 @@ ...@@ -108,7 +114,7 @@
"###excludes": "在此节点上不存储的类,和includes一起设置实际存储的类,可以使用通配符*###", "###excludes": "在此节点上不存储的类,和includes一起设置实际存储的类,可以使用通配符*###",
"###jmxEnable": "是否启动jmx,如果启用,可以通过本地的jmx客户端进行访问,不支持远程jmx客户端.###", "###jmxEnable": "是否启动jmx,如果启用,可以通过本地的jmx客户端进行访问,不支持远程jmx客户端.###",
"###cacheSize": "H2数据库缓存大小,设置H2用于作为缓存的内存大小,以M作为单位,这里默认为512M.###", "###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": "最大使用连接数###", "###maxTotal": "最大使用连接数###",
"###maxIdle": "最大空闲连接数###", "###maxIdle": "最大空闲连接数###",
"###statEnable": "启用统计,默认启用###", "###statEnable": "启用统计,默认启用###",
...@@ -135,12 +141,12 @@ ...@@ -135,12 +141,12 @@
}, },
"logLevel": "warn", "logLevel": "warn",
"dumpData": { "dumpData": {
"enable": true, "enable": false,
"cron": "", "cron": "",
"size": 7.0, "size": 7.0,
"path": "", "path": "",
"###enable": "是否启用,默认每天凌晨2点进行备份.###", "###enable": "是否启用,默认禁用.###",
"###cron": "定时任务cron表达式###", "###cron": "定时任务cron表达式,默认每天凌晨2点进行备份.###",
"###size": "最大保留份数,超过将自动删除最久的数据.###", "###size": "最大保留份数,超过将自动删除最久的数据.###",
"###path": "备份路径###" "###path": "备份路径###"
}, },
......
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
"attendanceSyncAgentId": "", "attendanceSyncAgentId": "",
"attendanceSyncSecret": "", "attendanceSyncSecret": "",
"###enable": "是否启用.###", "###enable": "是否启用.###",
"###syncCron": "拉入同步cron,默认每10分钟同步一次.###", "###syncCron": "回调信号触发同步检查,默认每10分钟运行一次,如果期间内有企业微信回调信号接收到,那么触发同步任务进行人员同步.###",
"###forceSyncCron": "强制拉入同步cron,默认在每天的8点和12点强制进行同步.###", "###forceSyncCron": "强制拉入同步cron,默认在每天的8点和12点强制进行同步.###",
"###apiAddress": "api服务器地址###", "###apiAddress": "api服务器地址###",
"###corpId": "企业微信corpId###", "###corpId": "企业微信corpId###",
......
...@@ -4,5 +4,8 @@ ...@@ -4,5 +4,8 @@
}, },
"ftps": { "ftps": {
"passive": true "passive": true
},
"sftp": {
"passive": true
} }
} }
\ No newline at end of file
{
"mock": {},
"###mock": "使用Post模拟Put,Get模拟Delete的模块.###"
}
\ No newline at end of file
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
"###appId": "政务钉钉appId###", "###appId": "政务钉钉appId###",
"###appSecret": "政务钉钉appSecret###", "###appSecret": "政务钉钉appSecret###",
"###agentId": "政务钉钉agentId###", "###agentId": "政务钉钉agentId###",
"###syncCron": "拉入同步cron,默认每10分钟同步一次.###", "###syncCron": "回调信号触发同步检查,默认每10分钟运行一次,如果期间内有政务钉钉回调信号接收到,那么触发同步任务进行人员同步.###",
"###forceSyncCron": "强制拉入同步cron,默认在每天的8点和12点强制进行同步.###", "###forceSyncCron": "强制拉入同步cron,默认在每天的8点和12点强制进行同步.###",
"###oapiAddress": "oapi服务器地址###", "###oapiAddress": "oapi服务器地址###",
"###corpId": "政务钉钉corpId###", "###corpId": "政务钉钉corpId###",
......
...@@ -1017,4 +1017,10 @@ ...@@ -1017,4 +1017,10 @@
</snapshots> </snapshots>
</repository> </repository>
</repositories> </repositories>
<distributionManagement>
<repository>
<id>o2oa-release</id>
<url>http://maven.o2oa.net/repository/o2oa-release/</url>
</repository>
</distributionManagement>
</project> </project>
...@@ -128,6 +128,12 @@ ...@@ -128,6 +128,12 @@
</execution> </execution>
</executions> </executions>
</plugin> </plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins> </plugins>
</build> </build>
</project> </project>
...@@ -10,6 +10,7 @@ import java.util.Date; ...@@ -10,6 +10,7 @@ import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.Objects; import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import javax.persistence.EntityManager; import javax.persistence.EntityManager;
...@@ -17,7 +18,6 @@ import javax.persistence.Query; ...@@ -17,7 +18,6 @@ import javax.persistence.Query;
import javax.persistence.Tuple; import javax.persistence.Tuple;
import javax.persistence.TypedQuery; import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaDelete;
import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root; import javax.persistence.criteria.Root;
...@@ -644,6 +644,61 @@ public class EntityManagerContainer extends EntityManagerContainerBasic { ...@@ -644,6 +644,61 @@ public class EntityManagerContainer extends EntityManagerContainerBasic {
return os.stream().findFirst().orElse(null); return os.stream().findFirst().orElse(null);
} }
public <T extends JpaObject> Optional<T> firstEqualAndLessThanOrEqualTo(Class<T> cls, String attribute,
Object value, String otherAttribute, Comparable otherValue) throws Exception {
EntityManager em = this.get(cls);
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<T> cq = cb.createQuery(cls);
Root<T> 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<T> os = em.createQuery(cq).setMaxResults(1).getResultList();
return os.stream().findFirst();
}
public <T extends JpaObject> Optional<T> firstEqualAndLessThan(Class<T> cls, String attribute, Object value,
String otherAttribute, Comparable otherValue) throws Exception {
EntityManager em = this.get(cls);
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<T> cq = cb.createQuery(cls);
Root<T> 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<T> os = em.createQuery(cq).setMaxResults(1).getResultList();
return os.stream().findFirst();
}
public <T extends JpaObject> Optional<T> firstEqualAndGreaterThanOrEqualTo(Class<T> cls, String attribute,
Object value, String otherAttribute, Comparable otherValue) throws Exception {
EntityManager em = this.get(cls);
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<T> cq = cb.createQuery(cls);
Root<T> 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<T> os = em.createQuery(cq).setMaxResults(1).getResultList();
return os.stream().findFirst();
}
public <T extends JpaObject> Optional<T> firstEqualAndGreaterThan(Class<T> cls, String attribute, Object value,
String otherAttribute, Comparable otherValue) throws Exception {
EntityManager em = this.get(cls);
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<T> cq = cb.createQuery(cls);
Root<T> 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<T> os = em.createQuery(cq).setMaxResults(1).getResultList();
return os.stream().findFirst();
}
public <T extends JpaObject> Long count(Class<T> cls) throws Exception { public <T extends JpaObject> Long count(Class<T> cls) throws Exception {
EntityManager em = this.get(cls); EntityManager em = this.get(cls);
CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaBuilder cb = em.getCriteriaBuilder();
...@@ -888,8 +943,7 @@ public class EntityManagerContainer extends EntityManagerContainerBasic { ...@@ -888,8 +943,7 @@ public class EntityManagerContainer extends EntityManagerContainerBasic {
CriteriaQuery<String> cq = cb.createQuery(String.class); CriteriaQuery<String> cq = cb.createQuery(String.class);
Root<T> root = cq.from(cls); Root<T> root = cq.from(cls);
cq.select(root.get(JpaObject.id_FIELDNAME)).where(cb.isMember(root.get(attribute), cb.literal(values))); cq.select(root.get(JpaObject.id_FIELDNAME)).where(cb.isMember(root.get(attribute), cb.literal(values)));
return new ArrayList<>( return new ArrayList<>(em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList()));
em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList()));
} }
public <T extends JpaObject, W extends Object> List<String> idsNotIn(Class<T> cls, String attribute, public <T extends JpaObject, W extends Object> List<String> idsNotIn(Class<T> cls, String attribute,
......
...@@ -172,7 +172,7 @@ public class PersistenceXmlHelper { ...@@ -172,7 +172,7 @@ public class PersistenceXmlHelper {
mapped_element.addText(o.getName()); mapped_element.addText(o.getName());
} }
} }
if(dynamicFlag) { if (dynamicFlag) {
for (String className : names) { for (String className : names) {
if (className.startsWith(DynamicEntity.CLASS_PACKAGE)) { if (className.startsWith(DynamicEntity.CLASS_PACKAGE)) {
dyClasses.add(className); dyClasses.add(className);
...@@ -192,7 +192,7 @@ public class PersistenceXmlHelper { ...@@ -192,7 +192,7 @@ public class PersistenceXmlHelper {
mapped_element.addText(dyClass); mapped_element.addText(dyClass);
} }
for (Class<?> o : JpaObjectTools.scanMappedSuperclass(DynamicBaseEntity.class)) { 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"); Element mapped_element = unit.addElement("class");
mapped_element.addText(o.getName()); mapped_element.addText(o.getName());
} }
...@@ -296,6 +296,9 @@ public class PersistenceXmlHelper { ...@@ -296,6 +296,9 @@ public class PersistenceXmlHelper {
if (Config.externalDataSources().hasSchema()) { if (Config.externalDataSources().hasSchema()) {
properties.put("openjpa.jdbc.Schema", JpaObject.default_schema); 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)) { for (String name : Config.externalDataSources().findNamesOfContainerEntity(className)) {
properties.put("openjpa.ConnectionFactoryName", Config.RESOURCE_JDBC_PREFIX + name); properties.put("openjpa.ConnectionFactoryName", Config.RESOURCE_JDBC_PREFIX + name);
properties.put("openjpa.Log", Config.externalDataSources().log(name)); properties.put("openjpa.Log", Config.externalDataSources().log(name));
......
...@@ -20,6 +20,7 @@ import org.apache.commons.lang3.BooleanUtils; ...@@ -20,6 +20,7 @@ import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.reflect.FieldUtils; import org.apache.commons.lang3.reflect.FieldUtils;
import org.apache.openjpa.persistence.jdbc.ContainerTable; 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.Flag;
import com.x.base.core.entity.annotation.RestrictFlag; import com.x.base.core.entity.annotation.RestrictFlag;
...@@ -309,8 +310,15 @@ public abstract class JpaObject extends GsonPropertyObject implements Serializab ...@@ -309,8 +310,15 @@ public abstract class JpaObject extends GsonPropertyObject implements Serializab
if (BooleanUtils.isTrue(excludeInvisible) && FieldsInvisible.contains(field.getName())) { if (BooleanUtils.isTrue(excludeInvisible) && FieldsInvisible.contains(field.getName())) {
continue; continue;
} }
if (BooleanUtils.isTrue(excludeLob) && (null != field.getAnnotation(Lob.class))) { if (BooleanUtils.isTrue(excludeLob)) {
continue; 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()); names.add(field.getName());
} }
......
...@@ -117,14 +117,6 @@ public abstract class StorageObject extends SliceJpaObject { ...@@ -117,14 +117,6 @@ public abstract class StorageObject extends SliceJpaObject {
return this.updateContent(mapping, input); 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内容 */ /** 更新Content内容 */
public Long updateContent(StorageMapping mapping, byte[] bytes, String name) throws Exception { public Long updateContent(StorageMapping mapping, byte[] bytes, String name) throws Exception {
try (ByteArrayInputStream bais = new ByteArrayInputStream(bytes)) { try (ByteArrayInputStream bais = new ByteArrayInputStream(bytes)) {
...@@ -148,64 +140,6 @@ public abstract class StorageObject extends SliceJpaObject { ...@@ -148,64 +140,6 @@ public abstract class StorageObject extends SliceJpaObject {
/** 更新Content内容 */ /** 更新Content内容 */
public Long updateContent(StorageMapping mapping, InputStream input) throws Exception { public Long updateContent(StorageMapping mapping, InputStream input) throws Exception {
return updateContent(mapping, IOUtils.toByteArray(input)); 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内容 */ /** 更新Content内容 */
...@@ -229,7 +163,8 @@ public abstract class StorageObject extends SliceJpaObject { ...@@ -229,7 +163,8 @@ public abstract class StorageObject extends SliceJpaObject {
OutputStream output = fo.getContent().getOutputStream()) { OutputStream output = fo.getContent().getOutputStream()) {
length = IOUtils.copyLarge(new ByteArrayInputStream(bytes), output); length = IOUtils.copyLarge(new ByteArrayInputStream(bytes), output);
this.setLength(length); 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 */ /* webdav关闭会试图去关闭commons.httpClient */
manager.closeFileSystem(fo.getFileSystem()); manager.closeFileSystem(fo.getFileSystem());
} }
...@@ -339,6 +274,12 @@ public abstract class StorageObject extends SliceJpaObject { ...@@ -339,6 +274,12 @@ public abstract class StorageObject extends SliceJpaObject {
+ URLEncoder.encode(mapping.getPassword(), DefaultCharset.name) + "@" + mapping.getHost() + ":" + URLEncoder.encode(mapping.getPassword(), DefaultCharset.name) + "@" + mapping.getHost() + ":"
+ mapping.getPort(); + mapping.getPort();
break; 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: case cifs:
// smb://[ username[: password]@] hostname[: port][ absolute-path] // smb://[ username[: password]@] hostname[: port][ absolute-path]
prefix = "smb://" + URLEncoder.encode(mapping.getUsername(), DefaultCharset.name) + ":" prefix = "smb://" + URLEncoder.encode(mapping.getUsername(), DefaultCharset.name) + ":"
...@@ -369,6 +310,19 @@ public abstract class StorageObject extends SliceJpaObject { ...@@ -369,6 +310,19 @@ public abstract class StorageObject extends SliceJpaObject {
switch (mapping.getProtocol()) { switch (mapping.getProtocol()) {
// bzip2,file, ftp, ftps, gzip, hdfs, http, https, jar, ram, res, sftp, // bzip2,file, ftp, ftps, gzip, hdfs, http, https, jar, ram, res, sftp,
// tar, temp, webdav, zip, cifs, mime; // 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: case ftp:
FtpFileSystemConfigBuilder ftpBuilder = FtpFileSystemConfigBuilder.getInstance(); FtpFileSystemConfigBuilder ftpBuilder = FtpFileSystemConfigBuilder.getInstance();
/* /*
......
package com.x.base.core.entity; package com.x.base.core.entity;
public enum StorageProtocol { public enum StorageProtocol {
ftp, ftps, webdav, cifs, file; ftp, ftps, webdav, cifs, file, sftp;
public static final int length = JpaObject.length_16B; public static final int length = JpaObject.length_16B;
} }
...@@ -16,7 +16,6 @@ import javax.persistence.OrderColumn; ...@@ -16,7 +16,6 @@ import javax.persistence.OrderColumn;
import javax.persistence.Table; import javax.persistence.Table;
import javax.persistence.Temporal; import javax.persistence.Temporal;
import org.apache.commons.lang3.StringUtils;
import org.apache.openjpa.persistence.PersistentCollection; import org.apache.openjpa.persistence.PersistentCollection;
import org.apache.openjpa.persistence.PersistentMap; import org.apache.openjpa.persistence.PersistentMap;
import org.apache.openjpa.persistence.jdbc.ContainerTable; import org.apache.openjpa.persistence.jdbc.ContainerTable;
...@@ -42,6 +41,7 @@ import com.x.base.core.entity.annotation.ContainerEntity; ...@@ -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.entity.dynamic.DynamicEntity.Field;
import com.x.base.core.project.annotation.FieldDescribe; import com.x.base.core.project.annotation.FieldDescribe;
import com.x.base.core.project.tools.ListTools; import com.x.base.core.project.tools.ListTools;
import com.x.base.core.project.tools.StringTools;
public class DynamicEntityBuilder { public class DynamicEntityBuilder {
...@@ -196,10 +196,10 @@ public class DynamicEntityBuilder { ...@@ -196,10 +196,10 @@ public class DynamicEntityBuilder {
FieldSpec fieldSpec = FieldSpec.builder(typeClass, field.getName(), Modifier.PRIVATE) FieldSpec fieldSpec = FieldSpec.builder(typeClass, field.getName(), Modifier.PRIVATE)
.addAnnotation(this.fieldDescribe(field)).addAnnotation(this.index(field)) .addAnnotation(this.fieldDescribe(field)).addAnnotation(this.index(field))
.addAnnotation(this.checkPersist(field)).addAnnotation(column).build(); .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()) .addModifiers(Modifier.PUBLIC).returns(typeClass).addStatement("return this." + field.getName())
.build(); .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()) .addModifiers(Modifier.PUBLIC).returns(void.class).addParameter(typeClass, field.getName())
.addStatement("this." + field.getName() + " = " + field.getName()).build(); .addStatement("this." + field.getName() + " = " + field.getName()).build();
builder.addField(this.fieldName(field)).addField(fieldSpec).addMethod(get).addMethod(set); builder.addField(this.fieldName(field)).addField(fieldSpec).addMethod(get).addMethod(set);
...@@ -222,10 +222,10 @@ public class DynamicEntityBuilder { ...@@ -222,10 +222,10 @@ public class DynamicEntityBuilder {
FieldSpec fieldSpec = FieldSpec.builder(Date.class, field.getName(), Modifier.PRIVATE) FieldSpec fieldSpec = FieldSpec.builder(Date.class, field.getName(), Modifier.PRIVATE)
.addAnnotation(this.fieldDescribe(field)).addAnnotation(this.index(field)) .addAnnotation(this.fieldDescribe(field)).addAnnotation(this.index(field))
.addAnnotation(this.checkPersist(field)).addAnnotation(column).addAnnotation(temporal).build(); .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()) .addModifiers(Modifier.PUBLIC).returns(Date.class).addStatement("return this." + field.getName())
.build(); .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()) .addModifiers(Modifier.PUBLIC).returns(void.class).addParameter(Date.class, field.getName())
.addStatement("this." + field.getName() + " = " + field.getName()).build(); .addStatement("this." + field.getName() + " = " + field.getName()).build();
builder.addField(this.fieldName(field)).addField(fieldSpec).addMethod(get).addMethod(set); builder.addField(this.fieldName(field)).addField(fieldSpec).addMethod(get).addMethod(set);
...@@ -249,10 +249,10 @@ public class DynamicEntityBuilder { ...@@ -249,10 +249,10 @@ public class DynamicEntityBuilder {
FieldSpec fieldSpec = FieldSpec.builder(Date.class, field.getName(), Modifier.PRIVATE) FieldSpec fieldSpec = FieldSpec.builder(Date.class, field.getName(), Modifier.PRIVATE)
.addAnnotation(this.fieldDescribe(field)).addAnnotation(this.index(field)) .addAnnotation(this.fieldDescribe(field)).addAnnotation(this.index(field))
.addAnnotation(this.checkPersist(field)).addAnnotation(column).addAnnotation(temporal).build(); .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()) .addModifiers(Modifier.PUBLIC).returns(Date.class).addStatement("return this." + field.getName())
.build(); .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()) .addModifiers(Modifier.PUBLIC).returns(void.class).addParameter(Date.class, field.getName())
.addStatement("this." + field.getName() + " = " + field.getName()).build(); .addStatement("this." + field.getName() + " = " + field.getName()).build();
builder.addField(this.fieldName(field)).addField(fieldSpec).addMethod(get).addMethod(set); builder.addField(this.fieldName(field)).addField(fieldSpec).addMethod(get).addMethod(set);
...@@ -276,10 +276,10 @@ public class DynamicEntityBuilder { ...@@ -276,10 +276,10 @@ public class DynamicEntityBuilder {
FieldSpec fieldSpec = FieldSpec.builder(Date.class, field.getName(), Modifier.PRIVATE) FieldSpec fieldSpec = FieldSpec.builder(Date.class, field.getName(), Modifier.PRIVATE)
.addAnnotation(this.fieldDescribe(field)).addAnnotation(this.index(field)) .addAnnotation(this.fieldDescribe(field)).addAnnotation(this.index(field))
.addAnnotation(this.checkPersist(field)).addAnnotation(column).addAnnotation(temporal).build(); .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()) .addModifiers(Modifier.PUBLIC).returns(Date.class).addStatement("return this." + field.getName())
.build(); .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()) .addModifiers(Modifier.PUBLIC).returns(void.class).addParameter(Date.class, field.getName())
.addStatement("this." + field.getName() + " = " + field.getName()).build(); .addStatement("this." + field.getName() + " = " + field.getName()).build();
builder.addField(this.fieldName(field)).addField(fieldSpec).addMethod(get).addMethod(set); builder.addField(this.fieldName(field)).addField(fieldSpec).addMethod(get).addMethod(set);
...@@ -365,10 +365,10 @@ public class DynamicEntityBuilder { ...@@ -365,10 +365,10 @@ public class DynamicEntityBuilder {
FieldSpec fieldSpec = FieldSpec.builder(list_type, field.getName(), Modifier.PRIVATE) FieldSpec fieldSpec = FieldSpec.builder(list_type, field.getName(), Modifier.PRIVATE)
.addAnnotation(this.fieldDescribe(field)).addAnnotation(containerTable).addAnnotation(elementIndex) .addAnnotation(this.fieldDescribe(field)).addAnnotation(containerTable).addAnnotation(elementIndex)
.addAnnotation(persistentCollection).addAnnotation(orderColumn).addAnnotation(elementColumn).build(); .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()) .addModifiers(Modifier.PUBLIC).returns(list_type).addStatement("return this." + field.getName())
.build(); .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()) .addModifiers(Modifier.PUBLIC).returns(void.class).addParameter(list_type, field.getName())
.addStatement("this." + field.getName() + " = " + field.getName()).build(); .addStatement("this." + field.getName() + " = " + field.getName()).build();
builder.addField(this.fieldName(field)).addField(fieldSpec).addMethod(get).addMethod(set); builder.addField(this.fieldName(field)).addField(fieldSpec).addMethod(get).addMethod(set);
...@@ -401,10 +401,10 @@ public class DynamicEntityBuilder { ...@@ -401,10 +401,10 @@ public class DynamicEntityBuilder {
FieldSpec fieldSpec = FieldSpec.builder(String.class, field.getName(), Modifier.PRIVATE) FieldSpec fieldSpec = FieldSpec.builder(String.class, field.getName(), Modifier.PRIVATE)
.addAnnotation(this.fieldDescribe(field)).addAnnotation(lob).addAnnotation(basic).addAnnotation(column) .addAnnotation(this.fieldDescribe(field)).addAnnotation(lob).addAnnotation(basic).addAnnotation(column)
.build(); .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()) .addModifiers(Modifier.PUBLIC).returns(String.class).addStatement("return this." + field.getName())
.build(); .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()) .addModifiers(Modifier.PUBLIC).returns(void.class).addParameter(String.class, field.getName())
.addStatement("this." + field.getName() + " = " + field.getName()).build(); .addStatement("this." + field.getName() + " = " + field.getName()).build();
builder.addField(this.fieldName(field)).addField(fieldSpec).addMethod(get).addMethod(set); builder.addField(this.fieldName(field)).addField(fieldSpec).addMethod(get).addMethod(set);
...@@ -467,9 +467,9 @@ public class DynamicEntityBuilder { ...@@ -467,9 +467,9 @@ public class DynamicEntityBuilder {
.addAnnotation(keyColumn).addAnnotation(elementColumn).addAnnotation(elementIndex) .addAnnotation(keyColumn).addAnnotation(elementColumn).addAnnotation(elementIndex)
.addAnnotation(keyIndex).build(); .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(); .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()) .addModifiers(Modifier.PUBLIC).returns(void.class).addParameter(map_type, field.getName())
.addStatement("this." + field.getName() + " = " + field.getName()).build(); .addStatement("this." + field.getName() + " = " + field.getName()).build();
builder.addField(this.fieldName(field)).addField(fieldSpec).addMethod(get).addMethod(set); builder.addField(this.fieldName(field)).addField(fieldSpec).addMethod(get).addMethod(set);
......
...@@ -27,7 +27,7 @@ public class Kingbase8Dictionary extends DBDictionary { ...@@ -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 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() { public Kingbase8Dictionary() {
this.platform = "KingbaseES"; this.platform = "KingbaseES8";
this.validationSQL = "SELECT NOW()"; this.validationSQL = "SELECT NOW()";
this.supportsSelectStartIndex = true; this.supportsSelectStartIndex = true;
this.supportsSelectEndIndex = true; this.supportsSelectEndIndex = true;
......
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";
}
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);
}
}
}
package com.x.base.core.openjpa.jdbc.sql; 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.jdbc.sql.DBDictionary;
import org.apache.openjpa.lib.util.Localizer; import org.apache.openjpa.lib.util.Localizer;
...@@ -18,6 +19,10 @@ public class OscarDictionary extends DBDictionary { ...@@ -18,6 +19,10 @@ public class OscarDictionary extends DBDictionary {
maxEmbeddedClobSize = -1; maxEmbeddedClobSize = -1;
maxEmbeddedBlobSize = -1; maxEmbeddedBlobSize = -1;
doubleTypeName = "DOUBLE PRECISION"; doubleTypeName = "DOUBLE PRECISION";
booleanTypeName = "BOOL";
useGetStringForClobs = true;
useSetStringForClobs = true;
booleanRepresentation = BooleanRepresentationFactory.BOOLEAN;
} }
} }
...@@ -9,11 +9,9 @@ import java.util.ArrayList; ...@@ -9,11 +9,9 @@ import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry;
import java.util.Objects; import java.util.Objects;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
...@@ -63,22 +61,45 @@ public class ApiBuilder { ...@@ -63,22 +61,45 @@ public class ApiBuilder {
private static Logger logger = LoggerFactory.getLogger(ApiBuilder.class); private static Logger logger = LoggerFactory.getLogger(ApiBuilder.class);
public static void main(String[] args) throws IOException { public static void main(String[] args) throws IOException {
//System.out.println("ApiBuilder......");
File basedir = new File(args[0]); File basedir = new File(args[0]);
File sourcedir = new File(args[1]); File sourcedir = new File(args[1]);
File dir = new File(basedir, "src/main/webapp/describe"); File dir = new File(basedir, "src/main/webapp/describe");
FileUtils.forceMkdir(dir); FileUtils.forceMkdir(dir);
ApiBuilder builder = new ApiBuilder(); ApiBuilder builder = new ApiBuilder();
builder.scan(dir); builder.scan(dir);
//FileUtils.copyDirectory(sourcedir, new File(dir, "sources")); String filePath = args[0];
String fileName = filePath.substring(filePath.lastIndexOf(File.separator), filePath.length());
filePath = filePath.substring(0, filePath.lastIndexOf(File.separator));
filePath = filePath + File.separator+"x_program_center";
dir = new File(filePath ,"src/main/webapp/describe/api");
FileUtils.forceMkdir(dir);
builder.scan(dir,fileName);
}
private void scan(File dir,String fileName) {
try {
List<JaxrsClass> jaxrsClasses = new ArrayList<>();
List<Class<?>> classes = this.scanJaxrsClass();
for (Class<?> clz : classes) {
if (StandardJaxrsAction.class.isAssignableFrom(clz)) {
jaxrsClasses.add(this.jaxrsClass(clz));
}
}
LinkedHashMap<String, List<?>> 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 void scan(File dir) { private void scan(File dir) {
try { try {
List<JaxrsClass> jaxrsClasses = new ArrayList<>(); List<JaxrsClass> jaxrsClasses = new ArrayList<>();
...@@ -123,23 +144,13 @@ public class ApiBuilder { ...@@ -123,23 +144,13 @@ public class ApiBuilder {
logger.print("describe class:{}.", clz.getName()); logger.print("describe class:{}.", clz.getName());
JaxrsDescribe jaxrsDescribe = clz.getAnnotation(JaxrsDescribe.class); JaxrsDescribe jaxrsDescribe = clz.getAnnotation(JaxrsDescribe.class);
JaxrsClass jaxrsClass = new JaxrsClass(); JaxrsClass jaxrsClass = new JaxrsClass();
//jaxrsClass.setClassName(clz.getName());
jaxrsClass.setName(clz.getSimpleName()); jaxrsClass.setName(clz.getSimpleName());
//jaxrsClass.setDescription(jaxrsDescribe.value());
for (Method method : clz.getMethods()) { for (Method method : clz.getMethods()) {
JaxrsMethodDescribe jaxrsMethodDescribe = method.getAnnotation(JaxrsMethodDescribe.class); JaxrsMethodDescribe jaxrsMethodDescribe = method.getAnnotation(JaxrsMethodDescribe.class);
if (null != jaxrsMethodDescribe) { if (null != jaxrsMethodDescribe) {
/*
Map<String, JaxrsApiMethod> map = new HashMap<String,JaxrsApiMethod>();
map.put(method.getName(), this.jaxrsApiMethod(clz, method));
jaxrsClass.getMethods().add(map);
*/
jaxrsClass.getMethods().add(this.jaxrsApiMethod(clz, method)); jaxrsClass.getMethods().add(this.jaxrsApiMethod(clz, method));
} }
} }
//jaxrsClass.setMethods(this.getSortData("name",jaxrsClass.getMethods()));
return jaxrsClass; return jaxrsClass;
} }
...@@ -152,7 +163,6 @@ public class ApiBuilder { ...@@ -152,7 +163,6 @@ public class ApiBuilder {
this.keyName = keyName; this.keyName = keyName;
} }
public int compare(Map<String, JaxrsApiMethod> mp1, Map<String, JaxrsApiMethod> mp2) { public int compare(Map<String, JaxrsApiMethod> mp1, Map<String, JaxrsApiMethod> mp2) {
System.out.println("this.keyName=" + mp1.keySet().toArray()[0]);
String d1 = mp1.keySet().toArray()[0].toString(); String d1 = mp1.keySet().toArray()[0].toString();
String d2 = mp2.keySet().toArray()[0].toString(); String d2 = mp2.keySet().toArray()[0].toString();
return d2.compareTo(d1); return d2.compareTo(d1);
...@@ -167,9 +177,7 @@ public class ApiBuilder { ...@@ -167,9 +177,7 @@ public class ApiBuilder {
JaxrsMethodDescribe jaxrsMethodDescribe = method.getAnnotation(JaxrsMethodDescribe.class); JaxrsMethodDescribe jaxrsMethodDescribe = method.getAnnotation(JaxrsMethodDescribe.class);
JaxrsApiMethod jaxrsMethod = new JaxrsApiMethod(); JaxrsApiMethod jaxrsMethod = new JaxrsApiMethod();
jaxrsMethod.setName(method.getName()); jaxrsMethod.setName(method.getName());
//jaxrsMethod.setDescription(jaxrsMethodDescribe.value());
Class<?> actionClass = jaxrsMethodDescribe.action(); Class<?> actionClass = jaxrsMethodDescribe.action();
//jaxrsMethod.setClassName(actionClass.getName());
if (null != method.getAnnotation(GET.class)) { if (null != method.getAnnotation(GET.class)) {
jaxrsMethod.setMethod("GET"); jaxrsMethod.setMethod("GET");
} else if (null != method.getAnnotation(POST.class)) { } else if (null != method.getAnnotation(POST.class)) {
...@@ -541,23 +549,13 @@ public class ApiBuilder { ...@@ -541,23 +549,13 @@ public class ApiBuilder {
public String getName() { public String getName() {
return name; return name;
} }
/*
private List<Map<String,JaxrsApiMethod>> methods = new ArrayList<Map<String,JaxrsApiMethod>>();
public List<Map<String, JaxrsApiMethod>> getMethods() {
return methods;
}
public void setMethods(List<Map<String, JaxrsApiMethod>> methods) {
this.methods = methods;
}
*/
public void setName(String name) { public void setName(String name) {
this.name = name; this.name = name;
} }
} }
public class JaxrsApiMethod{ public class JaxrsApiMethod{
//private List<JaxsApiMethodProperty> name = new ArrayList<>();
private String name; private String name;
private String uri; private String uri;
private String method; private String method;
......
...@@ -80,6 +80,7 @@ public class CreateConfigSample { ...@@ -80,6 +80,7 @@ public class CreateConfigSample {
classes.add(WorkTime.class); classes.add(WorkTime.class);
classes.add(ZhengwuDingding.class); classes.add(ZhengwuDingding.class);
classes.add(Cache.class); classes.add(Cache.class);
//classes.add(Web.class);
Collections.sort(classes, new Comparator<Class<?>>() { Collections.sort(classes, new Comparator<Class<?>>() {
public int compare(Class<?> c1, Class<?> c2) { public int compare(Class<?> c1, Class<?> c2) {
......
...@@ -21,6 +21,7 @@ public class ApplicationServer extends ConfigObject { ...@@ -21,6 +21,7 @@ public class ApplicationServer extends ConfigObject {
private static final String DEFAULT_STATEXCLUSIONS = "*.js,*.gif,*.jpg,*.png,*.css,*.ico"; private static final String DEFAULT_STATEXCLUSIONS = "*.js,*.gif,*.jpg,*.png,*.css,*.ico";
private static final Integer DEFAULT_MAXFORMCONTENT = 20; private static final Integer DEFAULT_MAXFORMCONTENT = 20;
private static final Boolean DEFAULT_EXPOSEJEST = true; private static final Boolean DEFAULT_EXPOSEJEST = true;
private static final Boolean DEFAULT_PERSISTENTCONNECTIONSENABLE = true;
public ApplicationServer() { public ApplicationServer() {
this.enable = true; this.enable = true;
...@@ -38,6 +39,7 @@ public class ApplicationServer extends ConfigObject { ...@@ -38,6 +39,7 @@ public class ApplicationServer extends ConfigObject {
this.statExclusions = DEFAULT_STATEXCLUSIONS; this.statExclusions = DEFAULT_STATEXCLUSIONS;
this.maxFormContent = DEFAULT_MAXFORMCONTENT; this.maxFormContent = DEFAULT_MAXFORMCONTENT;
this.exposeJest = DEFAULT_EXPOSEJEST; this.exposeJest = DEFAULT_EXPOSEJEST;
this.persistentConnectionsEnable = DEFAULT_PERSISTENTCONNECTIONSENABLE;
} }
@FieldDescribe("是否启用") @FieldDescribe("是否启用")
...@@ -71,6 +73,14 @@ public class ApplicationServer extends ConfigObject { ...@@ -71,6 +73,14 @@ public class ApplicationServer extends ConfigObject {
@FieldDescribe("暴露jest接口.") @FieldDescribe("暴露jest接口.")
private Boolean exposeJest; private Boolean exposeJest;
@FieldDescribe("是否启用长连接,默认false.")
private Boolean persistentConnectionsEnable;
public Boolean getPersistentConnectionsEnable() {
return persistentConnectionsEnable == null ? DEFAULT_PERSISTENTCONNECTIONSENABLE
: this.persistentConnectionsEnable;
}
public Boolean getExposeJest() { public Boolean getExposeJest() {
return BooleanUtils.isNotFalse(this.exposeJest); return BooleanUtils.isNotFalse(this.exposeJest);
} }
......
...@@ -22,6 +22,7 @@ public class CenterServer extends ConfigObject { ...@@ -22,6 +22,7 @@ public class CenterServer extends ConfigObject {
private static final String DEFAULT_STATEXCLUSIONS = "*.js,*.gif,*.jpg,*.png,*.css,*.ico"; private static final String DEFAULT_STATEXCLUSIONS = "*.js,*.gif,*.jpg,*.png,*.css,*.ico";
private static final Integer DEFAULT_MAXFORMCONTENT = 20; private static final Integer DEFAULT_MAXFORMCONTENT = 20;
private static final Boolean DEFAULT_EXPOSEJEST = true; private static final Boolean DEFAULT_EXPOSEJEST = true;
private static final Boolean DEFAULT_PERSISTENTCONNECTIONSENABLE = true;
public static CenterServer defaultInstance() { public static CenterServer defaultInstance() {
return new CenterServer(); return new CenterServer();
...@@ -42,6 +43,7 @@ public class CenterServer extends ConfigObject { ...@@ -42,6 +43,7 @@ public class CenterServer extends ConfigObject {
this.statExclusions = DEFAULT_STATEXCLUSIONS; this.statExclusions = DEFAULT_STATEXCLUSIONS;
this.maxFormContent = DEFAULT_MAXFORMCONTENT; this.maxFormContent = DEFAULT_MAXFORMCONTENT;
this.exposeJest = DEFAULT_EXPOSEJEST; this.exposeJest = DEFAULT_EXPOSEJEST;
this.persistentConnectionsEnable = DEFAULT_PERSISTENTCONNECTIONSENABLE;
} }
@FieldDescribe("是否启用") @FieldDescribe("是否启用")
...@@ -75,6 +77,14 @@ public class CenterServer extends ConfigObject { ...@@ -75,6 +77,14 @@ public class CenterServer extends ConfigObject {
@FieldDescribe("暴露jest接口.") @FieldDescribe("暴露jest接口.")
private Boolean exposeJest; private Boolean exposeJest;
@FieldDescribe("是否启用长连接,默认false.")
private Boolean persistentConnectionsEnable;
public Boolean getPersistentConnectionsEnable() {
return persistentConnectionsEnable == null ? DEFAULT_PERSISTENTCONNECTIONSENABLE
: this.persistentConnectionsEnable;
}
public Boolean getExposeJest() { public Boolean getExposeJest() {
return BooleanUtils.isNotFalse(this.exposeJest); return BooleanUtils.isNotFalse(this.exposeJest);
} }
......
...@@ -57,7 +57,7 @@ public class DataServer extends ConfigObject { ...@@ -57,7 +57,7 @@ public class DataServer extends ConfigObject {
private Boolean jmxEnable; private Boolean jmxEnable;
@FieldDescribe("H2数据库缓存大小,设置H2用于作为缓存的内存大小,以M作为单位,这里默认为512M.") @FieldDescribe("H2数据库缓存大小,设置H2用于作为缓存的内存大小,以M作为单位,这里默认为512M.")
private Integer cacheSize; private Integer cacheSize;
@FieldDescribe("默认日志级别,FATAL, ERROR, WARN, INFO, TRACE. 完的配置为DefaultLevel=WARN, Tool=TRACE, Enhance=TRACE, METADATA=TRACE, Runtime=TRACE, Query=TRACE, DataCache=TRACE, JDBC=TRACE, SQL=TRACE") @FieldDescribe("默认日志级别,FATAL, ERROR, WARN, INFO, TRACE. 完的配置为DefaultLevel=WARN, Tool=TRACE, Enhance=TRACE, METADATA=TRACE, Runtime=TRACE, Query=TRACE, DataCache=TRACE, JDBC=TRACE, SQL=TRACE")
private String logLevel; private String logLevel;
@FieldDescribe("最大使用连接数") @FieldDescribe("最大使用连接数")
private Integer maxTotal; private Integer maxTotal;
......
...@@ -31,7 +31,7 @@ public class Dingding extends ConfigObject { ...@@ -31,7 +31,7 @@ public class Dingding extends ConfigObject {
@FieldDescribe("应用的密钥") @FieldDescribe("应用的密钥")
private String appSecret; private String appSecret;
@FieldDescribe("组织同步cron,默认每10分钟同步一次.") @FieldDescribe("回调信号触发同步检查,默认每10分钟运行一次,如果期间内有钉钉回调信号接收到,那么触发同步任务进行人员同步.")
private String syncCron; private String syncCron;
@FieldDescribe("强制拉入同步cron,默认在每天的8点和12点强制进行同步.") @FieldDescribe("强制拉入同步cron,默认在每天的8点和12点强制进行同步.")
......
...@@ -30,6 +30,9 @@ public class ExternalDataSource extends ConfigObject { ...@@ -30,6 +30,9 @@ public class ExternalDataSource extends ConfigObject {
this.statEnable = DEFAULT_STATENABLE; this.statEnable = DEFAULT_STATENABLE;
this.statFilter = DEFAULT_STATFILTER; this.statFilter = DEFAULT_STATFILTER;
this.slowSqlMillis = DEFAULT_SLOWSQLMILLIS; this.slowSqlMillis = DEFAULT_SLOWSQLMILLIS;
this.transactionIsolation = DEFAULT_TRANSACTIONISOLATION;
this.testConnectionOnCheckin = DEFAULT_TESTCONNECTIONONCHECKIN;
this.testConnectionOnCheckout = DEFAULT_TESTCONNECTIONONCHECKOUT;
} }
public static ExternalDataSource defaultInstance() { public static ExternalDataSource defaultInstance() {
...@@ -58,13 +61,20 @@ public class ExternalDataSource extends ConfigObject { ...@@ -58,13 +61,20 @@ public class ExternalDataSource extends ConfigObject {
private String statFilter; private String statFilter;
@FieldDescribe("执行缓慢sql毫秒数,默认2000毫秒,执行缓慢的sql将被单独记录.") @FieldDescribe("执行缓慢sql毫秒数,默认2000毫秒,执行缓慢的sql将被单独记录.")
private Integer slowSqlMillis; private Integer slowSqlMillis;
@FieldDescribe("设置此数据库存储的类,默认情况下存储所有类型,如果需要对每个类进行单独的控制以达到高性能,可以将不同的类存储到不同的节点上提高性能.可以使用通配符*") @FieldDescribe("设置此数据库存储的类,默认情况下存储所有类型,如果需要对每个类进行单独的控制以达到高性能,可以将不同的类存储到不同的节点上提高性能.可以使用通配符*")
private List<String> includes; private List<String> includes;
@FieldDescribe("在此节点上不存储的类,和includes一起设置实际存储的类,可以使用通配符*") @FieldDescribe("在此节点上不存储的类,和includes一起设置实际存储的类,可以使用通配符*")
private List<String> excludes; private List<String> excludes;
@FieldDescribe("默认日志级别,FATAL, ERROR, WARN, INFO, TRACE. 完成的配置为DefaultLevel=WARN, Tool=TRACE, Enhance=TRACE, METADATA=TRACE, Runtime=TRACE, Query=TRACE, DataCache=TRACE, JDBC=TRACE, SQL=TRACE") @FieldDescribe("默认日志级别,FATAL, ERROR, WARN, INFO, TRACE. 完成的配置为DefaultLevel=WARN, Tool=TRACE, Enhance=TRACE, METADATA=TRACE, Runtime=TRACE, Query=TRACE, DataCache=TRACE, JDBC=TRACE, SQL=TRACE")
private String logLevel = DEFAULT_LOGLEVEL; private String logLevel = DEFAULT_LOGLEVEL;
@FieldDescribe("事务隔离级别:default,none,read-committed,read-uncommitted,repeatable-read,serializable.默认使用default(数据库设置的事务级别).")
private String transactionIsolation;
@FieldDescribe("测试入池连接,默认false.")
private Boolean testConnectionOnCheckin;
@FieldDescribe("测试出池连接,默认false.")
private Boolean testConnectionOnCheckout;
@FieldDescribe("空闲阈值,默认300秒.")
private Integer maxIdleTime;
public static final Integer DEFAULT_MAXTOTAL = 50; public static final Integer DEFAULT_MAXTOTAL = 50;
...@@ -78,6 +88,31 @@ public class ExternalDataSource extends ConfigObject { ...@@ -78,6 +88,31 @@ public class ExternalDataSource extends ConfigObject {
public static final String DEFAULT_LOGLEVEL = "WARN"; public static final String DEFAULT_LOGLEVEL = "WARN";
public static final String DEFAULT_TRANSACTIONISOLATION = "default";
public static final Boolean DEFAULT_TESTCONNECTIONONCHECKIN = false;
public static final Boolean DEFAULT_TESTCONNECTIONONCHECKOUT = false;
public static final Integer DEFAULT_MAXIDLETIME = 300;
public Integer getMaxIdleTime() {
return maxIdleTime == null ? DEFAULT_MAXIDLETIME : this.maxIdleTime;
}
public Boolean getTestConnectionOnCheckin() {
return this.testConnectionOnCheckin == null ? DEFAULT_TESTCONNECTIONONCHECKIN : this.testConnectionOnCheckin;
}
public Boolean getTestConnectionOnCheckout() {
return this.testConnectionOnCheckout == null ? DEFAULT_TESTCONNECTIONONCHECKOUT : this.testConnectionOnCheckout;
}
public String getTransactionIsolation() {
return StringUtils.isEmpty(this.transactionIsolation) ? DEFAULT_TRANSACTIONISOLATION
: this.transactionIsolation;
}
public String getLogLevel() { public String getLogLevel() {
return StringUtils.isEmpty(this.logLevel) ? DEFAULT_LOGLEVEL : this.logLevel; return StringUtils.isEmpty(this.logLevel) ? DEFAULT_LOGLEVEL : this.logLevel;
} }
......
...@@ -117,4 +117,32 @@ public class ExternalDataSources extends CopyOnWriteArrayList<ExternalDataSource ...@@ -117,4 +117,32 @@ public class ExternalDataSources extends CopyOnWriteArrayList<ExternalDataSource
throw new Exception("hasSchema error."); throw new Exception("hasSchema error.");
} }
public String getTransactionIsolation() {
for (ExternalDataSource o : this) {
return o.getTransactionIsolation();
}
return null;
}
public Boolean getTestConnectionOnCheckin() {
for (ExternalDataSource o : this) {
return o.getTestConnectionOnCheckin();
}
return null;
}
public Boolean getTestConnectionOnCheckout() {
for (ExternalDataSource o : this) {
return o.getTestConnectionOnCheckout();
}
return null;
}
public Integer getMaxIdleTime() {
for (ExternalDataSource o : this) {
return o.getMaxIdleTime();
}
return null;
}
} }
...@@ -180,10 +180,10 @@ public class Node extends ConfigObject { ...@@ -180,10 +180,10 @@ public class Node extends ConfigObject {
return DateTools.cronAvailable(this.cron()); return DateTools.cronAvailable(this.cron());
} }
@FieldDescribe("是否启用,默认每天凌晨2点进行备份.") @FieldDescribe("是否启用,默认禁用.")
private Boolean enable = true; private Boolean enable = false;
@FieldDescribe("定时任务cron表达式") @FieldDescribe("定时任务cron表达式,默认每天凌晨2点进行备份.")
private String cron = ""; private String cron = "";
@FieldDescribe("最大保留份数,超过将自动删除最久的数据.") @FieldDescribe("最大保留份数,超过将自动删除最久的数据.")
......
...@@ -19,7 +19,7 @@ public class Qiyeweixin extends ConfigObject { ...@@ -19,7 +19,7 @@ public class Qiyeweixin extends ConfigObject {
@FieldDescribe("是否启用.") @FieldDescribe("是否启用.")
private Boolean enable; private Boolean enable;
@FieldDescribe("拉入同步cron,默认每10分钟同步一次.") @FieldDescribe("回调信号触发同步检查,默认每10分钟运行一次,如果期间内有企业微信回调信号接收到,那么触发同步任务进行人员同步.")
private String syncCron; private String syncCron;
@FieldDescribe("强制拉入同步cron,默认在每天的8点和12点强制进行同步.") @FieldDescribe("强制拉入同步cron,默认在每天的8点和12点强制进行同步.")
private String forceSyncCron; private String forceSyncCron;
...@@ -420,7 +420,6 @@ public class Qiyeweixin extends ConfigObject { ...@@ -420,7 +420,6 @@ public class Qiyeweixin extends ConfigObject {
this.scanLoginEnable = scanLoginEnable; this.scanLoginEnable = scanLoginEnable;
} }
public Boolean getAttendanceSyncEnable() { public Boolean getAttendanceSyncEnable() {
return attendanceSyncEnable; return attendanceSyncEnable;
} }
...@@ -451,8 +450,7 @@ public class Qiyeweixin extends ConfigObject { ...@@ -451,8 +450,7 @@ public class Qiyeweixin extends ConfigObject {
BaseTools.executeSyncFile(Config.PATH_CONFIG_QIYEWEIXIN); BaseTools.executeSyncFile(Config.PATH_CONFIG_QIYEWEIXIN);
} }
// 企业微信的logo 企业微信扫码登录的时候显示用
//企业微信的logo 企业微信扫码登录的时候显示用
// public static final String qywxLogo = "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"; // public static final String qywxLogo = "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";
public static final String qywxLogo = "https://app.o2oa.net/download/qywx-logo.png"; public static final String qywxLogo = "https://app.o2oa.net/download/qywx-logo.png";
} }
...@@ -8,9 +8,14 @@ public class Vfs extends ConfigObject { ...@@ -8,9 +8,14 @@ public class Vfs extends ConfigObject {
private Ftp ftp = new Ftp(); private Ftp ftp = new Ftp();
private Ftps ftps = new Ftps(); private Ftps ftps = new Ftps();
private Sftp sftp = new Sftp();
public Vfs() { public Vfs() {
} }
public Sftp getSftp() {
return ((null != this.sftp) ? this.sftp : new Sftp());
}
public Ftp getFtp() { public Ftp getFtp() {
return ((null != this.ftp) ? this.ftp : new Ftp()); return ((null != this.ftp) ? this.ftp : new Ftp());
...@@ -24,6 +29,21 @@ public class Vfs extends ConfigObject { ...@@ -24,6 +29,21 @@ public class Vfs extends ConfigObject {
return new Vfs(); return new Vfs();
} }
public static class Sftp extends ConfigObject {
@FieldDescribe("是否启用被动方式传输,默认true")
private Boolean passive = true;
public Boolean getPassive() {
return (!BooleanUtils.isFalse(this.passive));
}
public void setPassive(Boolean passive) {
this.passive = passive;
}
}
public static class Ftp extends ConfigObject { public static class Ftp extends ConfigObject {
@FieldDescribe("是否启用被动方式传输,默认true") @FieldDescribe("是否启用被动方式传输,默认true")
......
...@@ -10,231 +10,228 @@ import java.util.Calendar; ...@@ -10,231 +10,228 @@ import java.util.Calendar;
import java.util.Date; import java.util.Date;
/** /**
* Created by fancyLou on 2020-07-24. * Created by fancyLou on 2020-07-24. Copyright © 2020 O2. All rights reserved.
* Copyright © 2020 O2. All rights reserved.
*/ */
public class WeLink extends ConfigObject { public class WeLink extends ConfigObject {
@FieldDescribe("是否启用") @FieldDescribe("是否启用")
private Boolean enable; private Boolean enable;
@FieldDescribe("WeLink应用的client_id") @FieldDescribe("WeLink应用的client_id")
private String clientId; private String clientId;
@FieldDescribe("WeLink应用的client_secret") @FieldDescribe("WeLink应用的client_secret")
private String clientSecret; private String clientSecret;
@FieldDescribe("回调信号触发同步检查,默认每10分钟运行一次,如果期间内有WeLink回调信号接收到,那么触发同步任务进行人员同步.")
private String syncCron;
@FieldDescribe("组织同步cron,默认每10分钟同步一次.") @FieldDescribe("强制拉入同步cron,默认在每天的8点和12点强制进行同步.")
private String syncCron; private String forceSyncCron;
@FieldDescribe("强制拉入同步cron,默认在每天的8点和12点强制进行同步.") @FieldDescribe("WeLink api服务器地址")
private String forceSyncCron; private String oapiAddress;
@FieldDescribe("WeLink api服务器地址") @FieldDescribe("是否启用消息推送")
private String oapiAddress; private Boolean messageEnable;
@FieldDescribe("是否启用消息推送") @FieldDescribe("WeLink消息打开工作的url地址,如:http://dev.o2oa.net/x_desktop/")
private Boolean messageEnable; private String workUrl = "";
@FieldDescribe("WeLink消息打开工作的url地址,如:http://dev.o2oa.net/x_desktop/") @FieldDescribe("WeLink消息处理完成后跳转到特定的门户页面的Id")
private String workUrl = ""; private String messageRedirectPortal = "";
@FieldDescribe("WeLink消息处理完成后跳转到特定的门户页面的Id") public static WeLink defaultInstance() {
private String messageRedirectPortal = ""; return new WeLink();
}
public static final Boolean default_enable = false;
public static WeLink defaultInstance() { public static final String default_clientId = "";
return new WeLink(); public static final String default_clientSecret = "";
} public static final String default_syncCron = "10 0/10 * * * ?";
public static final String default_forceSyncCron = "10 45 8,12 * * ?";
public static final Boolean default_enable = false; public static final String default_oapiAddress = "https://open.welink.huaweicloud.com/api";
public static final String default_clientId = ""; public static final Boolean default_messageEnable = false;
public static final String default_clientSecret = ""; public static final String default_workUrl = "";
public static final String default_syncCron = "10 0/10 * * * ?"; public static final String default_messageRedirectPortal = "";
public static final String default_forceSyncCron = "10 45 8,12 * * ?";
public static final String default_oapiAddress = "https://open.welink.huaweicloud.com/api"; public WeLink() {
public static final Boolean default_messageEnable = false; this.enable = default_enable;
public static final String default_workUrl = ""; this.clientId = default_clientId;
public static final String default_messageRedirectPortal = ""; this.clientSecret = default_clientSecret;
this.syncCron = default_syncCron;
this.forceSyncCron = default_forceSyncCron;
public WeLink() { this.oapiAddress = default_oapiAddress;
this.enable = default_enable; this.messageEnable = default_messageEnable;
this.clientId = default_clientId; this.workUrl = default_workUrl;
this.clientSecret = default_clientSecret; this.messageRedirectPortal = default_messageRedirectPortal;
this.syncCron = default_syncCron; }
this.forceSyncCron = default_forceSyncCron;
this.oapiAddress = default_oapiAddress; public static String WeLink_Auth_Head_Key = "x-wlk-Authorization";
this.messageEnable = default_messageEnable;
this.workUrl = default_workUrl; private static String cachedAccessToken;
this.messageRedirectPortal = default_messageRedirectPortal; private static Date cachedAccessTokenDate;
}
public static class AccessTokenReq {
public static String WeLink_Auth_Head_Key = "x-wlk-Authorization"; private String client_id;
private String client_secret;
private static String cachedAccessToken;
private static Date cachedAccessTokenDate; public String getClient_id() {
return client_id;
public static class AccessTokenReq { }
private String client_id;
private String client_secret; public void setClient_id(String client_id) {
this.client_id = client_id;
public String getClient_id() { }
return client_id;
} public String getClient_secret() {
return client_secret;
public void setClient_id(String client_id) { }
this.client_id = client_id;
} public void setClient_secret(String client_secret) {
this.client_secret = client_secret;
public String getClient_secret() { }
return client_secret; }
}
public static class AccessTokenResp {
public void setClient_secret(String client_secret) {
this.client_secret = client_secret; private String access_token;
} private String code;
} private String message;
public static class AccessTokenResp { private Integer expires_in;
private String access_token; public String getAccess_token() {
private String code; return access_token;
private String message; }
private Integer expires_in;
public void setAccess_token(String access_token) {
public String getAccess_token() { this.access_token = access_token;
return access_token; }
}
public String getCode() {
public void setAccess_token(String access_token) { return code;
this.access_token = access_token; }
}
public void setCode(String code) {
public String getCode() { this.code = code;
return code; }
}
public String getMessage() {
public void setCode(String code) { return message;
this.code = code; }
}
public void setMessage(String message) {
public String getMessage() { this.message = message;
return message; }
}
public Integer getExpires_in() {
public void setMessage(String message) { return expires_in;
this.message = message; }
}
public void setExpires_in(Integer expires_in) {
public Integer getExpires_in() { this.expires_in = expires_in;
return expires_in; }
} }
public void setExpires_in(Integer expires_in) { /**
this.expires_in = expires_in; * 获取WeLink AccessToken
} *
} * @return
* @throws Exception
/** */
* 获取WeLink AccessToken public String accessToken() throws Exception {
* @return if ((StringUtils.isNotEmpty(cachedAccessToken) && (null != cachedAccessTokenDate))
* @throws Exception && (cachedAccessTokenDate.after(new Date()))) {
*/ return cachedAccessToken;
public String accessToken() throws Exception { } else {
if ((StringUtils.isNotEmpty(cachedAccessToken) && (null != cachedAccessTokenDate)) String address = this.getOapiAddress() + "/auth/v2/tickets";
&& (cachedAccessTokenDate.after(new Date()))) { AccessTokenReq req = new AccessTokenReq();
return cachedAccessToken; req.setClient_id(this.getClientId());
} else { req.setClient_secret(this.getClientSecret());
String address = this.getOapiAddress() + "/auth/v2/tickets"; AccessTokenResp resp = HttpConnection.postAsObject(address, null, XGsonBuilder.instance().toJson(req),
AccessTokenReq req = new AccessTokenReq(); AccessTokenResp.class);
req.setClient_id(this.getClientId()); if (!resp.getCode().equals("0")) {
req.setClient_secret(this.getClientSecret()); throw new ExceptionWeLinkAccessToken(resp.getCode(), resp.getMessage());
AccessTokenResp resp = HttpConnection.postAsObject(address, null, XGsonBuilder.instance().toJson(req), AccessTokenResp.class); }
if (!resp.getCode().equals("0")) { cachedAccessToken = resp.getAccess_token();
throw new ExceptionWeLinkAccessToken(resp.getCode(), resp.getMessage()); Integer second = resp.expires_in;// 过期时间 秒
} Calendar cal = Calendar.getInstance();
cachedAccessToken = resp.getAccess_token(); cal.add(Calendar.SECOND, (second - 300));
Integer second = resp.expires_in;//过期时间 秒 cachedAccessTokenDate = cal.getTime();
Calendar cal = Calendar.getInstance(); return cachedAccessToken;
cal.add(Calendar.SECOND, (second - 300)); }
cachedAccessTokenDate = cal.getTime(); }
return cachedAccessToken;
} public Boolean getEnable() {
} return BooleanUtils.isTrue(this.enable);
}
public void setEnable(Boolean enable) {
public Boolean getEnable() { this.enable = enable;
return BooleanUtils.isTrue(this.enable); }
}
public String getClientId() {
public void setEnable(Boolean enable) { return StringUtils.isEmpty(this.clientId) ? default_clientId : this.clientId;
this.enable = enable; }
}
public void setClientId(String clientId) {
public String getClientId() { this.clientId = clientId;
return StringUtils.isEmpty(this.clientId) ? default_clientId : this.clientId; }
}
public String getClientSecret() {
public void setClientId(String clientId) { return StringUtils.isEmpty(this.clientSecret) ? default_clientSecret : this.clientSecret;
this.clientId = clientId; }
}
public void setClientSecret(String clientSecret) {
public String getClientSecret() { this.clientSecret = clientSecret;
return StringUtils.isEmpty(this.clientSecret) ? default_clientSecret : this.clientSecret; }
}
public String getSyncCron() {
public void setClientSecret(String clientSecret) { return StringUtils.isEmpty(this.syncCron) ? default_syncCron : this.syncCron;
this.clientSecret = clientSecret; }
}
public void setSyncCron(String syncCron) {
public String getSyncCron() { this.syncCron = syncCron;
return StringUtils.isEmpty(this.syncCron) ? default_syncCron : this.syncCron; }
}
public String getForceSyncCron() {
public void setSyncCron(String syncCron) { return StringUtils.isEmpty(this.forceSyncCron) ? default_forceSyncCron : this.forceSyncCron;
this.syncCron = syncCron; }
}
public void setForceSyncCron(String forceSyncCron) {
public String getForceSyncCron() { this.forceSyncCron = forceSyncCron;
return StringUtils.isEmpty(this.forceSyncCron) ? default_forceSyncCron : this.forceSyncCron; }
}
public String getOapiAddress() {
public void setForceSyncCron(String forceSyncCron) { return StringUtils.isEmpty(this.oapiAddress) ? default_oapiAddress : this.oapiAddress;
this.forceSyncCron = forceSyncCron; }
}
public void setOapiAddress(String oapiAddress) {
public String getOapiAddress() { this.oapiAddress = oapiAddress;
return StringUtils.isEmpty(this.oapiAddress) ? default_oapiAddress : this.oapiAddress; }
}
public Boolean getMessageEnable() {
public void setOapiAddress(String oapiAddress) { return BooleanUtils.isTrue(this.messageEnable);
this.oapiAddress = oapiAddress; }
}
public void setMessageEnable(Boolean messageEnable) {
public Boolean getMessageEnable() { this.messageEnable = messageEnable;
return BooleanUtils.isTrue(this.messageEnable); }
}
public String getWorkUrl() {
public void setMessageEnable(Boolean messageEnable) { return StringUtils.isEmpty(this.workUrl) ? default_workUrl : this.workUrl;
this.messageEnable = messageEnable; }
}
public void setWorkUrl(String workUrl) {
public String getWorkUrl() { this.workUrl = workUrl;
return StringUtils.isEmpty(this.workUrl) ? default_workUrl : this.workUrl; }
}
public String getMessageRedirectPortal() {
public void setWorkUrl(String workUrl) { return StringUtils.isEmpty(this.messageRedirectPortal) ? default_messageRedirectPortal
this.workUrl = workUrl; : this.messageRedirectPortal;
} }
public String getMessageRedirectPortal() { public void setMessageRedirectPortal(String messageRedirectPortal) {
return StringUtils.isEmpty(this.messageRedirectPortal) ? default_messageRedirectPortal : this.messageRedirectPortal; this.messageRedirectPortal = messageRedirectPortal;
} }
public void setMessageRedirectPortal(String messageRedirectPortal) {
this.messageRedirectPortal = messageRedirectPortal;
}
} }
...@@ -22,6 +22,7 @@ public class WebServer extends ConfigObject { ...@@ -22,6 +22,7 @@ public class WebServer extends ConfigObject {
this.statEnable = DEFAULT_STATENABLE; this.statEnable = DEFAULT_STATENABLE;
this.statExclusions = DEFAULT_STATEXCLUSIONS; this.statExclusions = DEFAULT_STATEXCLUSIONS;
this.cacheControlMaxAge = DEFAULT_CACHECONTROLMAXAGE; this.cacheControlMaxAge = DEFAULT_CACHECONTROLMAXAGE;
this.persistentConnectionsEnable = DEFAULT_PERSISTENTCONNECTIONSENABLE;
} }
private static final Integer DEFAULT_HTTP_PORT = 80; private static final Integer DEFAULT_HTTP_PORT = 80;
...@@ -33,6 +34,7 @@ public class WebServer extends ConfigObject { ...@@ -33,6 +34,7 @@ public class WebServer extends ConfigObject {
private static final Integer DEFAULT_CACHECONTROLMAXAGE = 0; private static final Integer DEFAULT_CACHECONTROLMAXAGE = 0;
private static final Boolean DEFAULT_PROXYCENTERENABLE = true; private static final Boolean DEFAULT_PROXYCENTERENABLE = true;
private static final Boolean DEFAULT_PROXYAPPLICATIONENABLE = true; private static final Boolean DEFAULT_PROXYAPPLICATIONENABLE = true;
private static final Boolean DEFAULT_PERSISTENTCONNECTIONSENABLE = true;
@FieldDescribe("是否启用") @FieldDescribe("是否启用")
private Boolean enable; private Boolean enable;
...@@ -61,6 +63,14 @@ public class WebServer extends ConfigObject { ...@@ -61,6 +63,14 @@ public class WebServer extends ConfigObject {
@FieldDescribe("是否启用application服务器代理") @FieldDescribe("是否启用application服务器代理")
private Boolean proxyApplicationEnable; private Boolean proxyApplicationEnable;
@FieldDescribe("是否启用长连接,默认true.")
private Boolean persistentConnectionsEnable;
public Boolean getPersistentConnectionsEnable() {
return persistentConnectionsEnable == null ? DEFAULT_PERSISTENTCONNECTIONSENABLE
: this.persistentConnectionsEnable;
}
public Boolean getProxyCenterEnable() { public Boolean getProxyCenterEnable() {
return proxyCenterEnable == null ? DEFAULT_PROXYCENTERENABLE : this.proxyCenterEnable; return proxyCenterEnable == null ? DEFAULT_PROXYCENTERENABLE : this.proxyCenterEnable;
} }
......
...@@ -22,7 +22,7 @@ public class ZhengwuDingding extends ConfigObject { ...@@ -22,7 +22,7 @@ public class ZhengwuDingding extends ConfigObject {
private String appSecret; private String appSecret;
@FieldDescribe("政务钉钉agentId") @FieldDescribe("政务钉钉agentId")
private String agentId; private String agentId;
@FieldDescribe("拉入同步cron,默认每10分钟同步一次.") @FieldDescribe("回调信号触发同步检查,默认每10分钟运行一次,如果期间内有政务钉钉回调信号接收到,那么触发同步任务进行人员同步.")
private String syncCron; private String syncCron;
@FieldDescribe("强制拉入同步cron,默认在每天的8点和12点强制进行同步.") @FieldDescribe("强制拉入同步cron,默认在每天的8点和12点强制进行同步.")
private String forceSyncCron; private String forceSyncCron;
......
...@@ -12,7 +12,7 @@ public class FilterTools { ...@@ -12,7 +12,7 @@ public class FilterTools {
public static final String Access_Control_Allow_Methods = "Access-Control-Allow-Methods"; public static final String Access_Control_Allow_Methods = "Access-Control-Allow-Methods";
public static final String Access_Control_Allow_Methods_Value = "GET, POST, OPTIONS, PUT, DELETE, HEAD, TRACE"; public static final String Access_Control_Allow_Methods_Value = "GET, POST, OPTIONS, PUT, DELETE, HEAD, TRACE";
public static final String Access_Control_Allow_Headers = "Access-Control-Allow-Headers"; public static final String Access_Control_Allow_Headers = "Access-Control-Allow-Headers";
public static final String Access_Control_Allow_Headers_Value = "x-requested-with, x-request, x-token, c-token, Content-Type, Content-Length, x-cipher, x-client, x-debugger, Authorization"; public static final String Access_Control_Allow_Headers_Value = "x-requested-with, x-request, x-token, c-token, Content-Type, Content-Length, x-cipher, x-client, x-debugger, Authorization, P-User-Id, P-Request-Id, P-Page-Id";
public static final String Access_Control_Allow_Credentials = "Access-Control-Allow-Credentials"; public static final String Access_Control_Allow_Credentials = "Access-Control-Allow-Credentials";
public static final String Access_Control_Expose_Headers = "Access-Control-Expose-Headers"; public static final String Access_Control_Expose_Headers = "Access-Control-Expose-Headers";
public static final String Access_Control_Max_Age = "Access-Control-Max-Age"; public static final String Access_Control_Max_Age = "Access-Control-Max-Age";
......
...@@ -34,8 +34,6 @@ public class HttpToken { ...@@ -34,8 +34,6 @@ public class HttpToken {
public static final String X_Debugger = "x-debugger"; public static final String X_Debugger = "x-debugger";
public static final String COOKIE_ANONYMOUS_VALUE = "anonymous"; public static final String COOKIE_ANONYMOUS_VALUE = "anonymous";
public static final String SET_COOKIE = "Set-Cookie"; public static final String SET_COOKIE = "Set-Cookie";
private static final String RegularExpression_IP = "([1-9]|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])(\\.(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])){3}"; private static final String RegularExpression_IP = "([1-9]|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])(\\.(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])){3}";
private static final String RegularExpression_Token = "^(anonymous|user|manager|cipher)([2][0][1-2][0-9][0-1][0-9][0-3][0-9][0-5][0-9][0-5][0-9][0-5][0-9])(\\S{1,})$"; private static final String RegularExpression_Token = "^(anonymous|user|manager|cipher)([2][0][1-2][0-9][0-1][0-9][0-3][0-9][0-5][0-9][0-5][0-9][0-5][0-9])(\\S{1,})$";
...@@ -165,7 +163,11 @@ public class HttpToken { ...@@ -165,7 +163,11 @@ public class HttpToken {
token = request.getHeader(X_Token); token = request.getHeader(X_Token);
} }
if (StringUtils.isEmpty(token)) { if (StringUtils.isEmpty(token)) {
token = request.getHeader(X_Authorization); //如果使用oauth bearer 通过此传递认证信息.需要进行判断,格式为 Bearer xxxxxxx
String value = request.getHeader(X_Authorization);
if (!StringUtils.contains(value, " ")) {
token = value;
}
} }
// 此代码将导致input被关闭. // 此代码将导致input被关闭.
// if (StringUtils.isEmpty(token)) { // if (StringUtils.isEmpty(token)) {
...@@ -205,8 +207,5 @@ public class HttpToken { ...@@ -205,8 +207,5 @@ public class HttpToken {
private String userAgent(HttpServletRequest request) { private String userAgent(HttpServletRequest request) {
return Objects.toString(request.getHeader("User-Agent"), ""); return Objects.toString(request.getHeader("User-Agent"), "");
} }
} }
\ No newline at end of file
package com.x.base.core.project.jaxrs; package com.x.base.core.project.jaxrs;
import java.net.URI; import java.net.URI;
import java.util.Date;
import java.util.Objects; import java.util.Objects;
import java.util.zip.CRC32; import java.util.zip.CRC32;
...@@ -81,7 +80,7 @@ public class ResponseFactory { ...@@ -81,7 +80,7 @@ public class ResponseFactory {
} }
} else { } else {
if ((null != result.getData()) && (result.getData() instanceof WoFile)) { if ((null != result.getData()) && (result.getData() instanceof WoFile)) {
/* 附件,二进制流文件 */ // 附件,二进制流文件
WoFile wo = (WoFile) result.getData(); WoFile wo = (WoFile) result.getData();
EntityTag tag = new EntityTag(etagWoFile(wo)); EntityTag tag = new EntityTag(etagWoFile(wo));
if (notModified(request, tag)) { if (notModified(request, tag)) {
...@@ -91,13 +90,13 @@ public class ResponseFactory { ...@@ -91,13 +90,13 @@ public class ResponseFactory {
.header(Content_Type, wo.getContentType()).header(Content_Length, wo.getBytes().length) .header(Content_Type, wo.getContentType()).header(Content_Length, wo.getBytes().length)
.header(Accept_Ranges, "bytes").tag(tag).build(); .header(Accept_Ranges, "bytes").tag(tag).build();
} else if ((null != result.getData()) && (result.getData() instanceof WoText)) { } else if ((null != result.getData()) && (result.getData() instanceof WoText)) {
/* 纯文本text */ // 纯文本text
WoText wo = (WoText) result.getData(); WoText wo = (WoText) result.getData();
EntityTag tag = new EntityTag(etagWoText(wo)); EntityTag tag = new EntityTag(etagWoText(wo));
if (notModified(request, tag)) { if (notModified(request, tag)) {
return Response.notModified().tag(tag).build(); return Response.notModified().tag(tag).build();
} }
return Response.ok(wo.getText()).type(HttpMediaType.TEXT_PLAIN_UTF_8).tag(tag).build(); return Response.ok(wo.getText()).type(wo.getContentType()).tag(tag).build();
} else if ((null != result.getData()) && (result.getData() instanceof WoContentType)) { } else if ((null != result.getData()) && (result.getData() instanceof WoContentType)) {
WoContentType wo = (WoContentType) result.getData(); WoContentType wo = (WoContentType) result.getData();
EntityTag tag = new EntityTag(etagWoContentType(wo)); EntityTag tag = new EntityTag(etagWoContentType(wo));
...@@ -106,10 +105,10 @@ public class ResponseFactory { ...@@ -106,10 +105,10 @@ public class ResponseFactory {
} }
return Response.ok(wo.getBody()).type(wo.getContentType()).tag(tag).build(); return Response.ok(wo.getBody()).type(wo.getContentType()).tag(tag).build();
} else if ((null != result.getData()) && (result.getData() instanceof WoCallback)) { } else if ((null != result.getData()) && (result.getData() instanceof WoCallback)) {
/* jsonp callback */ // jsonp callback
return Response.ok(callback((WoCallback) result.getData())).build(); return Response.ok(callback((WoCallback) result.getData())).build();
} else if ((null != result.getData()) && (result.getData() instanceof WoSeeOther)) { } else if ((null != result.getData()) && (result.getData() instanceof WoSeeOther)) {
/* 303 */ // 303
WoSeeOther wo = (WoSeeOther) result.getData(); WoSeeOther wo = (WoSeeOther) result.getData();
try { try {
return Response.seeOther(new URI(wo.getUrl())).build(); return Response.seeOther(new URI(wo.getUrl())).build();
...@@ -117,7 +116,7 @@ public class ResponseFactory { ...@@ -117,7 +116,7 @@ public class ResponseFactory {
return Response.serverError().entity(Objects.toString(wo.getUrl(), "")).build(); return Response.serverError().entity(Objects.toString(wo.getUrl(), "")).build();
} }
} else if ((null != result.getData()) && (result.getData() instanceof WoTemporaryRedirect)) { } else if ((null != result.getData()) && (result.getData() instanceof WoTemporaryRedirect)) {
/* 304 */ // 304
WoTemporaryRedirect wo = (WoTemporaryRedirect) result.getData(); WoTemporaryRedirect wo = (WoTemporaryRedirect) result.getData();
try { try {
return Response.temporaryRedirect(new URI(wo.getUrl())).build(); return Response.temporaryRedirect(new URI(wo.getUrl())).build();
...@@ -125,29 +124,35 @@ public class ResponseFactory { ...@@ -125,29 +124,35 @@ public class ResponseFactory {
return Response.serverError().entity(Objects.toString(wo.getUrl(), "")).build(); return Response.serverError().entity(Objects.toString(wo.getUrl(), "")).build();
} }
} else { } else {
/* default */ // default
EntityTag tag = new EntityTag(etagDefault(result.getData())); Integer maxAge = maxAgeDefault(result.getData());
if (notModified(request, tag)) { if (null != maxAge) {
return Response.notModified().tag(tag).build(); CacheControl cacheControl = new CacheControl();
cacheControl.setMaxAge(maxAge);
return Response.ok(result.toJson()).cacheControl(cacheControl).build();
} else {
EntityTag tag = new EntityTag(etagDefault(result.getData()));
if (notModified(request, tag)) {
return Response.notModified().tag(tag).build();
}
return Response.ok(result.toJson()).tag(tag).build();
} }
return Response.ok(result.toJson()).tag(tag).build();
} }
} }
} }
private static boolean notModified(HttpServletRequest request, EntityTag tag) { private static boolean notModified(HttpServletRequest request, EntityTag tag) {
String If_None_Match = request.getHeader(HttpHeader.IF_NONE_MATCH.toString()); String ifNoneMatch = request.getHeader(HttpHeader.IF_NONE_MATCH.toString());
if (StringUtils.isNotEmpty(If_None_Match)) { return (StringUtils.isNotEmpty(ifNoneMatch) && StringUtils.equals(ifNoneMatch, "\"" + tag.getValue() + "\""));
if (StringUtils.equals(If_None_Match, "\"" + tag.getValue() + "\"")) {
return true;
}
}
return false;
} }
private static String etagWoFile(WoFile wo) { private static String etagWoFile(WoFile wo) {
CRC32 crc = new CRC32(); CRC32 crc = new CRC32();
crc.update(wo.getBytes()); if (StringUtils.isNotEmpty(wo.getFastETag())) {
crc.update(wo.getFastETag().getBytes(DefaultCharset.charset_utf_8));
} else {
crc.update(wo.getBytes());
}
return crc.getValue() + ""; return crc.getValue() + "";
} }
...@@ -159,16 +164,36 @@ public class ResponseFactory { ...@@ -159,16 +164,36 @@ public class ResponseFactory {
private static String etagWoText(WoText wo) { private static String etagWoText(WoText wo) {
CRC32 crc = new CRC32(); CRC32 crc = new CRC32();
crc.update(wo.getText().getBytes(DefaultCharset.charset_utf_8)); if (StringUtils.isNotEmpty(wo.getFastETag())) {
crc.update(wo.getFastETag().getBytes(DefaultCharset.charset_utf_8));
} else {
crc.update(wo.getText().getBytes(DefaultCharset.charset_utf_8));
}
return crc.getValue() + ""; return crc.getValue() + "";
} }
private static String etagDefault(Object o) { private static String etagDefault(Object o) {
CRC32 crc = new CRC32(); CRC32 crc = new CRC32();
crc.update(XGsonBuilder.toJson(o).getBytes(DefaultCharset.charset_utf_8)); if (o instanceof WoMaxAgeFastETag) {
WoMaxAgeFastETag fast = ((WoMaxAgeFastETag) o);
if (StringUtils.isNotEmpty(fast.getFastETag())) {
crc.update(fast.getFastETag().getBytes(DefaultCharset.charset_utf_8));
} else {
crc.update(XGsonBuilder.toJson(o).getBytes(DefaultCharset.charset_utf_8));
}
} else {
crc.update(XGsonBuilder.toJson(o).getBytes(DefaultCharset.charset_utf_8));
}
return crc.getValue() + ""; return crc.getValue() + "";
} }
private static Integer maxAgeDefault(Object o) {
if (o instanceof WoMaxAgeFastETag) {
return ((WoMaxAgeFastETag) o).getMaxAge();
}
return null;
}
private static String callback(WoCallback woCallback) { private static String callback(WoCallback woCallback) {
ActionResult<Object> result = new ActionResult<>(); ActionResult<Object> result = new ActionResult<>();
result.setData(woCallback.getObject()); result.setData(woCallback.getObject());
......
package com.x.base.core.project.jaxrs; package com.x.base.core.project.jaxrs;
import com.x.base.core.project.annotation.FieldDescribe; import com.x.base.core.project.annotation.FieldDescribe;
import com.x.base.core.project.gson.GsonPropertyObject;
public abstract class WoFile extends GsonPropertyObject { public abstract class WoFile extends WoMaxAgeFastETag {
private static final long serialVersionUID = -4566232046358204025L; private static final long serialVersionUID = -4566232046358204025L;
@FieldDescribe("说明") @FieldDescribe("说明")
......
package com.x.base.core.project.jaxrs;
import com.x.base.core.project.gson.GsonPropertyObject;
public class WoMaxAgeFastETag extends GsonPropertyObject {
private static final long serialVersionUID = -8408799363043605326L;
private String fastETag;
private Integer maxAge = null;
public String getFastETag() {
return fastETag;
}
public void setFastETag(String fastETag) {
this.fastETag = fastETag;
}
public Integer getMaxAge() {
return maxAge;
}
public void setMaxAge(Integer maxAge) {
this.maxAge = maxAge;
}
}
package com.x.base.core.project.jaxrs; package com.x.base.core.project.jaxrs;
import org.apache.commons.lang3.StringUtils;
import com.x.base.core.project.annotation.FieldDescribe; import com.x.base.core.project.annotation.FieldDescribe;
import com.x.base.core.project.gson.GsonPropertyObject; import com.x.base.core.project.http.HttpMediaType;
public class WoText extends GsonPropertyObject { public class WoText extends WoMaxAgeFastETag {
public WoText() { public WoText() {
} }
...@@ -15,6 +17,17 @@ public class WoText extends GsonPropertyObject { ...@@ -15,6 +17,17 @@ public class WoText extends GsonPropertyObject {
@FieldDescribe("text") @FieldDescribe("text")
private String text; private String text;
@FieldDescribe("返回Content_Type")
private String contentType;
public String getContentType() {
return StringUtils.isEmpty(this.contentType) ? HttpMediaType.TEXT_PLAIN_UTF_8 : this.contentType;
}
public void setContentType(String contentType) {
this.contentType = contentType;
}
public String getText() { public String getText() {
return text; return text;
} }
......
...@@ -198,7 +198,8 @@ public class Logger { ...@@ -198,7 +198,8 @@ public class Logger {
sb.append(e.getMessage()); sb.append(e.getMessage());
String headString = this.headToString(request); String headString = this.headToString(request);
String bodyString = this.bodyToString(body); String bodyString = this.bodyToString(body);
String requestUrl = request.getRequestURL().toString(); String requestUrl = request.getRequestURL().toString()
+ (StringUtils.isEmpty(request.getQueryString()) ? "" : "?" + request.getQueryString());
String stackTraceString = ExceptionUtils.getStackTrace(e); String stackTraceString = ExceptionUtils.getStackTrace(e);
Object[] arr = new String[] { effectivePerson.getDistinguishedName(), request.getMethod(), requestUrl, Object[] arr = new String[] { effectivePerson.getDistinguishedName(), request.getMethod(), requestUrl,
request.getRemoteHost(), request.getRemoteAddr(), headString, bodyString }; request.getRemoteHost(), request.getRemoteAddr(), headString, bodyString };
......
...@@ -3,30 +3,26 @@ package com.x.base.core.project.script; ...@@ -3,30 +3,26 @@ package com.x.base.core.project.script;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.regex.Matcher;
import javax.script.Compilable; import javax.script.Compilable;
import javax.script.CompiledScript; import javax.script.CompiledScript;
import javax.script.ScriptContext;
import javax.script.ScriptEngine; import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager; import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import javax.script.SimpleScriptContext;
import org.apache.commons.beanutils.PropertyUtils; import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.lang3.BooleanUtils; import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.text.StringEscapeUtils;
import com.google.gson.JsonArray; import com.google.gson.JsonArray;
import com.google.gson.JsonElement; import com.google.gson.JsonElement;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
import com.x.base.core.entity.JpaObject; import com.x.base.core.entity.JpaObject;
import com.x.base.core.project.config.Config; import com.x.base.core.project.config.Config;
import com.x.base.core.project.tools.StringTools; import com.x.base.core.project.tools.PropertyTools;
import jdk.nashorn.api.scripting.ScriptObjectMirror; import jdk.nashorn.api.scripting.ScriptObjectMirror;
import jdk.nashorn.internal.runtime.ScriptObject;
public class ScriptFactory { public class ScriptFactory {
...@@ -242,10 +238,7 @@ public class ScriptFactory { ...@@ -242,10 +238,7 @@ public class ScriptFactory {
if (obj instanceof CharSequence) { if (obj instanceof CharSequence) {
list.add(Objects.toString(obj, "")); list.add(Objects.toString(obj, ""));
} else { } else {
Object d = PropertyUtils.getProperty(obj, JpaObject.DISTINGUISHEDNAME); list.add(PropertyTools.getOrElse(obj, JpaObject.DISTINGUISHEDNAME, String.class, ""));
if (null != d) {
list.add(Objects.toString(d, ""));
}
} }
} }
} }
...@@ -258,19 +251,23 @@ public class ScriptFactory { ...@@ -258,19 +251,23 @@ public class ScriptFactory {
if (obj instanceof CharSequence) { if (obj instanceof CharSequence) {
list.add(Objects.toString(obj, "")); list.add(Objects.toString(obj, ""));
} else { } else {
Object d = PropertyUtils.getProperty(obj, JpaObject.DISTINGUISHEDNAME); if (obj instanceof ScriptObject) {
if (null != d) { ScriptObject so = (ScriptObject) obj;
list.add(Objects.toString(d, "")); if (so.containsKey(JpaObject.DISTINGUISHEDNAME)) {
list.add(Objects.toString(so.get(JpaObject.DISTINGUISHEDNAME), ""));
}
} else {
list.add(PropertyTools.getOrElse(obj, JpaObject.DISTINGUISHEDNAME, String.class,
""));
} }
} }
} }
} }
} else { } else {
Object d = PropertyUtils.getProperty(o, JpaObject.DISTINGUISHEDNAME); list.add(PropertyTools.getOrElse(o, JpaObject.DISTINGUISHEDNAME, String.class, ""));
if (null != d) {
list.add(Objects.toString(d, ""));
}
} }
} else {
list.add(Objects.toString(o, ""));
} }
} }
return list; return list;
......
package com.x.base.core.project.tools;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLDecoder;
import java.nio.charset.Charset;
import java.util.regex.Pattern;
public class EscapeStringTools {
public static final Charset utf8Charset = Charset.forName("UTF-8");
protected static final String _allowableInUrl = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!#$&'()*+,-./:;=?@_~";
protected static final String _allowableInUrlQuery = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!#$%&'()*+,-./:;=?@_~";
private static final char _URIEscape = '%';
static final byte blank = 32;
static final byte plus = 43;
static final byte hexa = 97;
static final byte hexf = 102;
static final byte hexA = 65;
static final byte hexF = 70;
static final byte hex0 = 48;
static final byte hex9 = 57;
static final byte ten = 10;
private static String xescapeString(String in, String allowable, char esc, boolean spaceplus) {
try {
StringBuffer out = new StringBuffer();
if (in == null)
return null;
byte[] utf8 = in.getBytes(utf8Charset);
byte[] allow8 = allowable.getBytes(utf8Charset);
for (byte b : utf8) {
if (b == 32 && spaceplus) {
out.append('+');
} else {
boolean found = false;
for (byte a : allow8) {
if (a == b) {
found = true;
break;
}
}
if (found) {
out.append((char)b);
} else {
String c = Integer.toHexString(b);
out.append(esc);
if (c.length() < 2)
out.append('0');
out.append(c);
}
}
}
return out.toString();
} catch (Exception e) {
return in;
}
}
private static String escapeString(String in, String allowable) {
return xescapeString(in, allowable, '%', false);
}
private static String xunescapeString(String in, char escape, boolean spaceplus) {
try {
if (in == null)
return null;
byte[] utf8 = in.getBytes(utf8Charset);
byte escape8 = (byte)escape;
byte[] out = new byte[utf8.length];
int index8 = 0;
for (int i = 0; i < utf8.length; ) {
byte b = utf8[i++];
if (b == 43 && spaceplus) {
out[index8++] = 32;
} else if (b == escape8) {
if (i + 2 <= utf8.length) {
b = (byte)(fromHex(utf8[i]) << 4 | fromHex(utf8[i + 1]));
i += 2;
}
}
out[index8++] = b;
}
return new String(out, 0, index8, utf8Charset);
} catch (Exception e) {
return in;
}
}
private static String unescapeString(String in) {
return xunescapeString(in, '%', false);
}
private static byte fromHex(byte b) throws NumberFormatException {
if (b >= 48 && b <= 57)
return (byte)(b - 48);
if (b >= 97 && b <= 102)
return (byte)(10 + b - 97);
if (b >= 65 && b <= 70)
return (byte)(10 + b - 65);
throw new NumberFormatException("Illegal hex character: " + b);
}
private static final Pattern p = Pattern.compile("([\\w]+)://([.\\w]+(:[\\d]+)?)([/][^?#])?([?][^#]*)?([#].*)?");
public static String escapeURL(String surl) {
String protocol = null;
String authority = null;
String path = null;
String query = null;
String fragment = null;
URL u = null;
try {
u = new URL(surl);
} catch (MalformedURLException e) {
return null;
}
protocol = u.getProtocol();
authority = u.getAuthority();
path = u.getPath();
query = u.getQuery();
fragment = u.getRef();
StringBuilder url = new StringBuilder();
url.append(protocol);
url.append("://");
url.append(authority);
if (path != null && path.length() > 0) {
String[] pieces = path.split("[/]", -1);
for (int i = 0; i < pieces.length; i++) {
String p = pieces[i];
if (p == null)
p = "";
if (i > 0)
url.append("/");
url.append(urlEncode(p));
}
}
if (query != null && query.length() > 0) {
url.append("?");
url.append(escapeURLQuery(query));
}
if (fragment != null && fragment.length() > 0) {
url.append("#");
url.append(urlEncode(fragment));
}
return url.toString();
}
static int nextpiece(String s, int index, String sep) {
index = s.indexOf(sep, index);
if (index < 0)
index = s.length();
return index;
}
public static String escapeURLQuery(String ce) {
try {
ce = escapeString(ce, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!#$%&'()*+,-./:;=?@_~");
} catch (Exception e) {
ce = null;
}
return ce;
}
public static String unescapeURLQuery(String ce) {
try {
ce = unescapeString(ce);
} catch (Exception e) {
ce = null;
}
return ce;
}
public static String urlEncode(String s) {
s = escapeString(s, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!#$&'()*+,-./:;=?@_~");
return s;
}
public static String urlDecode(String s) {
try {
s = URLDecoder.decode(s, "UTF-8");
} catch (Exception e) {
s = null;
}
return s;
}
}
package com.x.base.core.project.tools; package com.x.base.core.project.tools;
import java.lang.reflect.Field;
import org.apache.commons.beanutils.PropertyUtils; import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.lang3.reflect.FieldUtils;
public class PropertyTools { public class PropertyTools {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public static <T> T getOrElse(Object bean, String name, Class<T> cls, T defaultObject) throws Exception { public static <T> T getOrElse(Object bean, String name, Class<T> cls, T defaultObject) throws Exception {
if ((null != bean) && PropertyUtils.isReadable(bean, name)) { if (null != bean) {
Object o = PropertyUtils.getProperty(bean, name); try {
if (null != o) { // 如果使用PropertyUtils.isReadable那么Nested就会失效,无法获取map类型中的值.
return (T) o; // Object o = PropertyUtils.getNestedProperty(bean, name);
Object o = PropertyUtils.getProperty(bean, name);
if (null != o) {
return (T) o;
}
} catch (NoSuchMethodException e) {
// java.lang.NoSuchMethodException: Unknown property 'abc' on class 'class
// java.lang.Object'
// nothing pass
}
Field field = FieldUtils.getField(bean.getClass(), name, true);
if (null != field) {
Object o = FieldUtils.readField(field, bean, true);
if (null != o) {
return (T) o;
}
} }
} }
return defaultObject; return defaultObject;
} }
}
}
\ No newline at end of file
package com.x.base.core.project.tools; package com.x.base.core.project.tools;
import static java.util.Locale.ENGLISH;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.lang.reflect.Field; import java.lang.reflect.Field;
...@@ -29,6 +31,8 @@ import org.apache.commons.lang3.StringUtils; ...@@ -29,6 +31,8 @@ import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.reflect.FieldUtils; import org.apache.commons.lang3.reflect.FieldUtils;
import org.slf4j.helpers.MessageFormatter; import org.slf4j.helpers.MessageFormatter;
import com.alibaba.druid.sql.visitor.functions.Char;
public class StringTools { public class StringTools {
// 脚本文本 // 脚本文本
...@@ -365,28 +369,6 @@ public class StringTools { ...@@ -365,28 +369,6 @@ public class StringTools {
public static boolean matchWildcard(String str, String pattern) { public static boolean matchWildcard(String str, String pattern) {
return Objects.toString(str, "").matches(Objects.toString(pattern, "").replace("?", ".?").replace("*", ".*?")); return Objects.toString(str, "").matches(Objects.toString(pattern, "").replace("?", ".?").replace("*", ".*?"));
// if (StringUtils.isNotEmpty(str) && StringUtils.isNotEmpty(pattern) &&
// StringUtils.contains(pattern, "*")) {
// if (StringUtils.equals(pattern, "*")) {
// return true;
// }
// if (StringUtils.startsWith(pattern, "*")) {
// return StringUtils.endsWith(str, StringUtils.substringAfter(pattern, "*"));
// }
// if (StringUtils.endsWith(pattern, "*")) {
// return StringUtils.startsWith(str, StringUtils.substringBeforeLast(pattern,
// "*"));
// }
// String[] parts = StringUtils.split(pattern, "*", 2);
// if (StringUtils.startsWith(str, parts[0]) && StringUtils.endsWith(str,
// parts[1])) {
// return true;
// } else {
// return false;
// }
// } else {
// return StringUtils.equals(str, pattern);
// }
} }
public static List<String> includesExcludesWithWildcard(List<String> list, Collection<String> includes, public static List<String> includesExcludesWithWildcard(List<String> list, Collection<String> includes,
...@@ -544,4 +526,26 @@ public class StringTools { ...@@ -544,4 +526,26 @@ public class StringTools {
return result.toArray(new String[result.size()]); return result.toArray(new String[result.size()]);
} }
public static String getMethodName(String name) {
return methodName("get", name);
}
public static String setMethodName(String name) {
return methodName("set", name);
}
private static String methodName(String getOrSet, String name) {
if (StringUtils.isEmpty(name) || StringUtils.isEmpty(getOrSet)) {
return name;
}
StringBuilder sb = new StringBuilder();
sb.append(getOrSet);
if ((name.length() > 1) && (StringUtils.isAllLowerCase(name.substring(0, 1))
&& StringUtils.isAllUpperCase(name.substring(1, 2)))) {
sb.append(name);
} else {
sb.append(StringUtils.capitalize(name));
}
return sb.toString();
}
} }
\ No newline at end of file
...@@ -85,4 +85,12 @@ public class WorkTime extends BaseWorkTime { ...@@ -85,4 +85,12 @@ public class WorkTime extends BaseWorkTime {
return false; return false;
} }
public boolean isWorkDay(Date d) {
return !this.isHoliday(DateUtils.toCalendar(d));
}
public boolean isWorkDay(Calendar c) {
return !this.isHoliday(c);
}
} }
package com.x.base.core.project; package com.x.base.core.project;
import com.x.base.core.entity.StorageType;
import com.x.base.core.project.annotation.Module; import com.x.base.core.project.annotation.Module;
import com.x.base.core.project.annotation.ModuleCategory; import com.x.base.core.project.annotation.ModuleCategory;
import com.x.base.core.project.annotation.ModuleType; import com.x.base.core.project.annotation.ModuleType;
...@@ -10,6 +11,6 @@ import com.x.base.core.project.annotation.ModuleType; ...@@ -10,6 +11,6 @@ import com.x.base.core.project.annotation.ModuleType;
"com.x.organization.core.entity.Identity", "com.x.organization.core.entity.PersonAttribute", "com.x.organization.core.entity.Identity", "com.x.organization.core.entity.PersonAttribute",
"com.x.organization.core.entity.Unit", "com.x.organization.core.entity.UnitAttribute", "com.x.organization.core.entity.Unit", "com.x.organization.core.entity.UnitAttribute",
"com.x.organization.core.entity.PersonCard","com.x.organization.core.entity.PermissionSetting", "com.x.organization.core.entity.PersonCard","com.x.organization.core.entity.PermissionSetting",
"com.x.organization.core.entity.UnitDuty" }, storeJars = { "x_organization_core_entity" }) "com.x.organization.core.entity.UnitDuty", "com.x.general.core.entity.file.GeneralFile" },storageTypes = { StorageType.general}, storeJars = { "x_organization_core_entity" ,"x_general_core_entity"})
public class x_organization_assemble_control extends Deployable { public class x_organization_assemble_control extends Deployable {
} }
...@@ -7,7 +7,8 @@ import com.x.base.core.project.annotation.ModuleType; ...@@ -7,7 +7,8 @@ import com.x.base.core.project.annotation.ModuleType;
@Module(type = ModuleType.ASSEMBLE, category = ModuleCategory.OFFICIAL, name = "门户设计", packageName = "com.x.portal.assemble.designer", containerEntities = { @Module(type = ModuleType.ASSEMBLE, category = ModuleCategory.OFFICIAL, name = "门户设计", packageName = "com.x.portal.assemble.designer", containerEntities = {
"com.x.portal.core.entity.Portal", "com.x.portal.core.entity.Widget", "com.x.portal.core.entity.Page", "com.x.portal.core.entity.Portal", "com.x.portal.core.entity.Widget", "com.x.portal.core.entity.Page",
"com.x.portal.core.entity.Script", "com.x.portal.core.entity.File", "com.x.portal.core.entity.Script", "com.x.portal.core.entity.File",
"com.x.portal.core.entity.TemplatePage" }, storeJars = { "x_organization_core_entity", "com.x.portal.core.entity.TemplatePage", "com.x.cms.core.entity.element.Script",
"x_organization_core_express", "x_portal_core_entity" }) "com.x.processplatform.core.entity.element.Script" }, storeJars = { "x_organization_core_entity",
"x_organization_core_express", "x_portal_core_entity", "x_cms_core_entity", "x_processplatform_core_entity" })
public class x_portal_assemble_designer extends Deployable { public class x_portal_assemble_designer extends Deployable {
} }
...@@ -6,7 +6,9 @@ import com.x.base.core.project.annotation.ModuleType; ...@@ -6,7 +6,9 @@ import com.x.base.core.project.annotation.ModuleType;
@Module(type = ModuleType.ASSEMBLE, category = ModuleCategory.OFFICIAL, name = "门户", packageName = "com.x.portal.assemble.surface", containerEntities = { @Module(type = ModuleType.ASSEMBLE, category = ModuleCategory.OFFICIAL, name = "门户", packageName = "com.x.portal.assemble.surface", containerEntities = {
"com.x.portal.core.entity.Portal", "com.x.portal.core.entity.Widget", "com.x.portal.core.entity.Page", "com.x.portal.core.entity.Portal", "com.x.portal.core.entity.Widget", "com.x.portal.core.entity.Page",
"com.x.portal.core.entity.Script", "com.x.portal.core.entity.File" }, storeJars = { "com.x.portal.core.entity.Script", "com.x.portal.core.entity.File", "com.x.cms.core.entity.element.Script",
"x_organization_core_entity", "x_organization_core_express", "x_portal_core_entity" }) "com.x.processplatform.core.entity.element.Script" }, storeJars = {
"x_organization_core_entity", "x_organization_core_express", "x_portal_core_entity", "x_cms_core_entity",
"x_processplatform_core_entity" })
public class x_portal_assemble_surface extends Deployable { public class x_portal_assemble_surface extends Deployable {
} }
\ No newline at end of file
...@@ -29,9 +29,11 @@ import com.x.base.core.project.annotation.ModuleType; ...@@ -29,9 +29,11 @@ import com.x.base.core.project.annotation.ModuleType;
"com.x.processplatform.core.entity.element.Form", "com.x.processplatform.core.entity.element.FormField", "com.x.processplatform.core.entity.element.Form", "com.x.processplatform.core.entity.element.FormField",
"com.x.processplatform.core.entity.element.Embed", "com.x.processplatform.core.entity.element.Mapping", "com.x.processplatform.core.entity.element.Embed", "com.x.processplatform.core.entity.element.Mapping",
"com.x.processplatform.core.entity.log.SignalStackLog", "com.x.query.core.entity.Item", "com.x.processplatform.core.entity.log.SignalStackLog", "com.x.query.core.entity.Item",
"com.x.cms.core.entity.element.Script", "com.x.portal.core.entity.Script",
"com.x.query.dynamic.entity.*" }, storageTypes = { StorageType.processPlatform }, storeJars = { "com.x.query.dynamic.entity.*" }, storageTypes = { StorageType.processPlatform }, storeJars = {
"x_organization_core_entity", "x_organization_core_express", "x_processplatform_core_entity", "x_organization_core_entity", "x_organization_core_express", "x_processplatform_core_entity",
"x_processplatform_core_express", "x_query_core_entity" }, dynamicJars = { "x_query_dynamic_entity" }) "x_processplatform_core_express", "x_query_core_entity", "x_cms_core_entity",
"x_portal_core_entity" }, dynamicJars = { "x_query_dynamic_entity" })
public class x_processplatform_service_processing extends Deployable { public class x_processplatform_service_processing extends Deployable {
} }
...@@ -124,6 +124,12 @@ ...@@ -124,6 +124,12 @@
</execution> </execution>
</executions> </executions>
</plugin> </plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins> </plugins>
</build> </build>
</project> </project>
...@@ -124,6 +124,12 @@ ...@@ -124,6 +124,12 @@
</execution> </execution>
</executions> </executions>
</plugin> </plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins> </plugins>
</build> </build>
</project> </project>
...@@ -144,6 +144,12 @@ ...@@ -144,6 +144,12 @@
</execution> </execution>
</executions> </executions>
</plugin> </plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins> </plugins>
</build> </build>
</project> </project>
...@@ -9,6 +9,7 @@ import com.x.cms.assemble.control.jaxrs.appinfo.AppInfoAnonymousAction; ...@@ -9,6 +9,7 @@ import com.x.cms.assemble.control.jaxrs.appinfo.AppInfoAnonymousAction;
import com.x.cms.assemble.control.jaxrs.appinfo.AppInfoConfigAction; import com.x.cms.assemble.control.jaxrs.appinfo.AppInfoConfigAction;
import com.x.cms.assemble.control.jaxrs.categoryinfo.CategoryInfoAction; import com.x.cms.assemble.control.jaxrs.categoryinfo.CategoryInfoAction;
import com.x.cms.assemble.control.jaxrs.categoryinfo.CategoryInfoAnonymousAction; import com.x.cms.assemble.control.jaxrs.categoryinfo.CategoryInfoAnonymousAction;
import com.x.cms.assemble.control.jaxrs.commend.DocumentCommendAction;
import com.x.cms.assemble.control.jaxrs.comment.DocumentCommentInfoAction; import com.x.cms.assemble.control.jaxrs.comment.DocumentCommentInfoAction;
import com.x.cms.assemble.control.jaxrs.data.DataAction; import com.x.cms.assemble.control.jaxrs.data.DataAction;
import com.x.cms.assemble.control.jaxrs.document.DocumentAction; import com.x.cms.assemble.control.jaxrs.document.DocumentAction;
...@@ -85,6 +86,7 @@ public class ActionApplication extends AbstractActionApplication { ...@@ -85,6 +86,7 @@ public class ActionApplication extends AbstractActionApplication {
this.classes.add(FormAnonymousAction.class); this.classes.add(FormAnonymousAction.class);
this.classes.add(ScriptAnonymousAction.class); this.classes.add(ScriptAnonymousAction.class);
this.classes.add(DocumentCommentInfoAction.class); this.classes.add(DocumentCommentInfoAction.class);
this.classes.add(DocumentCommendAction.class);
return this.classes; return this.classes;
} }
......
package com.x.cms.assemble.control.jaxrs; package com.x.cms.assemble.control.jaxrs;
import com.x.base.core.project.jaxrs.ManagerUserJaxrsFilter; import com.x.base.core.project.jaxrs.CipherManagerUserJaxrsFilter;
import javax.servlet.annotation.WebFilter; import javax.servlet.annotation.WebFilter;
...@@ -37,8 +37,9 @@ import javax.servlet.annotation.WebFilter; ...@@ -37,8 +37,9 @@ import javax.servlet.annotation.WebFilter;
"/jaxrs/permission/*", "/jaxrs/permission/*",
"/jaxrs/docpermission/*", "/jaxrs/docpermission/*",
"/jaxrs/comment/*", "/jaxrs/comment/*",
"/jaxrs/commend/*",
"/servlet/*" "/servlet/*"
}, asyncSupported = true) }, asyncSupported = true)
public class CmsJaxrsFilter extends ManagerUserJaxrsFilter { public class CmsJaxrsFilter extends CipherManagerUserJaxrsFilter {
} }
\ No newline at end of file
...@@ -13,6 +13,7 @@ import com.x.base.core.entity.dataitem.ItemCategory; ...@@ -13,6 +13,7 @@ import com.x.base.core.entity.dataitem.ItemCategory;
import com.x.base.core.project.bean.WrapCopier; import com.x.base.core.project.bean.WrapCopier;
import com.x.base.core.project.bean.WrapCopierFactory; import com.x.base.core.project.bean.WrapCopierFactory;
import com.x.base.core.project.cache.ApplicationCache; import com.x.base.core.project.cache.ApplicationCache;
import com.x.base.core.project.cache.CacheManager;
import com.x.base.core.project.http.ActionResult; import com.x.base.core.project.http.ActionResult;
import com.x.base.core.project.http.EffectivePerson; import com.x.base.core.project.http.EffectivePerson;
import com.x.base.core.project.jaxrs.WoId; import com.x.base.core.project.jaxrs.WoId;
...@@ -47,7 +48,7 @@ class ActionCreate extends BaseAction { ...@@ -47,7 +48,7 @@ class ActionCreate extends BaseAction {
emc.persist(o, CheckPersistType.all); emc.persist(o, CheckPersistType.all);
} }
emc.commit(); emc.commit();
ApplicationCache.notify(AppDict.class); CacheManager.notify(AppDict.class);
Wo wo = new Wo(); Wo wo = new Wo();
wo.setId(appInfoDict.getId()); wo.setId(appInfoDict.getId());
result.setData(wo); result.setData(wo);
......
...@@ -6,6 +6,7 @@ import com.x.base.core.container.EntityManagerContainer; ...@@ -6,6 +6,7 @@ import com.x.base.core.container.EntityManagerContainer;
import com.x.base.core.container.factory.EntityManagerContainerFactory; import com.x.base.core.container.factory.EntityManagerContainerFactory;
import com.x.base.core.entity.annotation.CheckRemoveType; import com.x.base.core.entity.annotation.CheckRemoveType;
import com.x.base.core.project.cache.ApplicationCache; import com.x.base.core.project.cache.ApplicationCache;
import com.x.base.core.project.cache.CacheManager;
import com.x.base.core.project.http.ActionResult; import com.x.base.core.project.http.ActionResult;
import com.x.base.core.project.http.EffectivePerson; import com.x.base.core.project.http.EffectivePerson;
import com.x.base.core.project.jaxrs.WoId; import com.x.base.core.project.jaxrs.WoId;
...@@ -37,7 +38,7 @@ class ActionDelete extends BaseAction { ...@@ -37,7 +38,7 @@ class ActionDelete extends BaseAction {
emc.beginTransaction(AppDict.class); emc.beginTransaction(AppDict.class);
emc.remove(dict, CheckRemoveType.all); emc.remove(dict, CheckRemoveType.all);
emc.commit(); emc.commit();
ApplicationCache.notify(AppDict.class); CacheManager.notify(AppDict.class);
Wo wo = new Wo(); Wo wo = new Wo();
wo.setId(dict.getId()); wo.setId(dict.getId());
result.setData(wo); result.setData(wo);
......
...@@ -124,7 +124,7 @@ public class ActionFileUpdateCallback extends BaseAction { ...@@ -124,7 +124,7 @@ public class ActionFileUpdateCallback extends BaseAction {
attachment.getText()); attachment.getText());
} }
attachment.saveContent(mapping, bytes, fileName); attachment.updateContent(mapping, bytes, fileName);
attachment = fileInfoServiceAdv.updateAttachment( docId, old_attId, attachment, mapping ); attachment = fileInfoServiceAdv.updateAttachment( docId, old_attId, attachment, mapping );
// //
// List<String> keys = new ArrayList<>(); // List<String> keys = new ArrayList<>();
......
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册