Compare commits

...

78 Commits
1.0 ... master

Author SHA1 Message Date
richie 298d68108e Merge pull request '修改pom文件中仓库位置' (#12) from onlyxx/finekit:master into master 2 years ago
左良 8304ca3fca 修改pom文件中仓库位置 2 years ago
fanglei d478c5195c Pull request #48: REPORT-51953 【设计器埋点】userid应该记录论坛用户的id而不是用户名 3 years ago
方磊 6c6d508a4d REPORT-51953 【设计器埋点】userid应该记录论坛用户的id而不是用户名 3 years ago
fanglei e2e8e2ae9b Pull request #47: REPORT-50207 埋点插件需要用到的一些后台方法封装到Finekit中 3 years ago
方磊 d7b8d62996 REPORT-50207 埋点插件需要用到的一些后台方法封装到Finekit中 3 years ago
fanglei dfd16cb126 Pull request #46: REPORT-50744 在FineKit增加根据JTemplate对象获取templateId的方法 3 years ago
方磊 198f73b578 REPORT-50744 用JTemplateProvider替代JTemplate 3 years ago
方磊 7013e6461f REPORT-50744 补上注释 3 years ago
方磊 649edf31f9 REPORT-50744 在FineKit增加根据JTemplate对象获取templateId的方法 3 years ago
fanglei 2f51c2b3c0 Pull request #45: REPORT-50744 在FineKit增加获取当前模板ID的方法和获取设计器ID的方法 3 years ago
方磊 b6778538bc REPORT-50744 在FineKit增加获取当前模板ID的方法和获取设计器ID的方法 3 years ago
richie 6df075061c 增加数据集lock特性 3 years ago
richie 30b5970252 Merge pull request 'REPORT-47782 数据集-数据连接-数据集界面的数据连接按钮,鼠标悬浮时的提示不对' (#10) from yvan/finekit:master into master 3 years ago
Yvan 521dd29c3e REPORT-47782 数据集-数据连接-数据集界面的数据连接按钮,鼠标悬浮时的提示不对 3 years ago
richie 8280abdf3b Merge pull request 'WIP REPORT-39459 json数据集-传参方式从get改为post-raw,参数的值没有保留' (#9) from Lucian.Chen/finekit:master into master 3 years ago
lucian c8fb5454f3 REPORT-39459 json数据集-传参方式从get改为post-raw,参数的值没有保留 3 years ago
richie 22c28b7090 Merge pull request 'REPORT-43833 【10.0.14】远程设计数据连接/服务器数据集增加锁定' (#6) from yvan/finekit:master into master 3 years ago
Yvan a1900cf1ba REPORT-43833 【10.0.14】远程设计数据连接/服务器数据集增加锁定 3 years ago
richie eaf185c3ed Merge pull request '无 jira 任务 fix: 之前的commit无故丢失,重构内心补上' (#5) from Dylan.Liu/finekit:master into master 3 years ago
Dylan.Liu 753eb6961b 无 jira 任务 fix: 之前的commit无故丢失,重构内心补上 3 years ago
richie c0cfb5d757 Merge pull request 'DEC-16802 fix: FineFileServer.getInstance().getRepoConfig() 接口提供' (#4) from Dylan.Liu/finekit:master into master 3 years ago
Dylan.Liu c7b4de0094 DEC-16802 fix: FineFileServer.getInstance().getRepoConfig() 接口提供 3 years ago
Dylan.Liu a74076a85f DEC-16802 fix: FineFileServer.getInstance().getRepoConfig() 接口提供 3 years ago
richie 49a526fe18 Merge pull request 'DEC-16532 feat: 支持hdfs高可用模式' (#3) from Dylan.Liu/finekit:master into master 3 years ago
Dylan.Liu a5f9492492 DEC-16532 fix: 移除重复的方法 3 years ago
Dylan.Liu 40754f05de DEC-16532 feat: 支持hdfs高可用模式 3 years ago
zed 4793f9c62f Pull request #44: DEC-15861 feat: Fr/Bi融合与独立部署V1 3 years ago
zed afef877673 fix 3 years ago
zed ed3d398e94 Merge remote-tracking branch 'origin/master' 3 years ago
zed a7632f3931 DEC-15861 feat: Fr/Bi融合与独立部署V1 3 years ago
richie f989336efe 新增API 3 years ago
zed defd3cce2a Pull request #43: DEC-15861 feat: Fr/Bi融合与独立部署V1 3 years ago
zed 420bc83904 DEC-15861 feat: Fr/Bi融合与独立部署V1 3 years ago
zed 8439799f7e Merge remote-tracking branch 'origin/master' 3 years ago
zed fb3039634b DEC-15861 feat: Fr/Bi融合与独立部署V1 3 years ago
zed 94a302baa3 Pull request #42: DEC-15861 feat: Fr/Bi融合与独立部署V1 3 years ago
zed 9cff6a3549 DEC-15861 feat: Fr/Bi融合与独立部署V1 3 years ago
richie 143dd065b8 javadoc配置 4 years ago
richie 02ce67e177 不再支持的API 4 years ago
richie 3ceb9c1043 不再支持的API 4 years ago
superman f5268bd1eb Merge pull request #41 in TC/finekit from ~FANGLEI/finekit:master to master 4 years ago
方磊 63bf89f824 KERNEL-4017 H5插件去掉FMobileLicUtils的依赖 4 years ago
superman a6a113c0f0 Merge pull request #40 in TC/finekit from ~FANGLEI/finekit:master to master 4 years ago
方磊 fa0421f466 KERNEL-4017 H5插件去掉FMobileLicUtils的依赖 4 years ago
richie ee06a919f7 移除掉maven配置,完全转为使用gradle 4 years ago
richie e2ae3cd143 Merge branch 'master' of code.fanruan.com:fanruan/finekit 4 years ago
richie 267d432649 修改仓库地址 4 years ago
richie d3efdfe017 Merge branch 'master' of lidongy/finekit into master 4 years ago
lidongy 30f57b7bc8 KERNEL-4414 权限导出finekit适配 4 years ago
richie ea6dadfaa5 finekit版本信息 4 years ago
richie 9fe18b1d23 使用gradle构建javadoc 4 years ago
richie 140ff682d5 Merge branch 'master' of zed/finekit into master 4 years ago
zed 59913502d7 加单元测试 4 years ago
richie c9927c04d9 Merge branch 'master' of Dylan.Liu/finekit into master 4 years ago
zed 189e9cbde9 fix 4 years ago
zed a308409036 DEC-13003 角色批量设置插件finekit适配 4 years ago
Dylan.Liu 535e65c21b 无 jira 任务, 适配主工程代码变动 4 years ago
richie 35d99d0ad6 Merge branch 'master' of Dylan.Liu/finekit into master 4 years ago
Dylan.Liu e0de2f3888 无 jira 任务, 适配主工程代码改动 4 years ago
Dylan.Liu 3f6d4208f2 适配 主工程代码变动 4 years ago
richie 141d939c65 Merge branch 'master' of Dylan.Liu/finekit into master 4 years ago
Dylan.Liu 5419aded99 无 jira 任务 , 适配 1.7 语法 4 years ago
Dylan.Liu 4199182e20 无 jira 任务 finekit 适配状态服务器接口重构 4 years ago
richie 19ffaa02e9 Merge branch 'master' of Lucian.Chen/finekit into master 4 years ago
lucian d1e64878b0 KERNEL-3521 添加FineKit依赖 4 years ago
lucian 6eabb72ab5 KERNEL-3521 添加FineKit依赖 4 years ago
lucian f3f6fe516a KERNEL-3521 添加FineKit依赖 4 years ago
lucian 1592d614d2 KERNEL-3521 添加FineKit依赖 4 years ago
lucian 34ba599b1c KERNEL-3521 添加FineKit依赖 4 years ago
richie 7d66eae57a 提供一个能调用父类的方法 4 years ago
richie 92e765c216 提供一个能调用父类的方法 4 years ago
richie 307fa89147 Merge branch 'master' of Dylan.Liu/finekit into master 4 years ago
Dylan.Liu 8e226b3039 增加一个可以使多个配置 缓存失效的 modify 接口 4 years ago
richie 57a82d1950 规范化API调用 4 years ago
richie f42dc631ec 规范化API调用 4 years ago
richie 6ff386cc38 javadoc补充 4 years ago
richie 036f4302eb 新的适配FineKit的插件 4 years ago
  1. 11
      .gitignore
  2. 60
      build.gradle
  3. 5
      gradle/wrapper/gradle-wrapper.properties
  4. 183
      gradlew
  5. 100
      gradlew.bat
  6. 4
      pom.xml
  7. 41
      readme.md
  8. 1
      settings.gradle
  9. 19
      src/main/java/com/fanruan/api/FineKit.java
  10. 4
      src/main/java/com/fanruan/api/cal/CalculatorKit.java
  11. 51
      src/main/java/com/fanruan/api/cal/ParameterKit.java
  12. 38
      src/main/java/com/fanruan/api/cluster/ClusterBridgeKit.java
  13. 17
      src/main/java/com/fanruan/api/cluster/resource/BaseCommonRepoConfig.java
  14. 25
      src/main/java/com/fanruan/api/cluster/resource/FineFileServerKit.java
  15. 17
      src/main/java/com/fanruan/api/cluster/resource/ResourceModuleContextKit.java
  16. 15
      src/main/java/com/fanruan/api/cluster/resource/WorkContextKit.java
  17. 20
      src/main/java/com/fanruan/api/cluster/state/BaseFineStoreGenericPool.java
  18. 19
      src/main/java/com/fanruan/api/cluster/state/BaseFineStoreWrapper.java
  19. 15
      src/main/java/com/fanruan/api/cluster/state/BaseRedisCollectionConfig.java
  20. 4
      src/main/java/com/fanruan/api/cluster/state/BaseRedisCollectionsClient.java
  21. 5
      src/main/java/com/fanruan/api/cluster/state/BaseRedisStore.java
  22. 17
      src/main/java/com/fanruan/api/cluster/state/BaseStandAloneStore.java
  23. 20
      src/main/java/com/fanruan/api/cluster/state/FineCollectionsKit.java
  24. 9
      src/main/java/com/fanruan/api/cluster/state/FineJedisPoolKit.java
  25. 19
      src/main/java/com/fanruan/api/cluster/state/MachineKit.java
  26. 8
      src/main/java/com/fanruan/api/cluster/state/StandAloneJedisKit.java
  27. 9
      src/main/java/com/fanruan/api/cluster/state/StateServerConfigKit.java
  28. 15
      src/main/java/com/fanruan/api/cluster/state/StoreTemplateKit.java
  29. 20
      src/main/java/com/fanruan/api/concurrent/ConcurrentKit.java
  30. 2
      src/main/java/com/fanruan/api/conf/BaseConfiguration.java
  31. 72
      src/main/java/com/fanruan/api/conf/ConfigurationKit.java
  32. 6
      src/main/java/com/fanruan/api/conf/HolderKit.java
  33. 23
      src/main/java/com/fanruan/api/conf/MarketConfigKit.java
  34. 30
      src/main/java/com/fanruan/api/conf/impl/xml/XmlColConf.java
  35. 22
      src/main/java/com/fanruan/api/conf/impl/xml/XmlConf.java
  36. 30
      src/main/java/com/fanruan/api/conf/xml/XmlHolderKit.java
  37. 6
      src/main/java/com/fanruan/api/data/ConnectionKit.java
  38. 92
      src/main/java/com/fanruan/api/decision/AuthorityKit.java
  39. 24
      src/main/java/com/fanruan/api/decision/CommonKit.java
  40. 122
      src/main/java/com/fanruan/api/decision/login/LoginKit.java
  41. 16
      src/main/java/com/fanruan/api/decision/monitor/RuntimeMemScoreKit.java
  42. 35
      src/main/java/com/fanruan/api/decision/role/CustomRoleKit.java
  43. 10
      src/main/java/com/fanruan/api/decision/store/StateHubManager.java
  44. 45
      src/main/java/com/fanruan/api/decision/user/UserKit.java
  45. 80
      src/main/java/com/fanruan/api/design/DesignKit.java
  46. 22
      src/main/java/com/fanruan/api/design/ui/component/UIHeadGroup.java
  47. 55
      src/main/java/com/fanruan/api/design/ui/component/UILockButton.java
  48. 44
      src/main/java/com/fanruan/api/design/ui/component/UIRadioButton.java
  49. 31
      src/main/java/com/fanruan/api/design/ui/component/chart/CalculateComboBox.java
  50. 4
      src/main/java/com/fanruan/api/design/ui/component/chart/DataFunctionType.java
  51. 36
      src/main/java/com/fanruan/api/design/ui/component/code/UISyntaxTextArea.java
  52. 25
      src/main/java/com/fanruan/api/design/ui/component/code/UISyntaxTextScrollPane.java
  53. 3
      src/main/java/com/fanruan/api/design/ui/component/present/DictionaryPane.java
  54. 8
      src/main/java/com/fanruan/api/design/ui/component/table/action/UITableEditAction.java
  55. 16
      src/main/java/com/fanruan/api/design/ui/component/target/TargetComponent.java
  56. 12
      src/main/java/com/fanruan/api/design/ui/table/BasePropertyTable.java
  57. 29
      src/main/java/com/fanruan/api/design/util/GUICoreKit.java
  58. 40
      src/main/java/com/fanruan/api/design/work/ConnectionComboBoxPanel.java
  59. 14
      src/main/java/com/fanruan/api/design/work/FormHyperlinkGroupPane.java
  60. 2
      src/main/java/com/fanruan/api/design/work/RichTextToolBar.java
  61. 198
      src/main/java/com/fanruan/api/design/work/SelectImagePane.java
  62. 50
      src/main/java/com/fanruan/api/design/work/compat/ConnectionLockHelper.java
  63. 122
      src/main/java/com/fanruan/api/design/work/component/ItemEditableComboBoxPanel.java
  64. 3
      src/main/java/com/fanruan/api/design/work/component/ParameterComboBox.java
  65. 2
      src/main/java/com/fanruan/api/function/FunctionKit.java
  66. 6
      src/main/java/com/fanruan/api/function/shell/FineFunc.java
  67. 18
      src/main/java/com/fanruan/api/image/general/ImageWithSuffix.java
  68. 9
      src/main/java/com/fanruan/api/macro/ProductConstants.java
  69. 60
      src/main/java/com/fanruan/api/net/http/HttpKit.java
  70. 2
      src/main/java/com/fanruan/api/net/http/rs/BaseHttpResponseHandle.java
  71. 2
      src/main/java/com/fanruan/api/net/http/rs/StreamResponseHandle.java
  72. 2
      src/main/java/com/fanruan/api/net/http/rs/TextResponseHandle.java
  73. 2
      src/main/java/com/fanruan/api/net/http/rs/UploadResponseHandle.java
  74. 24
      src/main/java/com/fanruan/api/report/ReportEntryKit.java
  75. 2
      src/main/java/com/fanruan/api/report/TemplateKit.java
  76. 2
      src/main/java/com/fanruan/api/report/analy/AnalyKit.java
  77. 9
      src/main/java/com/fanruan/api/report/cell/CellImage.java
  78. 22
      src/main/java/com/fanruan/api/report/cell/FloatElement.java
  79. 12
      src/main/java/com/fanruan/api/report/view/BaseViewActor.java
  80. 12
      src/main/java/com/fanruan/api/report/write/BaseWriteActor.java
  81. 9
      src/main/java/com/fanruan/api/runtime/EnvKit.java
  82. 40
      src/main/java/com/fanruan/api/security/SecurityKit.java
  83. 4
      src/main/java/com/fanruan/api/util/ArrayKit.java
  84. 18
      src/main/java/com/fanruan/api/util/AssistKit.java
  85. 1
      src/main/java/com/fanruan/api/util/CodeKit.java
  86. 11
      src/main/java/com/fanruan/api/util/DateKit.java
  87. 16
      src/main/java/com/fanruan/api/util/FineCollectionKit.java
  88. 10
      src/main/java/com/fanruan/api/util/GeneralKit.java
  89. 39
      src/main/java/com/fanruan/api/util/HyperKit.java
  90. 1
      src/main/java/com/fanruan/api/util/IOKit.java
  91. 32
      src/main/java/com/fanruan/api/util/LicKit.java
  92. 6
      src/main/java/com/fanruan/api/util/StringKit.java
  93. 2
      src/main/java/com/fanruan/api/util/TransmissionKit.java
  94. 2
      src/main/java/com/fanruan/api/util/trans/BaseSmsBody.java
  95. 2
      src/main/java/com/fanruan/api/util/trans/BatchSmsBody.java
  96. 2
      src/main/java/com/fanruan/api/util/trans/EmailBody.java
  97. 2
      src/main/java/com/fanruan/api/util/trans/SingleSmsBody.java
  98. 2
      src/test/java/com/fanruan/api/ModulePrepare.java
  99. 2
      src/test/java/com/fanruan/api/cal/CalculatorKitEnvTest.java
  100. 2
      src/test/java/com/fanruan/api/cal/CalculatorKitTest.java
  101. Some files were not shown because too many files have changed in this diff Show More

11
.gitignore vendored

@ -1,6 +1,13 @@
*.iml
.idea/
target/
/target/
/download/
/webroot/
.DS_Store
.classpath
.gradle
build
local.properties
classes/
transform-classes/
tomcat.*
*.jar

60
build.gradle

@ -0,0 +1,60 @@
apply plugin: 'java'
/**
*
*/
def fineVersion = '10.0-FEATURE-SNAPSHOT'
group = 'com.fanruan.api'
version = '10.0'
sourceCompatibility = '1.8'
static def getDate() {
def date = new Date()
def formattedDate = date.format('yyyyMMdd')
return formattedDate
}
jar {
manifest{
attributes ("Implementation-Version" : "10.0", "Specification-Version" : getDate())
}
baseName 'finekit'
version archiveVersion.get() + "-" + getDate()
}
repositories {
mavenLocal()
maven {
url = uri('http://mvn.finedevelop.com/repository/maven-public/')
}
maven {
url = uri('http://repo.maven.apache.org/maven2')
}
}
dependencies {
implementation files("${System.getProperty('java.home')}/../lib/tools.jar")
implementation 'com.fr.third:fine-third:' + fineVersion
implementation 'com.fr.activator:fine-activator:' + fineVersion
implementation 'com.fr.core:fine-core:' + fineVersion
implementation 'com.fr.webui:fine-webui:' + fineVersion
implementation 'com.fr.datasource:fine-datasource:' + fineVersion
implementation 'com.fr.decision:fine-decision:' + fineVersion
implementation 'com.fr.decision:fine-decision-report:' + fineVersion
implementation 'com.fr.schedule:fine-schedule:' + fineVersion
implementation 'com.fr.schedule:fine-schedule-report:' + fineVersion
implementation 'com.fr.intelligence:fine-swift:' + fineVersion
implementation 'com.fr.intelligence:fine-accumulator:' + fineVersion
implementation 'com.fr.report:fine-report-engine:' + fineVersion
implementation 'com.fr.report:fine-report-designer:' + fineVersion
implementation 'org.slf4j:slf4j-api:1.7.30'
implementation 'org.slf4j:slf4j-simple:1.7.30'
testImplementation 'junit:junit:4.12'
testImplementation 'org.easymock:easymock:3.5.1'
testImplementation 'org.powermock:powermock-api-easymock:1.7.1'
testImplementation 'org.powermock:powermock-module-junit4:1.7.1'
testImplementation 'com.squareup.okhttp3:mockwebserver:4.0.1'
}

5
gradle/wrapper/gradle-wrapper.properties vendored

@ -0,0 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://downloads.gradle-dn.com/distributions/gradle-6.1-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

183
gradlew vendored

@ -0,0 +1,183 @@
#!/usr/bin/env sh
#
# Copyright 2015 the original author or authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
##############################################################################
##
## Gradle start up script for UN*X
##
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
warn () {
echo "$*"
}
die () {
echo
echo "$*"
echo
exit 1
}
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
NONSTOP* )
nonstop=true
;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin or MSYS, switch paths to Windows format before running java
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=`expr $i + 1`
done
case $i in
0) set -- ;;
1) set -- "$args0" ;;
2) set -- "$args0" "$args1" ;;
3) set -- "$args0" "$args1" "$args2" ;;
4) set -- "$args0" "$args1" "$args2" "$args3" ;;
5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
# Escape application args
save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
APP_ARGS=`save "$@"`
# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
exec "$JAVACMD" "$@"

100
gradlew.bat vendored

@ -0,0 +1,100 @@
@rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem You may obtain a copy of the License at
@rem
@rem https://www.apache.org/licenses/LICENSE-2.0
@rem
@rem Unless required by applicable law or agreed to in writing, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto init
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:init
@rem Get command-line arguments, handling Windows variants
if not "%OS%" == "Windows_NT" goto win9xME_args
:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2
:win9xME_args_slurp
if "x%~1" == "x" goto execute
set CMD_LINE_ARGS=%*
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega

4
pom.xml

@ -176,7 +176,7 @@
<repository>
<id>fanruan</id>
<name>fanruan</name>
<url>http://mvn.finedevelop.com/repository/maven-public/</url>
<url>https://mvn.fanruan.com/repository/maven-public/</url>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
@ -188,7 +188,7 @@
<pluginRepository>
<id>fanruan</id>
<name>fanruan</name>
<url>http://mvn.finedevelop.com/repository/maven-public/</url>
<url>https://mvn.fanruan.com/repository/maven-public/</url>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>

41
readme.md

@ -45,10 +45,10 @@ SessionKit#getSession(@NotNull String sessionID);
## 使用方法
### 生成运行时依赖jar包
先使用maven打包,执行下面的命令(跳过单元测试)
先使用gradle打包,执行下面的命令(跳过单元测试)
```
mvn package -Dmaven.test.skip=true
gradle build -x test
```
会在target目录下获得一个形如finekit-10.0-20190815.jar名字jar包,直接作为插件依赖jar包即可。
@ -57,7 +57,7 @@ SessionKit#getSession(@NotNull String sessionID);
执行maven命令
```
mvn javadoc:javadoc
gradle javadoc
```
即可在target/javadocs目录下获取到javadoc文档。
@ -75,9 +75,9 @@ mvn javadoc:javadoc
## 如何提交新的API
1、先访问[https://git.fanruan.com](https://git.fanruan.com)并注册一个自己的账号;
1、先访问[https://code.fanruan.com](https://code.fanruan.com)并注册一个自己的账号;
2、然后将[https://git.fanruan.com/fanruan/finekit](https://git.fanruan.com/fanruan/finekit) fork到自己账户下;
2、然后将[https://code.fanruan.com/fanruan/finekit](https://code.fanruan.com/fanruan/finekit) fork到自己账户下;
3、克隆FineKit代码到本地,新增相关的API代码,并提交到自己的仓库;
@ -87,18 +87,19 @@ mvn javadoc:javadoc
|插件名|源码|
|-----|----|
|redis数据集插件|https://git.fanruan.com/fanruan/demo-tabledata-redis|
|增强公式编辑器插件|https://git.fanruan.com/fanruan/demo-formula-script|
|条件属性之文本对齐插件|https://git.fanruan.com/fanruan/demo-highlight-align|
|评分形态插件|https://git.fanruan.com/fanruan/demo-show-present|
|急速下拉树插件|https://git.fanruan.com/fanruan/demo-widget-ztree|
|网页框插件|https://git.fanruan.com/fanruan/demo-widget-iframe|
|时钟控件|https://git.fanruan.com/fanruan/demo-show-clock|
|ldaps认证插件|https://git.fanruan.com/fanruan/demo-ldaps-passport|
|个人国际化设置插件|https://git.fanruan.com/fanruan/decision-user-language|
|插件配置持久化|https://git.fanruan.com/fanruan/demo-db-access|
|http认证简化插件|https://git.fanruan.com/fanruan/demo-auth-http|
|xml导出插件|https://git.fanruan.com/fanruan/demo-export-xml|
|echarts图表插件|https://git.fanruan.com/fanruan/demo-chart-pie|
|多sheet懒加载插件|https://git.fanruan.com/fanruan/plugin-report-lazy-sheet|
|url直接登录插件|https://git.fanruan.com/fanruan/plugin-decision-url-login|
|redis数据集插件|https://code.fanruan.com/fanruan/demo-tabledata-redis|
|增强公式编辑器插件|https://code.fanruan.com/fanruan/demo-formula-script|
|条件属性之文本对齐插件|https://code.fanruan.com/fanruan/demo-highlight-align|
|评分形态插件|https://code.fanruan.com/fanruan/demo-show-present|
|急速下拉树插件|https://code.fanruan.com/fanruan/demo-widget-ztree|
|网页框插件|https://code.fanruan.com/fanruan/demo-widget-iframe|
|时钟控件|https://code.fanruan.com/fanruan/demo-show-clock|
|ldaps认证插件|https://code.fanruan.com/fanruan/demo-ldaps-passport|
|个人国际化设置插件|https://code.fanruan.com/fanruan/decision-user-language|
|插件配置持久化|https://code.fanruan.com/fanruan/demo-db-access|
|http认证简化插件|https://code.fanruan.com/fanruan/demo-auth-http|
|xml导出插件|https://code.fanruan.com/fanruan/demo-export-xml|
|echarts图表插件|https://code.fanruan.com/fanruan/demo-chart-pie|
|多sheet懒加载插件|https://code.fanruan.com/fanruan/plugin-report-lazy-sheet|
|url直接登录插件|https://code.fanruan.com/fanruan/plugin-decision-url-login|
|elasticsearch数据集|https://code.fanruan.com/fanruan/demo-tabledata-es|

1
settings.gradle

@ -0,0 +1 @@
rootProject.name = 'finekit'

19
src/main/java/com/fanruan/api/FineKit.java

@ -1,8 +1,5 @@
package com.fanruan.api;
import java.io.IOException;
import java.util.Properties;
/**
* @author richie
* @version 10.0
@ -10,19 +7,13 @@ import java.util.Properties;
*/
public class FineKit {
private static String version;
private static String build;
private final static String version;
private final static String build;
static {
Properties properties = new Properties();
try {
properties.load(FineKit.class.getResourceAsStream("/version.properties"));
version = properties.getProperty("version");
build = properties.getProperty("build");
} catch (IOException ignore) {
version = "10.0";
build = "20190815";
}
Package pkg = FineKit.class.getPackage();
version = pkg.getImplementationVersion();
build = pkg.getSpecificationVersion();
}
/**

4
src/main/java/com/fanruan/api/cal/CalculatorKit.java

@ -24,7 +24,7 @@ import java.util.Map;
* @author zack
* @version 10.0
* 帆软算子工具类主要用于公式计算
* @date 2019/8/23
* @since 2019/8/23
*/
public class CalculatorKit {
/**
@ -39,7 +39,7 @@ public class CalculatorKit {
/**
* 创建一个带参数计算的算子
* 可以支持计算入参paraMap里面相关的带参函数
* 比如paraMap带有参数a->1,b->2,CalculatorKit.createCalculator(paraMap).evalValue("SUM(a,b)")输出3
* 比如paraMap带有参数<p></>a->1,b->2,CalculatorKit.createCalculator(paraMap).evalValue("SUM(a,b)")<p/>输出3
*
* @return 算子
*/

51
src/main/java/com/fanruan/api/cal/ParameterKit.java

@ -2,22 +2,26 @@ package com.fanruan.api.cal;
import com.fanruan.api.util.ArrayKit;
import com.fanruan.api.util.AssistKit;
import com.fr.base.DataSetFunctionParameterMapNameSpace;
import com.fr.base.Parameter;
import com.fr.base.ParameterHelper;
import com.fr.base.ParameterMapNameSpace;
import com.fr.base.ParameterTypeHandler;
import com.fr.base.TemplateUtils;
import com.fr.data.impl.TableColumn;
import com.fr.general.DateUtils;
import com.fr.json.JSON;
import com.fr.json.JSONArray;
import com.fr.json.JSONFactory;
import com.fr.json.JSONObject;
import com.fr.script.Calculator;
import com.fr.stable.ArrayUtils;
import com.fr.stable.ParameterProvider;
import com.fr.stable.script.NameSpace;
import org.jetbrains.annotations.NotNull;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
@ -144,6 +148,53 @@ public class ParameterKit {
return parameters;
}
/**
* 获得参数并集将新的参数拼接在后面
*
* @param paramTexts sql语句
* @param ps 旧的参数集合
* @return 新参数集合
*/
public static ParameterProvider[] analyzeAndMergeParameters(String[] paramTexts, ParameterProvider[] ps) {
ParameterProvider[] parameters = ParameterKit.analyze4Parameters(paramTexts, false);
if (ArrayKit.isEmpty(parameters) || ArrayKit.isEmpty(ps)) {
return ArrayUtils.addAll(ps, parameters);
}
List<ParameterProvider> psList = ArrayKit.toList(ps);
// 检查ps中是否有parameter,如果没有就加进去
for (ParameterProvider parameter : parameters) {
for (int i = 0; i < ps.length; i ++) {
if (AssistKit.equals(ps[i].getName(), parameter.getName())) {
break;
}
else if (i >= ps.length - 1) {
psList.add(parameter);
}
}
}
return psList.toArray(new ParameterProvider[0]);
}
/**
* 增加处理数据集间联系例如select * from t where time=${today()}
*
* @param text 原文本字符串
* @param parameters 参数集合
* @return 新的文本字符串
*/
public static String analyzeCurrentContextTableData4Template(String text, ParameterProvider[] parameters) {
Calculator c = Calculator.createCalculator();
NameSpace ns = DataSetFunctionParameterMapNameSpace.creat(parameters);
c.pushNameSpace(ns);
String str = TemplateUtils.renderTpl(c, text);
c.removeNameSpace(ns);
return str;
}
/**
* 从JSON中解析出来参数信息
*

38
src/main/java/com/fanruan/api/cluster/ClusterBridgeKit.java

@ -0,0 +1,38 @@
package com.fanruan.api.cluster;
import com.fr.cluster.ClusterBridge;
import com.fr.cluster.core.ClusterNode;
import com.fr.cluster.core.ClusterView;
import com.fr.stable.Filter;
import java.util.List;
/**
* @author Lucian.Chen
* @version 10.0
* Created by Lucian.Chen on 2020/3/23
*/
public class ClusterBridgeKit {
public static ClusterNode getCurrentNode() {
return ClusterBridge.getView().getCurrent();
}
public static ClusterNode getNodeById(String var1) {
return ClusterBridge.getView().getNodeById(var1);
}
public static List<ClusterNode> listNodes() {
return ClusterBridge.getView().listNodes();
}
public static List<ClusterNode> listNodes(Filter<ClusterNode> var1) {
return ClusterBridge.getView().listNodes(var1);
}
public static boolean isClusterMode() {
return ClusterBridge.isClusterMode();
}
}

17
src/main/java/com/fanruan/api/cluster/resource/BaseCommonRepoConfig.java

@ -0,0 +1,17 @@
package com.fanruan.api.cluster.resource;
import com.fr.io.config.CommonRepoConfig;
/**
* @author Dylan.Liu
* @version 10.0
* Created by Dylan.Liu on 2021/1/3
*/
public class BaseCommonRepoConfig extends CommonRepoConfig {
private static final long serialVersionUID = 6713243696930557143L;
public BaseCommonRepoConfig(String identity) {
super(identity);
}
}

25
src/main/java/com/fanruan/api/cluster/resource/FineFileServerKit.java

@ -0,0 +1,25 @@
package com.fanruan.api.cluster.resource;
import com.fr.decision.fileserver.FineFileServer;
import com.fr.io.config.RepositoryConfig;
/**
* 文件服务器Kit.
*
* @author Dylan.Liu
* @version 10.0
* Created by Dylan.Liu on 2021/1/12
*/
public class FineFileServerKit {
/**
* 获取文件服务器当前配置.
*
* @return 文件服务器当前配置
* @throws Exception 获取配置失败时异常
*/
public static <T extends RepositoryConfig> T getRepoConfig() throws Exception {
return FineFileServer.getInstance().getRepoConfig();
}
}

17
src/main/java/com/fanruan/api/cluster/resource/ResourceModuleContextKit.java

@ -0,0 +1,17 @@
package com.fanruan.api.cluster.resource;
import com.fr.io.config.RepositoryConfig;
import com.fr.io.context.ResourceModuleContext;
/**
* @author Dylan.Liu
* @version 10.0
* Created by Dylan.Liu on 2021/1/3
*/
public class ResourceModuleContextKit {
public static <T extends RepositoryConfig> T getRepoConfig(String hdfs, String srcRepo) {
return ResourceModuleContext.getRepoConfig(hdfs, srcRepo);
}
}

15
src/main/java/com/fanruan/api/cluster/resource/WorkContextKit.java

@ -0,0 +1,15 @@
package com.fanruan.api.cluster.resource;
import com.fr.workspace.WorkContext;
import com.fr.workspace.resource.WorkResource;
/**
* @author Dylan.Liu
* @version 10.0
* Created by Dylan.Liu on 2021/1/3
*/
public class WorkContextKit {
public static WorkResource getWorkResource() {
return WorkContext.getWorkResource();
}
}

20
src/main/java/com/fanruan/api/cluster/state/BaseFineStoreGenericPool.java

@ -0,0 +1,20 @@
package com.fanruan.api.cluster.state;
import com.fr.collections.config.CollectionsConfig;
import com.fr.store.impl.accessor.api.impl.AbstractFineStoreGenericPool;
/**
* @author Dylan.Liu
* @version 10.0
* Created by Dylan.Liu on 2020/4/26
* 供插件使用
* 设置资源连接池, 注册实际资源
*/
public abstract class BaseFineStoreGenericPool<T> extends AbstractFineStoreGenericPool<T> {
@Override
public abstract boolean accept(CollectionsConfig config);
@Override
public abstract BaseFineStoreWrapper refresh(T redisConfig);
}

19
src/main/java/com/fanruan/api/cluster/state/BaseFineStoreWrapper.java

@ -0,0 +1,19 @@
package com.fanruan.api.cluster.state;
import com.fr.store.impl.accessor.api.FineStoreWrapper;
import com.fr.store.impl.accessor.api.impl.FineStoreAdapter;
/**
* @author Dylan.Liu
* @version 10.0
* Created by Dylan.Liu on 2020/4/26
* 供插件使用的资源包装器
*/
public abstract class BaseFineStoreWrapper implements FineStoreWrapper {
@Override
public abstract FineStoreAdapter getResource();
@Override
public abstract void destroy();
}

15
src/main/java/com/fanruan/api/cluster/state/BaseRedisCollectionConfig.java

@ -1,6 +1,5 @@
package com.fanruan.api.cluster.state;
import com.fr.collections.api.Codec;
import com.fr.collections.config.redis.RedisCollectionConfig;
/**
@ -11,23 +10,9 @@ import com.fr.collections.config.redis.RedisCollectionConfig;
*/
public class BaseRedisCollectionConfig extends RedisCollectionConfig {
public BaseRedisCollectionConfig(Codec codec, String host, int port) {
super(codec, host, port);
}
public BaseRedisCollectionConfig(String host, int port, String password) {
super(host, port, password);
}
public BaseRedisCollectionConfig() {
super();
}
public BaseRedisCollectionConfig(String host, int port) {
super(host, port);
}
}

4
src/main/java/com/fanruan/api/cluster/state/BaseRedisCollectionsClient.java

@ -1,6 +1,6 @@
package com.fanruan.api.cluster.state;
import com.fr.collections.cluster.client.RedisCollectionsClient;
import com.fr.collections.cluster.client.StoreCollectionsClient;
import com.fr.collections.config.redis.RedisCollectionConfig;
/**
@ -9,7 +9,7 @@ import com.fr.collections.config.redis.RedisCollectionConfig;
* @version 10.0
* Created by Dylan.Liu on 2019/12/3
*/
public class BaseRedisCollectionsClient extends RedisCollectionsClient {
public class BaseRedisCollectionsClient extends StoreCollectionsClient {
public BaseRedisCollectionsClient() {

5
src/main/java/com/fanruan/api/cluster/state/BaseRedisStore.java

@ -1,6 +1,7 @@
package com.fanruan.api.cluster.state;
import com.fr.store.RedisStore;
import com.fr.store.StateStore;
/**
* Redis Store
@ -8,7 +9,7 @@ import com.fr.store.RedisStore;
* @version 10.0
* Created by Dylan.Liu on 2019/12/3
*/
public class BaseRedisStore extends RedisStore {
public class BaseRedisStore extends StateStore {
public BaseRedisStore(String tableNamePrefix, int expireStateRemoveInterval) {
super(tableNamePrefix, expireStateRemoveInterval);

17
src/main/java/com/fanruan/api/cluster/state/BaseStandAloneStore.java

@ -0,0 +1,17 @@
package com.fanruan.api.cluster.state;
import com.fr.store.impl.accessor.api.impl.StandAloneStore;
import com.fr.third.redis.clients.jedis.Jedis;
/**
* 单机<code>Redis API</code>.
*
* @author Dylan.Liu
* @version 10.0
* Created by Dylan.Liu on 2021/1/18
*/
public class BaseStandAloneStore extends StandAloneStore {
public BaseStandAloneStore(Jedis jedis) {
super(jedis);
}
}

20
src/main/java/com/fanruan/api/cluster/state/FineCollectionsKit.java

@ -0,0 +1,20 @@
package com.fanruan.api.cluster.state;
import com.fr.collections.FineCollections;
/**
* @author Dylan.Liu
* @version 10.0
* Created by Dylan.Liu on 2021/1/18
*/
public class FineCollectionsKit {
public FineCollectionsKit() {}
/**
* 销毁集群集合
*/
public static void destroy() {
FineCollections.getInstance().getClient().destroy();
}
}

9
src/main/java/com/fanruan/api/cluster/state/FineJedisPoolKit.java

@ -1,7 +1,8 @@
package com.fanruan.api.cluster.state;
import com.fr.store.impl.redis.accessor.FineJedisPool;
import com.fr.store.impl.redis.accessor.FineJedisWrapper;
import com.fr.store.impl.accessor.FineStorePool;
import com.fr.store.impl.accessor.api.FineStoreWrapper;
/**
* @author Dylan.Liu
@ -14,8 +15,8 @@ public class FineJedisPoolKit {
* 设置提供真实资源的 Jedis 包装对象
* @param jedisWrapper Jedis 包装对象
*/
public static void setRealClient(FineJedisWrapper jedisWrapper) {
public static void setRealClient(FineStoreWrapper jedisWrapper) {
FineJedisPool.getInstance().setRealClient(jedisWrapper);
FineStorePool.getInstance().setRealClient(jedisWrapper);
}
}

19
src/main/java/com/fanruan/api/cluster/state/MachineKit.java

@ -0,0 +1,19 @@
package com.fanruan.api.cluster.state;
import com.fr.cluster.engine.core.jchannel.MachineMarker;
/**
* @author Lucian.Chen
* @version 10.0
* Created by Lucian.Chen on 2020/3/23
*/
public class MachineKit {
public static String currentID() {
return MachineMarker.currentID();
}
public static String currentName() {
return MachineMarker.currentName();
}
}

8
src/main/java/com/fanruan/api/cluster/state/StandAloneJedisKit.java

@ -1,7 +1,7 @@
package com.fanruan.api.cluster.state;
import com.fr.store.impl.redis.accessor.FineJedis;
import com.fr.store.impl.redis.accessor.StandAloneJedis;
import com.fr.store.impl.accessor.api.impl.FineStoreAdapter;
import com.fr.store.impl.accessor.api.impl.StandAloneStore;
import com.fr.third.redis.clients.jedis.Jedis;
/**
@ -16,11 +16,11 @@ public class StandAloneJedisKit {
* @param jedis Jedis 资源
* @return 单机版 Jedis Api集合
*/
public static FineJedis createStandAloneJedis(Jedis jedis) {
public static FineStoreAdapter createStandAloneJedis(Jedis jedis) {
if (jedis == null) {
throw new NullPointerException("jedis is null");
}
return new StandAloneJedis(jedis);
return new StandAloneStore(jedis);
}
}

9
src/main/java/com/fanruan/api/cluster/state/StateServerConfigKit.java

@ -29,6 +29,15 @@ public class StateServerConfigKit {
StateServerConfig.getInstance().setShareMode(isShareMode);
}
/**
* 是否是共享仓库
* @return 是否是共享仓库
*/
public static boolean isShareMode() {
return StateServerConfig.getInstance().isShareMode();
}
/**
* 设置状态服务器类型
* @param type 状态服务器类型

15
src/main/java/com/fanruan/api/cluster/state/StoreTemplateKit.java

@ -0,0 +1,15 @@
package com.fanruan.api.cluster.state;
import com.fr.store.impl.StoreTemplate;
/**
* @author Dylan.Liu
* @version 10.0
* Created by Dylan.Liu on 2021/1/3
*/
public class StoreTemplateKit {
public static void close() {
StoreTemplate.getInstance().close();
}
}

20
src/main/java/com/fanruan/api/concurrent/ConcurrentKit.java

@ -0,0 +1,20 @@
package com.fanruan.api.concurrent;
import com.fr.concurrent.NamedThreadFactory;
/**
* @author Lucian.Chen
* @version 10.0
* Created by Lucian.Chen on 2020/3/27
*/
public class ConcurrentKit {
/**
* 创建命名的线程工厂
* @param prefix 线程池名称前缀
* @return 线程工厂
*/
public static NamedThreadFactory newNamedThreadFactory(String prefix) {
return new NamedThreadFactory(prefix);
}
}

2
src/main/java/com/fanruan/api/conf/BaseConfiguration.java

@ -8,7 +8,6 @@ import com.fr.config.DefaultConfiguration;
* @version 10.0
* Created by richie on 2019-08-16
* 插件要实现配置类的时候直接继承该抽象类即可
* <p>
* private static class MyConf extends BaseConfiguration {
*
* private static volatile MyConf instance = null;
@ -20,7 +19,6 @@ import com.fr.config.DefaultConfiguration;
* return instance;
* }
* }
* <p/>
*/
public abstract class BaseConfiguration extends DefaultConfiguration {

72
src/main/java/com/fanruan/api/conf/ConfigurationKit.java

@ -4,11 +4,14 @@ import com.fanruan.api.generic.Matcher;
import com.fanruan.api.generic.Runner;
import com.fr.config.Configuration;
import com.fr.config.holder.ConfigChangeListener;
import com.fr.decision.webservice.utils.WebServiceUtils;
import com.fr.transaction.Configurations;
import com.fr.transaction.ValidateProxy;
import com.fr.transaction.WorkerCallBack;
import com.fr.transaction.WorkerFacade;
import java.util.Map;
/**
* @author richie
* @version 10.0
@ -17,6 +20,26 @@ import com.fr.transaction.WorkerFacade;
*/
public class ConfigurationKit {
/**
* 获取配置项的属性组成map
*
* @param config 配置项
* @return map
*/
public static Map<String, Object> getConfig(Configuration config) {
return WebServiceUtils.getConfigValue(config);
}
/**
* 更新配置项信息
*
* @param config 配置项
* @param map 更新内容
*/
public static void setConfig(Configuration config, Map<String, Object> map) {
WebServiceUtils.setConfigValue(config, map);
}
/**
* 兼容配置缓存失效
*
@ -49,7 +72,7 @@ public class ConfigurationKit {
* @param configType 配置类
* @param runner 执行器
*/
public static void modify(Class<? extends Configuration> configType, Runner runner) {
public static void modify(Class<? extends Configuration> configType, final Runner runner) {
Configurations.modify(new WorkerFacade(configType) {
@Override
public void run() {
@ -60,6 +83,26 @@ public class ConfigurationKit {
});
}
/**
* 在一个事务中修改配置
* 支持 configType, configTypes 缓存失效
*
* @param configType 配置类
* @param runner 执行器
* @param configTypes 配置类(所有的配置类都会缓存失效)
*/
public static void modify(final Runner runner, Class<? extends Configuration> configType, Class<? extends Configuration>... configTypes) {
Configurations.modify(new WorkerFacade(configType, configTypes) {
@Override
public void run() {
if (runner != null) {
runner.run();
}
}
});
}
/**
* 在一个事务中修改配置
*
@ -67,7 +110,7 @@ public class ConfigurationKit {
* @param runner 执行器
* @param callBack 事务回调
*/
public static void modify(Class<? extends Configuration> configType, Runner runner, WorkerCallBack callBack) {
public static void modify(Class<? extends Configuration> configType, final Runner runner, WorkerCallBack callBack) {
WorkerFacade facade = new WorkerFacade(configType) {
@Override
public void run() {
@ -81,4 +124,29 @@ public class ConfigurationKit {
}
Configurations.modify(facade);
}
/**
* 在一个事务中修改配置
* 支持 configType, configTypes 失效
*
* @param configType 配置类
* @param runner 执行器
* @param callBack 事务回调
* @param configTypes 配置类(所有的配置类都会缓存失效)
*/
public static void modify(final Runner runner, WorkerCallBack callBack, Class<? extends Configuration> configType, Class<? extends Configuration>... configTypes) {
WorkerFacade facade = new WorkerFacade(configType, configTypes) {
@Override
public void run() {
if (runner != null) {
runner.run();
}
}
};
if (callBack != null) {
facade.addCallBack(callBack);
}
Configurations.modify(facade);
}
}

6
src/main/java/com/fanruan/api/conf/HolderKit.java

@ -6,9 +6,11 @@ import com.fanruan.api.conf.impl.ObjectColConf;
import com.fanruan.api.conf.impl.ObjectMapConf;
import com.fanruan.api.conf.impl.SimConf;
import com.fr.config.holder.Conf;
import com.fr.config.holder.impl.MapConf;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
/**
@ -109,4 +111,8 @@ public class HolderKit {
public static <K> ColConf<Collection<K>> collection(Collection<K> collection, Class<K> valueType) {
return new ColConf(collection, valueType);
}
public static MapConf<Map<String, String>> map(HashMap<Object, Object> map, Class<String> keyType, Class<String> valueType) {
return new MapConf<>(map, keyType, valueType);
}
}

23
src/main/java/com/fanruan/api/conf/MarketConfigKit.java

@ -0,0 +1,23 @@
package com.fanruan.api.conf;
import com.fr.config.MarketConfig;
public class MarketConfigKit {
/**
* 获取服务器appId
*
* @return appId
*/
public static String getAppId() {
return MarketConfig.getInstance().getCloudOperationMaintenanceId();
}
/**
* 获取已登录帆软市场的用户名
*
* @return userId
*/
public static long getUserId() {
return MarketConfig.getInstance().getBbsUid();
}
}

30
src/main/java/com/fanruan/api/conf/impl/xml/XmlColConf.java

@ -0,0 +1,30 @@
package com.fanruan.api.conf.impl.xml;
import java.util.Collection;
/**
* @author Lucian.Chen
* @version 10.0
* Created by Lucian.Chen on 2020/3/23
*/
public class XmlColConf<T extends Collection> extends com.fr.config.holder.impl.xml.XmlColConf<Collection> {
public XmlColConf(String s, Collection collection, Class aClass) {
super(s, collection, aClass);
}
public XmlColConf(Collection collection, Class aClass) {
super(collection, aClass);
}
public XmlColConf(Collection collection, Class aClass, boolean b) {
super(collection, aClass, b);
}
public XmlColConf(Collection collection, Class aClass, String s) {
super(collection, aClass, s);
}
public XmlColConf(Collection collection, Class aClass, String s, boolean b) {
super(collection, aClass, s, b);
}
}

22
src/main/java/com/fanruan/api/conf/impl/xml/XmlConf.java

@ -0,0 +1,22 @@
package com.fanruan.api.conf.impl.xml;
import com.fr.stable.xml.XMLable;
/**
* @author Lucian.Chen
* @version 10.0
* Created by Lucian.Chen on 2020/3/23
*/
public class XmlConf<T extends XMLable> extends com.fr.config.holder.impl.xml.XmlConf<XMLable> {
public XmlConf(String s, XMLable xmLable, Class aClass) {
super(s, xmLable, aClass);
}
public XmlConf(XMLable xmLable, Class aClass) {
super(xmLable, aClass);
}
public XmlConf(XMLable xmLable, Class aClass, String s) {
super(xmLable, aClass, s);
}
}

30
src/main/java/com/fanruan/api/conf/xml/XmlHolderKit.java

@ -1,9 +1,11 @@
package com.fanruan.api.conf.xml;
import com.fanruan.api.conf.impl.xml.XmlColConf;
import com.fanruan.api.conf.impl.xml.XmlConf;
import com.fr.config.holder.Conf;
import com.fr.config.holder.impl.xml.XmlConf;
import com.fr.stable.xml.XMLable;
import java.util.Collection;
/**
* @author richie
* @version 10.0
@ -23,4 +25,30 @@ public class XmlHolderKit {
public static <T extends XMLable> Conf<T> obj(T t, Class<T> clazz, String xmlTag) {
return new XmlConf(t, clazz, xmlTag);
}
/**
* 创建一个集合类型的xml配置
*
* @param t 初始值
* @param clazz 对象class类型
* @param <T> 类型
* @return 配置对象
*/
public static <T extends XMLable> XmlColConf<Collection<T>> collection(Collection<T> t, Class<T> clazz) {
return collection(t,clazz,true);
}
/**
* 创建一个集合类型的xml配置
*
* @param t 初始值
* @param clazz 对象class类型
* @param order 是否是有序的配置
* @param <T> 类型
* @return 配置对象
*/
public static <T extends XMLable> XmlColConf<Collection<T>> collection(Collection<T> t, Class<T> clazz, boolean order) {
return new XmlColConf<Collection<T>>(t, clazz, order);
}
}

6
src/main/java/com/fanruan/api/data/ConnectionKit.java

@ -4,8 +4,6 @@ import com.fanruan.api.util.TypeKit;
import com.fr.data.impl.Connection;
import com.fr.data.impl.NameDatabaseConnection;
import com.fr.file.ConnectionConfig;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Map;
@ -20,7 +18,7 @@ public class ConnectionKit {
* @param name 名字
* @return 数据连接
*/
public static @Nullable Connection getConnection(@NotNull String name) {
public static Connection getConnection(String name) {
return ConnectionConfig.getInstance().getConnection(name);
}
@ -31,7 +29,7 @@ public class ConnectionKit {
* @param type 类型
* @return 数据连接
*/
public static <T extends Connection> @Nullable T getConnection(@NotNull String name, Class<? extends Connection> type) {
public static <T extends Connection>T getConnection(String name, Class<? extends Connection> type) {
Connection connection = getConnection(name);
if (TypeKit.objectInstanceOf(connection, type)) {
return (T) connection;

92
src/main/java/com/fanruan/api/decision/AuthorityKit.java

@ -1,6 +1,13 @@
package com.fanruan.api.decision;
import com.fr.decision.authority.AuthorityContext;
import com.fr.decision.authority.base.constant.AuthorityStaticItemId;
import com.fr.decision.authority.base.constant.AuthorityValue;
import com.fr.decision.authority.base.constant.type.authority.AuthorityType;
import com.fr.decision.authority.controller.GradeAuthorityController;
import com.fr.decision.authority.data.personnel.DepRole;
import com.fr.decision.config.FSConfig;
import com.fr.decision.webservice.utils.WebServiceUtils;
/**
* @author richie
@ -13,7 +20,7 @@ public class AuthorityKit {
/**
* 内置管理系统节点id
*/
public static class Management{
public static class Management {
public static final String USER = AuthorityStaticItemId.DEC_MANAGEMENT_USER_ID;
public static final String AUTHORITY = AuthorityStaticItemId.DEC_MANAGEMENT_AUTHORITY_ID;
@ -42,4 +49,87 @@ public class AuthorityKit {
public static final String MAINTENANCE = AuthorityStaticItemId.DEC_MANAGEMENT_MAINTENANCE_ID;
}
/**
* 给部门职位设置人员管理权限
*
* @param depostId 部门职位id
* @param authValue 接受/拒绝
* @param authId 实体id
* @param authType 权限类型
* @throws Exception 异常
*/
public static void setDepAuth(String depostId, int authValue, String authId, int authType) throws Exception {
DepRole depRole = WebServiceUtils.parseUniqueDepartmentPostId(depostId);
AuthorityContext.getInstance().getAuthorityController(GradeAuthorityController.class).setDepAuthorityValue(
depRole.getDepartmentId(),
depRole.getPostId(),
AuthorityValue.fromInteger(authValue),
authId,
AuthorityType.fromInteger(authType));
}
/**
* 给用户设置人员管理权限
*
* @param userId 用户id
* @param authValue 接受/拒绝
* @param authId 实体id
* @param authType 权限类型
* @throws Exception 异常
*/
public static void setUserAuth(String userId, int authValue, String authId, int authType) throws Exception {
AuthorityContext.getInstance().getAuthorityController(GradeAuthorityController.class).setUserAuthorityValue(
userId,
AuthorityValue.fromInteger(authValue),
authId,
AuthorityType.fromInteger(authType));
}
/**
* 给角色设置人员管理权限
*
* @param roleId 角色id
* @param authValue 接受/拒绝
* @param authId 实体id
* @param authType 权限类型
* @throws Exception 异常
*/
public static void setCustomRoleAuth(String roleId, int authValue, String authId, int authType) throws Exception {
AuthorityContext.getInstance().getAuthorityController(GradeAuthorityController.class).setCustomAuthorityValue(
roleId,
AuthorityValue.fromInteger(authValue),
authId,
AuthorityType.fromInteger(authType));
}
/**
* 是否开启了分级权限
*
* @return 开启返回true关闭返回false
*/
public static boolean isGradeAuthority() {
return FSConfig.getInstance().getAuthorizeAttr().isGradeAuthority();
}
/**
* 是否开启了数据连接权限控制
*
* @return 开启返回true关闭返回false
*/
public static boolean isDataConnectionAuthority() {
return FSConfig.getInstance().getAuthorizeAttr().isDataConnectionAuthority();
}
/**
* 是否开启了目录编辑权限
*
* @return 开启返回true关闭返回false
*/
public static boolean isEditReportAuthority() {
return FSConfig.getInstance().getAuthorizeAttr().isEditReportAuthority();
}
}

24
src/main/java/com/fanruan/api/decision/CommonKit.java

@ -5,8 +5,11 @@ import com.fanruan.api.util.StringKit;
import com.fr.base.Base64;
import com.fr.base.ServerConfig;
import com.fr.decision.webservice.utils.DecisionServiceConstants;
import com.fr.decision.webservice.utils.WebServiceUtils;
import com.fr.stable.StringUtils;
import javax.servlet.http.HttpServletRequest;
import java.awt.Image;
/**
* @author richie
* @version 10.0
@ -51,4 +54,25 @@ public class CommonKit {
return StringKit.EMPTY;
}
/**
* 将图片对象用指定的格式输出成base64编码表示的字符串
*
* @param im 图片对象
* @param format 要输出的格式
* @return 表示图片的base64编码的字符串
*/
public static String encode(Image im, String format) {
return Base64.encode(im, format);
}
/**
* 是否是ajax请求
*
* @param request http请求
* @return 是否是ajax请求
*/
public static boolean ajaxRequest(HttpServletRequest request) {
return WebServiceUtils.ajaxRequest(request);
}
}

122
src/main/java/com/fanruan/api/decision/login/LoginKit.java

@ -1,13 +1,20 @@
package com.fanruan.api.decision.login;
import com.fr.data.NetworkHelper;
import com.fr.decision.authorize.Passport;
import com.fr.decision.authorize.impl.HttpPassport;
import com.fr.decision.config.AppearanceConfig;
import com.fr.decision.config.FSConfig;
import com.fr.decision.mobile.terminal.TerminalHandler;
import com.fr.decision.webservice.Response;
import com.fr.decision.webservice.v10.login.LoginService;
import com.fr.decision.webservice.v10.login.TokenResource;
import com.fr.general.ComparatorUtils;
import com.fr.json.JSONObject;
import com.fr.log.FineLoggerFactory;
import com.fr.security.JwtUtils;
import com.fr.stable.StringUtils;
import com.fr.stable.web.Device;
import com.fr.third.fasterxml.jackson.databind.ObjectMapper;
import com.fr.third.socketio.SocketIOClient;
import com.fr.web.utils.WebUtils;
@ -23,6 +30,118 @@ import javax.servlet.http.HttpServletResponse;
*/
public class LoginKit {
/**
* 根据请求header获取用户名
* @param req http请求
* @return 用户名
*/
public static String getUserNameFromRequest(HttpServletRequest req) {
return LoginService.getInstance().getUserNameFromRequest(req);
}
/**
* 根据请求cookie获取用户名
* @param req http请求
* @return 用户名
*/
public static String getUserNameFromRequestCookie(HttpServletRequest req) {
return LoginService.getInstance().getUserNameFromRequestCookie(req);
}
/**
* 根据请求header获取展示名
* @param req http请求
* @return 用户名
*/
public static String getDisplayNameFromRequest(HttpServletRequest req) {
return LoginService.getInstance().getDisplayNameFromRequest(req);
}
/**
* 根据请求cookie获取展示名
* @param req http请求
* @return 用户名
*/
public static String getDisplayNameFromRequestCookie(HttpServletRequest req) {
return LoginService.getInstance().getDisplayNameFromRequestCookie(req);
}
/**
* 根据请求header获取用户名不会抛出异常
* @param req http请求
* @return 用户名
*/
public static String getCurrentUserNameFromRequest(HttpServletRequest req) {
return LoginService.getInstance().getCurrentUserNameFromRequest(req);
}
/**
* 根据请求cookie获取用户名不会抛出异常
* @param req http请求
* @return 用户名
*/
public static String getCurrentUserNameFromRequestCookie(HttpServletRequest req) {
return LoginService.getInstance().getCurrentUserNameFromRequestCookie(req);
}
/**
* 通过用户名生成token仅用户名登录
*
* @param req http请求
* @param res http响应
* @param username 用户名
* @return token
* @throws Exception 异常
*/
public static String login(HttpServletRequest req, HttpServletResponse res, String username) throws Exception {
return LoginService.getInstance().login(req, res, username);
}
/**
* 通过请求的header获取token
*
* @param req http请求
* @return token
*/
public static String getTokenByHeader(HttpServletRequest req) {
return TokenResource.HEADER.getToken(req);
}
/**
* 通过请求的cookie获取token
*
* @param req http请求
* @return token
*/
public static String getTokenByCookie(HttpServletRequest req) {
return TokenResource.COOKIE.getToken(req);
}
/**
* 校验token是否有效当前登录者和token信息是否一致 & token未超时
*
* @param req http请求
* @param token token
* @param currentUserName 当前用户名
* @return 是否有效
*/
public static boolean checkTokenValid(HttpServletRequest req, String token, String currentUserName) {
try {
//当前登录用户和token对应的用户名不同,需要重新生成token
if (!ComparatorUtils.equals(currentUserName, JwtUtils.parseJWT(token).getSubject())) {
FineLoggerFactory.getLogger().info("Username changed:{}", currentUserName);
return false;
}
Device device = NetworkHelper.getDevice(req);
LoginService.getInstance().loginStatusValid(token, TerminalHandler.getTerminal(req, device));
return true;
} catch (Exception ignore) {
}
return false;
}
/**
* 获取决策平台设置的认证类型
*
@ -39,8 +158,9 @@ public class LoginKit {
* @param <T> 类型
* @return 通行证
*/
@Deprecated
public static <T> T getPassport(Class<? extends T> type) {
return FSConfig.getInstance().getPassport(type);
return null;
}
/**

16
src/main/java/com/fanruan/api/decision/monitor/RuntimeMemScoreKit.java

@ -0,0 +1,16 @@
package com.fanruan.api.decision.monitor;
import com.fr.decision.system.monitor.gc.load.RuntimeMemScoreProvider;
/**
* @author Lucian.Chen
* @version 10.0
* Created by Lucian.Chen on 2020/3/23
*/
public class RuntimeMemScoreKit {
//分发得分
public static int getLoadScore() {
return RuntimeMemScoreProvider.getLoadScore();
}
}

35
src/main/java/com/fanruan/api/decision/role/CustomRoleKit.java

@ -0,0 +1,35 @@
package com.fanruan.api.decision.role;
import com.fr.decision.authority.data.CustomRole;
import com.fr.decision.webservice.utils.ControllerFactory;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.List;
/**
* @author Zed
* @version 10.0
* Created by Zed on 2020/4/30
*/
public class CustomRoleKit {
/**
* 获取角色id
*
* @param userId 用户id
* @param keyword 搜索关键字
* @return 角色id
* @throws Exception 异常
*/
public static List<String> getCustomRoleIds(@NotNull String userId, String keyword) throws Exception {
List<String> result = new ArrayList<>();
CustomRole[] roles = ControllerFactory.getInstance().getCustomRoleController(userId).getAllCustomRoles(userId, keyword);
for (CustomRole role : roles) {
result.add(role.getId());
}
return result;
}
}

10
src/main/java/com/fanruan/api/decision/store/StateHubManager.java

@ -0,0 +1,10 @@
package com.fanruan.api.decision.store;
/**
* @author Lucian.Chen
* @version 10.0
* Created by Lucian.Chen on 2020/3/23
*/
public class StateHubManager extends com.fr.store.StateHubManager {
}

45
src/main/java/com/fanruan/api/decision/user/UserKit.java

@ -16,6 +16,17 @@ import java.util.List;
*/
public class UserKit {
/**
* 判断是否存在该用户名
*
* @param username 用户名
* @return 是否存在
* @throws Exception 如果在获取用户的过程中出错了则抛出此异常
*/
public static boolean existUsername(String username) throws Exception {
return UserService.getInstance().getUserByUserName(username) != null;
}
/**
* 根据用户名获取这个用户的来源
*
@ -72,7 +83,39 @@ public class UserKit {
* @return 用户名数组
* @throws Exception 如果邮箱不存在则抛出此异常
*/
public static List<String> getUserNamesFromEmail(String email) throws Exception {
public static List<String> getUserNamesFromEmail(String email) throws Exception {
return UserService.getInstance().getUserNamesFromEmail(email);
}
/**
* 获取当前用户id
*
* @param request 请求体
* @return 用户id
* @throws Exception 异常
*/
public static String getCurrentUserId(HttpServletRequest request) throws Exception {
return UserService.getInstance().getCurrentUserId(request);
}
/**
* 获取当前用户idcookie
*
* @param request 请求体
* @return 用户id
* @throws Exception 异常
*/
public static String getCurrentUserIdFromCookie(HttpServletRequest request) throws Exception {
return UserService.getInstance().getCurrentUserIdFromCookie(request);
}
/**
* 获取超级管理角色下的用户ID列表
*
* @return 用户ID列表
* @throws Exception 异常
*/
public static List<String> getAdminUserIdList() throws Exception {
return UserService.getInstance().getAdminUserIdList();
}
}

80
src/main/java/com/fanruan/api/design/DesignKit.java

@ -1,13 +1,23 @@
package com.fanruan.api.design;
import com.fr.base.io.BaseBook;
import com.fr.design.DesignerEnvManager;
import com.fr.design.mainframe.JTemplateProvider;
import com.fr.design.mainframe.WidgetPropertyPane;
import com.fr.base.TableData;
import com.fr.design.DesignModelAdapter;
import com.fr.design.data.datapane.preview.PreviewTablePane;
import com.fr.design.file.HistoryTemplateListPane;
import com.fr.design.gui.frpane.HyperlinkGroupPaneActionProvider;
import com.fr.design.i18n.Toolkit;
import com.fr.design.mainframe.DesignerBean;
import com.fr.design.mainframe.DesignerContext;
import com.fr.design.mainframe.DesignerFrame;
import com.fr.design.mainframe.HyperlinkGroupPaneActionImpl;
import com.fr.design.mainframe.JTemplate;
import com.fr.module.ModuleContext;
import javax.swing.JComponent;
public class DesignKit {
/**
@ -58,6 +68,43 @@ public class DesignKit {
return HistoryTemplateListPane.getInstance().getCurrentEditingTemplate();
}
/**
* 获取当前正在编辑的模板的ID
*
* @return 正在编辑的模板的ID
*/
public static String getCurrentEditingTemplateId() {
return getCurrentEditingTemplate().getTarget().getTemplateID();
}
/**
* 获取指定模板的ID
*
* @param template 指定模板
* @return 模板ID
*/
public static String getTemplateId(JTemplateProvider template) {
return ((BaseBook) template.getTarget()).getTemplateID();
}
/**
* 获取设计器ID
*
* @return 设计器ID
*/
public static String getDesignerId() {
return DesignerEnvManager.getEnvManager().getUUID();
}
/**
* 获取注册码
*
* @return 注册码
*/
public static String getActivationKey() {
return DesignerEnvManager.getEnvManager().getActivationKey();
}
/**
* 根据名字获取已经定义的bean对象
*
@ -67,4 +114,37 @@ public class DesignKit {
public static DesignerBean getDesignerBean(String name) {
return DesignerContext.getDesignerBean(name);
}
/**
* 超链接面板操作
* @return 操作对象
*/
public static HyperlinkGroupPaneActionProvider getHyperlinkGroupPaneAction() {
return HyperlinkGroupPaneActionImpl.getInstance();
}
/**
* 当前的设计模式 FormModel or WorkBookModel
* @return 设计器模式
*/
public static DesignModelAdapter<?, ?> getCurrentModelAdapter() {
return DesignModelAdapter.getCurrentModelAdapter();
}
/**
* 控件属性容器
*/
public static JComponent getWidgetComponent() {
return (JComponent) (WidgetPropertyPane.getInstance().getEditingFormDesigner().getSelectionModel().getSelection().getSelectedCreator()).getComponent(0);
}
/**
* 设计器是否启动
*
* @return isStartup
*/
public static boolean isStartup() {
return ModuleContext.isDesignerStartup();
}
}

22
src/main/java/com/fanruan/api/design/ui/component/UIHeadGroup.java

@ -0,0 +1,22 @@
package com.fanruan.api.design.ui.component;
import javax.swing.Icon;
/**
* @author Lucian.Chen
* @version 10.0
* Created by Lucian.Chen on 2020/3/23
*/
public class UIHeadGroup extends com.fr.design.gui.ibutton.UIHeadGroup {
public UIHeadGroup(String[] strings) {
super(strings);
}
public UIHeadGroup(Icon[] icons) {
super(icons);
}
public UIHeadGroup(Icon[] icons, String[] strings) {
super(icons, strings);
}
}

55
src/main/java/com/fanruan/api/design/ui/component/UILockButton.java

@ -0,0 +1,55 @@
package com.fanruan.api.design.ui.component;
import com.fr.design.editlock.EditLockChangeEvent;
import com.fr.design.editlock.EditLockChangeListener;
import com.fr.design.editlock.EditLockUtils;
import com.fr.report.LockItem;
import javax.swing.*;
/**
* @author Yvan
* @version 10.0
* Created by Yvan on 2021/1/20
*/
public class UILockButton extends UIButton implements EditLockChangeListener {
/**
* 锁定状态图标
*/
private final Icon lockedIcon;
/**
* 正常状态图标
*/
private final Icon normalIcon;
/**
* 锁定状态的提示信息
*/
private final String lockedTooltips;
/**
* 正常状态的提示信息
*/
private final String normalTooltips;
public UILockButton(Icon lockedIcon, Icon normalIcon, String lockedTooltips, String normalTooltips) {
super();
this.lockedIcon = lockedIcon;
this.normalIcon = normalIcon;
this.lockedTooltips = lockedTooltips;
this.normalTooltips = normalTooltips;
init();
}
private void init() {
boolean locked = EditLockUtils.isLocked(LockItem.CONNECTION);
this.setIcon(locked ? lockedIcon : normalIcon);
this.setToolTipText(locked ? lockedTooltips : normalTooltips);
}
@Override
public void updateLockedState(EditLockChangeEvent event) {
this.setIcon(event.isLocked() ? lockedIcon : normalIcon);
this.setToolTipText(event.isLocked() ? lockedTooltips : normalTooltips);
this.repaint();
}
}

44
src/main/java/com/fanruan/api/design/ui/component/UIRadioButton.java

@ -0,0 +1,44 @@
package com.fanruan.api.design.ui.component;
import javax.swing.Action;
import javax.swing.Icon;
/**
* @author Lucian.Chen
* @version 10.0
* Created by Lucian.Chen on 2020/3/20
*/
public class UIRadioButton extends com.fr.design.gui.ibutton.UIRadioButton {
public UIRadioButton() {
super();
}
public UIRadioButton(Icon icon) {
super(icon);
}
public UIRadioButton(Action action) {
super(action);
}
public UIRadioButton(Icon icon, boolean selected) {
super(icon, selected);
}
public UIRadioButton(String text) {
super(text);
}
public UIRadioButton(String text, boolean selected) {
super(text, selected);
}
public UIRadioButton(String text, Icon icon) {
super(text, icon);
}
public UIRadioButton(String text, Icon icon, boolean selected) {
super(text, icon, selected);
}
}

31
src/main/java/com/fanruan/api/design/ui/component/chart/CalculateComboBox.java

@ -1,32 +1,38 @@
package com.fanruan.api.design.ui.component.chart;
import com.fanruan.api.design.DesignKit;
import com.fanruan.api.design.ui.component.UIComboBox;
import com.fanruan.api.log.LogKit;
import com.fr.common.annotations.Compatible;
import com.fr.data.util.function.DataFunction;
import com.fr.design.i18n.Toolkit;
import com.fr.log.FineLoggerFactory;
/**
* @author Bjorn
* @version 10.0
* Created by Bjorn on 2019-09-23
*/
public class CalculateComboBox extends UIComboBox {
public class CalculateComboBox extends UIComboBox<String> {
private static String[] functionName = initItem();
private static String[] functionName;
private static String[] initItem() {
static {
String[] functionLocaleNames = DataFunctionType.getFunctionLocaleNames();
for (int i = 0; i < functionLocaleNames.length; i++) {
functionLocaleNames[i] = Toolkit.i18nText(functionLocaleNames[i]);
functionLocaleNames[i] = DesignKit.i18nText(functionLocaleNames[i]);
}
return functionLocaleNames;
functionName = functionLocaleNames;
}
public CalculateComboBox() {
super(functionName);
setSelectedIndex(0);
}
/**
* 重置公式下拉选选中的值为第0个
*/
@Compatible
public void reset() {
this.setSelectedItem(0);
}
@ -34,6 +40,7 @@ public class CalculateComboBox extends UIComboBox {
/**
* 通过公式对象更新界面的公式选择
*/
@Compatible
public void populateBean(DataFunction function) {
int index = DataFunctionType.getIndexByFunction(function);
if (index > 0) {
@ -44,15 +51,13 @@ public class CalculateComboBox extends UIComboBox {
/**
* 根据界面选择的公式返回公式对象
*/
@Compatible
public DataFunction updateBean() {
try {
int selectIndex = getSelectedIndex();
DataFunction functionByIndex = DataFunctionType.getFunctionByIndex(selectIndex);
return functionByIndex;
} catch (InstantiationException e) {
FineLoggerFactory.getLogger().error("Function Error");
} catch (IllegalAccessException e) {
FineLoggerFactory.getLogger().error("Function Error");
return DataFunctionType.getFunctionByIndex(selectIndex);
} catch (InstantiationException | IllegalAccessException e) {
LogKit.error("Function Error");
}
return null;
}

4
src/main/java/com/fanruan/api/design/ui/component/chart/DataFunctionType.java

@ -1,5 +1,6 @@
package com.fanruan.api.design.ui.component.chart;
import com.fanruan.api.util.AssistKit;
import com.fr.data.util.function.AverageFunction;
import com.fr.data.util.function.CountFunction;
import com.fr.data.util.function.DataFunction;
@ -7,7 +8,6 @@ import com.fr.data.util.function.MaxFunction;
import com.fr.data.util.function.MinFunction;
import com.fr.data.util.function.NoneFunction;
import com.fr.data.util.function.SumFunction;
import com.fr.general.ComparatorUtils;
/**
* @author Bjorn
@ -39,7 +39,7 @@ public enum DataFunctionType {
return NONE_FUNCTION_INDEX;
}
for (DataFunctionType dataFunctionType : DataFunctionType.values()) {
if (ComparatorUtils.equals(dataFunctionType.functionClass, function.getClass())) {
if (AssistKit.equals(dataFunctionType.functionClass, function.getClass())) {
return dataFunctionType.ordinal();
}
}

36
src/main/java/com/fanruan/api/design/ui/component/code/UISyntaxTextArea.java

@ -22,19 +22,55 @@ import com.fr.design.gui.syntax.ui.rsyntaxtextarea.RSyntaxTextArea;
*/
public class UISyntaxTextArea extends RSyntaxTextArea {
/**
* 构建默认的代码编辑器
*/
public UISyntaxTextArea() {
super();
}
/**
* 构建包含初始代码文本的代码编辑器
* @param text 代码文本
*/
public UISyntaxTextArea(String text) {
super(text);
}
/**
* 构建指定行列的代码编辑器
* @param rows 行数
* @param cols 列数
*/
public UISyntaxTextArea(int rows, int cols) {
super(rows, cols);
}
/**
* 构建指定行列和默认代码文本的代码编辑器
* @param text 代码文本
* @param rows 行数
* @param cols 列数
*/
public UISyntaxTextArea(String text, int rows, int cols) {
super(text, rows, cols);
}
/**
* 设置需要显示到代码编辑器中的文本
* @param t 待展示的文本
*/
@Override
public void setText(String t) {
super.setText(t);
}
/**
* 获取代码编辑器中的代码文本
* @return 代码文本
*/
@Override
public String getText() {
return super.getText();
}
}

25
src/main/java/com/fanruan/api/design/ui/component/code/UISyntaxTextScrollPane.java

@ -8,22 +8,43 @@ import java.awt.*;
* @author richie
* @version 10.0
* Created by richie on 2019-08-28
* 可滚动的代码编辑器容器
* 可滚动可显示文本行信息和设置行号颜色的滚动器容器
*/
public class UISyntaxTextScrollPane extends RTextScrollPane {
/**
* 构建默认的可滚动容器
*/
public UISyntaxTextScrollPane() {
super();
}
/**
* 构建包含指定代码编辑器的滚动容器显示行号
*
* @param component 代码编辑器
*/
public UISyntaxTextScrollPane(Component component) {
super(component);
}
/**
* 构建包含指定代码编辑器的滚动容器
*
* @param component 代码编辑器
* @param lineNumbers true表示显示行号否则不显示行号
*/
public UISyntaxTextScrollPane(Component component, boolean lineNumbers) {
super(component, lineNumbers);
}
/**
* 构建包含指定代码编辑器的滚动容器
*
* @param component 代码编辑器
* @param lineNumbers true表示显示行号否则不显示行号
* @param lineNumberColor 行号颜色
*/
public UISyntaxTextScrollPane(Component component, boolean lineNumbers, Color lineNumberColor) {
super(component, lineNumbers, lineNumberColor);
}

3
src/main/java/com/fanruan/api/design/ui/component/present/DictionaryPane.java

@ -1,7 +1,7 @@
package com.fanruan.api.design.ui.component.present;
import com.fanruan.api.design.DesignKit;
import com.fr.common.annotations.Open;
import com.fr.data.Dictionary;
import com.fr.data.impl.DynamicSQLDict;
import com.fr.design.beans.FurtherBasicBeanPane;
@ -27,6 +27,7 @@ import java.util.List;
* Created by Kalven on 2019/9/4
* 数据字典容器获取数据字典
*/
@Open
public class DictionaryPane extends UIComboBoxPane<Dictionary> implements DataCreatorUI {
private TableDataDictPane tableDataDictPane;

8
src/main/java/com/fanruan/api/design/ui/component/table/action/UITableEditAction.java

@ -2,10 +2,14 @@ package com.fanruan.api.design.ui.component.table.action;
import java.awt.event.ActionEvent;
public class UITableEditAction extends com.fr.design.gui.itableeditorpane.UITableEditAction {
/**
* 复杂表格的操作器可以通过继承此类实现复杂表格的添加行删除行调整行顺序等操作
*/
public class UITableEditAction extends com.fr.design.gui.itableeditorpane.UITableEditAction {
@Override
public void checkEnabled(){};
public void checkEnabled() {
}
@Override
public void actionPerformed(ActionEvent e) {

16
src/main/java/com/fanruan/api/design/ui/component/target/TargetComponent.java

@ -0,0 +1,16 @@
package com.fanruan.api.design.ui.component.target;
/**
* 模板设计界面
*/
public abstract class TargetComponent<T> extends com.fr.design.designer.TargetComponent<T> {
public TargetComponent(T t) {
super(t);
}
public TargetComponent() {
super();
}
}

12
src/main/java/com/fanruan/api/design/ui/table/BasePropertyTable.java

@ -0,0 +1,12 @@
package com.fanruan.api.design.ui.table;
/**
* @author Lucian.Chen
* @version 10.0
* Created by Lucian.Chen on 2020/3/23
*/
public abstract class BasePropertyTable extends com.fr.design.gui.itable.AbstractPropertyTable {
public BasePropertyTable() {
super();
}
}

29
src/main/java/com/fanruan/api/design/util/GUICoreKit.java

@ -82,7 +82,7 @@ public class GUICoreKit {
* 生成一个边界布局的容器并根据参数规则将组件添加进去
* <p>
* GUICoreKit.createBorderLayoutPane(new JLabel(), BorderLayout.CENTER, new JButton(), BorderLayout.NORTH);
* <p/>
* </p>
*
* @param args 布局内部的元素位置等
* @return 具有边界布局的面板
@ -121,6 +121,33 @@ public class GUICoreKit {
return FRGUIPaneFactory.createBorderLayout_S_Pane();
}
/**
* 创建纵向内置boxlayout的面板
*
* @return JPanel对象
*/
public static JPanel createYAXISBoxInnerContainerPane() {
return FRGUIPaneFactory.createY_AXISBoxInnerContainer_S_Pane();
}
/**
* 创建一个边框布局
*
* @return BorderLayout对象
*/
public static LayoutManager createBorderLayout() {
return FRGUIPaneFactory.createBorderLayout();
}
/**
* 创建一个靠左空边框面板间隔中等
*
* @return JPanel对象
*/
public static JPanel createMediumHGapHighTopFlowInnerContainerPane() {
return FRGUIPaneFactory.createMediumHGapHighTopFlowInnerContainer_M_Pane();
}
/**
* 设置一个窗口居中
*/

40
src/main/java/com/fanruan/api/design/work/ConnectionComboBoxPanel.java

@ -5,6 +5,9 @@ import com.fanruan.api.data.ConnectionKit;
import com.fanruan.api.data.open.BaseConnection;
import com.fanruan.api.design.DesignKit;
import com.fanruan.api.design.macro.DataSourceConstants;
import com.fanruan.api.design.ui.component.UIButton;
import com.fanruan.api.design.work.compat.ConnectionLockHelper;
import com.fanruan.api.design.work.component.ItemEditableComboBoxPanel;
import com.fanruan.api.generic.Runner;
import com.fanruan.api.util.AssistKit;
import com.fanruan.api.util.StringKit;
@ -12,10 +15,10 @@ import com.fr.data.impl.Connection;
import com.fr.design.DesignerEnvManager;
import com.fr.design.data.datapane.connect.ConnectionListPane;
import com.fr.design.data.datapane.connect.ConnectionShowPane;
import com.fr.design.data.datapane.connect.ItemEditableComboBoxPanel;
import com.fr.design.dialog.BasicDialog;
import com.fr.design.dialog.DialogActionAdapter;
import com.fr.file.ConnectionConfig;
import com.fr.general.GeneralUtils;
import com.fr.stable.NameReference;
import com.fr.transaction.WorkerCallBack;
import com.fr.workspace.WorkContext;
@ -23,6 +26,7 @@ import com.fr.workspace.server.connection.DBConnectAuth;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.ArrayList;
@ -54,6 +58,19 @@ public class ConnectionComboBoxPanel extends ItemEditableComboBoxPanel {
refreshItems();
}
@Override
protected UIButton initEditButton(UIButton editButton, Dimension buttonSize) {
if (isChangedVersion()) {
return ConnectionLockHelper.generateLockButton(buttonSize, e -> editItems());
} else {
return super.initEditButton(editButton, buttonSize);
}
}
private boolean isChangedVersion() {
return GeneralUtils.readBuildNO().compareTo("2021.03.15") > 0;
}
protected Iterator<String> items() {
nameList = new ArrayList<>();
Iterator<String> nameIt = ConnectionKit.getConnections().keySet().iterator();
@ -92,6 +109,12 @@ public class ConnectionComboBoxPanel extends ItemEditableComboBoxPanel {
protected void editItems() {
if (isChangedVersion()) {
boolean lock = ConnectionLockHelper.doLock(this);
if (lock) {
return;
}
}
final ConnectionListPane connectionListPane = new ConnectionListPane();
final ConnectionConfig connectionConfig = ConnectionConfig.getInstance();
ConnectionConfig cloned = connectionConfig.mirror();
@ -119,6 +142,7 @@ public class ConnectionComboBoxPanel extends ItemEditableComboBoxPanel {
@Override
public void afterCommit() {
DesignKit.getDesignerBean("databasename").refreshBeanElement();
unlock();
}
@Override
@ -127,11 +151,23 @@ public class ConnectionComboBoxPanel extends ItemEditableComboBoxPanel {
}
});
}
@Override
public void doCancel() {
super.doCancel();
unlock();
}
});
connectionListDialog.setVisible(true);
refreshItems();
}
private void unlock() {
if (isChangedVersion()) {
ConnectionLockHelper.unlock();
}
}
/**
* @param connection 数据库链接
*/
@ -176,4 +212,4 @@ public class ConnectionComboBoxPanel extends ItemEditableComboBoxPanel {
}
return -1;
}
}
}

14
src/main/java/com/fanruan/api/design/work/FormHyperlinkGroupPane.java

@ -0,0 +1,14 @@
package com.fanruan.api.design.work;
import com.fr.design.gui.frpane.HyperlinkGroupPaneActionProvider;
/**
* @author Lucian.Chen
* @version 10.0
* Created by Lucian.Chen on 2020/3/23
*/
public class FormHyperlinkGroupPane extends com.fr.design.gui.xpane.FormHyperlinkGroupPane {
protected FormHyperlinkGroupPane(HyperlinkGroupPaneActionProvider hyperlinkGroupPaneActionProvider) {
super(hyperlinkGroupPaneActionProvider);
}
}

2
src/main/java/com/fanruan/api/design/work/RichTextToolBar.java

@ -462,7 +462,7 @@ public class RichTextToolBar extends BasicPane {
* 从样式中更新工具栏上的按钮状态
*
* @param attrs 样式
* @date 2015-1-5-下午5:12:33
* @since 2015-1-5-下午5:12:33
*/
public void populateToolBar(AttributeSet attrs) {
int size = scaleDown(StyleConstants.getFontSize(attrs));

198
src/main/java/com/fanruan/api/design/work/SelectImagePane.java

@ -0,0 +1,198 @@
package com.fanruan.api.design.work;
import com.fanruan.api.design.ui.component.UIButton;
import com.fanruan.api.design.ui.component.UIRadioButton;
import com.fanruan.api.design.util.GUICoreKit;
import com.fanruan.api.report.cell.CellImage;
import com.fr.base.Style;
import com.fr.design.dialog.BasicPane;
import com.fr.design.gui.frpane.ImgChooseWrapper;
import com.fr.design.style.background.image.ImageFileChooser;
import com.fr.design.style.background.image.ImagePreviewPane;
import com.fr.report.cell.Elem;
import com.fr.report.cell.painter.CellImagePainter;
import com.fr.stable.Constants;
import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.JFileChooser;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
/**
* 这个类主要用于插入图片时的设置
*/
public class SelectImagePane extends BasicPane {
private ImagePreviewPane previewPane = null;
private ImageFileChooser imageFileChooser = null;
private UIRadioButton defaultRadioButton = null;
private UIRadioButton tiledRadioButton = null;
private UIRadioButton extendRadioButton = null;
private UIRadioButton adjustRadioButton = null;
private Style imageStyle = null;
private File imageFile;
public SelectImagePane() {
this.setLayout(GUICoreKit.createBorderLayout());
// preview pane
JPanel previewContainerPane = GUICoreKit.createBorderLayoutPane();
this.add(previewContainerPane, BorderLayout.CENTER);
JPanel previewOwnerPane = GUICoreKit.createBorderLayoutPane();
previewContainerPane.add(previewOwnerPane, BorderLayout.CENTER);
previewOwnerPane.setBorder(GUICoreKit.createTitledBorder(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Preview"), null));
previewPane = new ImagePreviewPane();
previewOwnerPane.add(new JScrollPane(previewPane));
JPanel selectFilePane = GUICoreKit.createBorderLayoutPane();
previewContainerPane.add(selectFilePane, BorderLayout.EAST);
selectFilePane.setBorder(BorderFactory
.createEmptyBorder(8, 2, 4, 0));
UIButton selectPictureButton = new UIButton(
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Image_Select_Picture"));
selectFilePane.add(selectPictureButton, BorderLayout.NORTH);
selectPictureButton.setMnemonic('S');
selectPictureButton.addActionListener(selectPictureActionListener);
JPanel layoutPane = GUICoreKit.createMediumHGapHighTopFlowInnerContainerPane();
selectFilePane.add(layoutPane, BorderLayout.CENTER);
//布局
defaultRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Default"));
tiledRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Image_Titled"));
extendRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Image_Extend"));
adjustRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Image_Adjust"));
defaultRadioButton.addActionListener(layoutActionListener);
tiledRadioButton.addActionListener(layoutActionListener);
extendRadioButton.addActionListener(layoutActionListener);
adjustRadioButton.addActionListener(layoutActionListener);
JPanel jp = new JPanel(new GridLayout(4, 1, 15, 15));
jp.add(defaultRadioButton);
jp.add(tiledRadioButton);
jp.add(extendRadioButton);
jp.add(adjustRadioButton);
layoutPane.add(jp);
ButtonGroup layoutBG = new ButtonGroup();
layoutBG.add(defaultRadioButton);
layoutBG.add(tiledRadioButton);
layoutBG.add(extendRadioButton);
layoutBG.add(adjustRadioButton);
defaultRadioButton.setSelected(true);
// init image file chooser.
imageFileChooser = new ImageFileChooser();
imageFileChooser.setMultiSelectionEnabled(false);
}
/**
* Select picture.
*/
ActionListener selectPictureActionListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
int returnVal = imageFileChooser
.showOpenDialog(SelectImagePane.this);
if (returnVal != JFileChooser.CANCEL_OPTION) {
File selectedFile = imageFileChooser.getSelectedFile();
imageFile = selectedFile;
ImgChooseWrapper.getInstance(previewPane, imageFileChooser, imageStyle, null).dealWithImageFile(returnVal);
}
}
};
// 调整图片样式,只有水平和垂直对齐以及拉伸。相对于背景,平铺不予考虑。
private void changeImageStyle() {
previewPane.setImageStyle(this.imageStyle);
previewPane.repaint();
}
private void setImageStyle() {
if (tiledRadioButton.isSelected()) {
imageStyle = Style.DEFAULT_STYLE.deriveImageLayout(Constants.IMAGE_TILED);
} else if (adjustRadioButton.isSelected()) {
imageStyle = Style.DEFAULT_STYLE.deriveImageLayout(Constants.IMAGE_ADJUST);
} else if (extendRadioButton.isSelected()) {
imageStyle = Style.DEFAULT_STYLE.deriveImageLayout(Constants.IMAGE_EXTEND);
} else {
imageStyle = Style.DEFAULT_STYLE.deriveImageLayout(Constants.IMAGE_CENTER);
}
}
ActionListener layoutActionListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
setImageStyle();
changeImageStyle();
}
};
@Override
protected String title4PopupWindow() {
return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Image");
}
public void populate(Elem cell) {
Style style = null;
if (cell != null) {
Object value = cell.getValue();
if (value instanceof Image) {
setImage((Image) value);
} else if (value instanceof CellImagePainter) {
setImage(((CellImagePainter) value).getImage());
}
style = cell.getStyle();
}
if (style == null) {
return;
}
if (style.getImageLayout() == Constants.IMAGE_TILED) {
tiledRadioButton.setSelected(true);
} else if (style.getImageLayout() == Constants.IMAGE_EXTEND) {
extendRadioButton.setSelected(true);
} else if (style.getImageLayout() == Constants.IMAGE_ADJUST) {
adjustRadioButton.setSelected(true);
} else {
style.deriveImageLayout(Constants.IMAGE_CENTER);
defaultRadioButton.setSelected(true);
}
this.imageStyle = style;
changeImageStyle();
}
public void setImage(Image image) {
previewPane.setImage(image);
}
public CellImage update() {
CellImage cellImage = new CellImage();
cellImage.setImage(previewPane.getImageWithSuffix());
cellImage.setStyle(this.imageStyle);
return cellImage;
}
public File getSelectedImage() {
return imageFile;
}
}

50
src/main/java/com/fanruan/api/design/work/compat/ConnectionLockHelper.java

@ -0,0 +1,50 @@
package com.fanruan.api.design.work.compat;
import com.fanruan.api.design.ui.component.UIButton;
import com.fanruan.api.design.ui.component.UILockButton;
import com.fr.base.svg.IconUtils;
import com.fr.design.editlock.ConnectionLockChangeChecker;
import com.fr.design.editlock.EditLockUtils;
import com.fr.report.LockItem;
import java.awt.*;
import java.awt.event.ActionListener;
/**
* @author richie
* @version 10.0
* Created by richie on 2021/3/18
* 用于兼容没有数据连接lock的版本
*/
public class ConnectionLockHelper {
public static UIButton generateLockButton(Dimension buttonSize, ActionListener listener) {
UILockButton editButton = new UILockButton(
EditLockUtils.CONNECTION_LOCKED_ICON,
IconUtils.readIcon("/com/fr/design/images/m_web/connection"),
EditLockUtils.CONNECTION_LOCKED_TOOLTIPS,
null
);
editButton.setPreferredSize(buttonSize);
editButton.addActionListener(listener);
ConnectionLockChangeChecker.getInstance().addEditLockChangeListener(editButton);
return editButton;
}
public static boolean doLock(Component component) {
// 尝试为数据连接加锁
boolean actionLock = EditLockUtils.lock(LockItem.CONNECTION);
if (!actionLock) {
// 锁定失败,代表已经被其他用户锁定,跳出弹窗提示
EditLockUtils.showLockMessage(component);
return true;
}
return false;
}
public static void unlock() {
// 关闭定义数据连接页面,为其解锁
EditLockUtils.unlock(LockItem.CONNECTION);
}
}

122
src/main/java/com/fanruan/api/design/work/component/ItemEditableComboBoxPanel.java

@ -0,0 +1,122 @@
package com.fanruan.api.design.work.component;
import com.fanruan.api.design.ui.component.UIButton;
import com.fanruan.api.design.ui.component.UIComboBox;
import com.fanruan.api.util.IOKit;
import com.fanruan.api.util.StringKit;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
/**
* @author richie
* @version 10.0
* Created by richie on 2021/3/18
*/
public abstract class ItemEditableComboBoxPanel extends JPanel {
private static final long serialVersionUID = 1L;
protected static final Object EMPTY = new Object() {
public String toString() {
return StringKit.EMPTY;
}
};
protected UIComboBox<?> itemComboBox;
protected UIButton editButton;
protected UIButton refreshButton;
public ItemEditableComboBoxPanel() {
super();
initComponents();
}
protected void initComponents() {
this.setLayout(new BorderLayout(4, 4));
Dimension buttonSize = new Dimension(26, 20);
itemComboBox = new UIComboBox<>();
itemComboBox.setEnabled(true);
this.add(itemComboBox, BorderLayout.CENTER);
refreshButton = new UIButton(IOKit.readIcon("/com/fr/design/images/control/refresh.png"));
JPanel jPanel = new JPanel(new GridLayout(0, 2, 4, 4));
editButton = initEditButton(editButton, buttonSize);
jPanel.add(editButton);
jPanel.add(refreshButton);
this.add(jPanel, BorderLayout.EAST);
refreshButton.setPreferredSize(buttonSize);
refreshButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
refreshItems();
}
});
}
protected UIButton initEditButton(UIButton editButton, Dimension buttonSize) {
editButton = new UIButton(IOKit.readIcon("/com/fr/design/images/control/control-center2.png"));
editButton.setPreferredSize(buttonSize);
editButton.addActionListener(evt -> editItems());
return editButton;
}
/**
* 给itemComboBox添加ActionListener
*/
public void addComboBoxActionListener(ActionListener l) {
itemComboBox.addActionListener(l);
}
protected void refreshItems() {
// 记录原来选中的Item,重新加载后需要再次选中
Object lastSelectedItem = itemComboBox.getSelectedItem();
DefaultComboBoxModel<Object> model = ((DefaultComboBoxModel<Object>) itemComboBox.getModel());
model.removeAllElements();
// 先加EMPTY,再加items
model.addElement(EMPTY);
java.util.Iterator<String> itemIt = items();
while (itemIt.hasNext()) {
model.addElement(itemIt.next());
}
// 再次选中之前选中的Item
int idx = model.getIndexOf(lastSelectedItem);
if (idx < 0) {
idx = 0;
}
itemComboBox.setSelectedIndex(idx);
}
/*
* 得到其中的itemComboBox所选中的Item
*/
public String getSelectedItem() {
Object selected = itemComboBox.getSelectedItem();
return selected instanceof String ? (String) selected : null;
}
/*
* 选中name项
*/
public void setSelectedItem(String name) {
DefaultComboBoxModel model = ((DefaultComboBoxModel) itemComboBox.getModel());
model.setSelectedItem(name);
}
/*
* 刷新ComboBox.items
*/
protected abstract java.util.Iterator<String> items();
/*
* 弹出对话框编辑Items
*/
protected abstract void editItems();
}

3
src/main/java/com/fanruan/api/design/work/component/ParameterComboBox.java

@ -1,6 +1,7 @@
package com.fanruan.api.design.work.component;
import com.fanruan.api.cal.ParameterKit;
import com.fanruan.api.design.DesignKit;
import com.fanruan.api.design.ui.component.UIComboBox;
import com.fanruan.api.util.AssistKit;
import com.fr.design.DesignModelAdapter;
@ -41,7 +42,7 @@ public class ParameterComboBox extends UIComboBox<ParameterProvider> {
public void updateParaItems() {
DesignModelAdapter<?, ?> designModel = DesignModelAdapter.getCurrentModelAdapter();
DesignModelAdapter<?, ?> designModel = DesignKit.getCurrentModelAdapter();
this.removeAllItems();
if (designModel != null) {

2
src/main/java/com/fanruan/api/function/FunctionKit.java

@ -15,7 +15,7 @@ import java.util.List;
/**
* @author zack
* @date 2019/8/23
* @since 2019/8/23
* @version 10.0
* 函数相关工具类
*/

6
src/main/java/com/fanruan/api/function/shell/FineFunc.java

@ -5,9 +5,9 @@ import com.fr.stable.script.FunctionDef;
/**
* ClassName FineFunc
*
* @Author zack
* @Date 2019/8/23
* @Version 10.0
* @author zack
* @since 2019/8/23
* @version 10.0
* 自定义函数实体
*/
public class FineFunc extends FunctionDef {

18
src/main/java/com/fanruan/api/image/general/ImageWithSuffix.java

@ -0,0 +1,18 @@
package com.fanruan.api.image.general;
import java.awt.Image;
/**
* @author Lucian.Chen
* @version 10.0
* Created by Lucian.Chen on 2020/3/23
*/
public class ImageWithSuffix extends com.fr.general.ImageWithSuffix {
public ImageWithSuffix(Image image, String format) {
super(image, format);
}
public ImageWithSuffix(Image image) {
super(image);
}
}

9
src/main/java/com/fanruan/api/macro/ProductConstants.java

@ -16,4 +16,13 @@ public class ProductConstants {
* 大的版本号
*/
public static final String MAIN_VERSION = com.fr.stable.ProductConstants.MAIN_VERSION;
/**
* 获取env路径
*
* @return env路径
*/
public static String getEnvHome() {
return com.fr.stable.ProductConstants.getEnvHome();
}
}

60
src/main/java/com/fanruan/api/net/http/HttpKit.java

@ -1,20 +1,12 @@
package com.fanruan.api.net.http;
import com.fanruan.api.macro.EncodeConstants;
import com.fanruan.api.log.LogKit;
import com.fanruan.api.net.http.rs.BaseHttpResponseHandle;
import com.fanruan.api.macro.EncodeConstants;
import com.fanruan.api.net.http.rs.HttpRequest;
import com.fanruan.api.net.http.rs.HttpRequestType;
import com.fanruan.api.net.http.rs.HttpResponseType;
import com.fanruan.api.net.http.rs.StreamResponseHandle;
import com.fanruan.api.net.http.rs.TextResponseHandle;
import com.fanruan.api.net.http.rs.UploadResponseHandle;
import com.fanruan.api.net.http.rs.*;
import com.fr.json.JSONObject;
import com.fr.third.guava.collect.Maps;
import com.fr.third.org.apache.http.HttpEntity;
import com.fr.third.org.apache.http.HttpEntityEnclosingRequest;
import com.fr.third.org.apache.http.HttpHost;
import com.fr.third.org.apache.http.NameValuePair;
import com.fr.third.org.apache.http.NoHttpResponseException;
import com.fr.third.org.apache.http.*;
import com.fr.third.org.apache.http.client.HttpRequestRetryHandler;
import com.fr.third.org.apache.http.client.config.RequestConfig;
import com.fr.third.org.apache.http.client.entity.UrlEncodedFormEntity;
@ -31,6 +23,7 @@ import com.fr.third.org.apache.http.conn.socket.LayeredConnectionSocketFactory;
import com.fr.third.org.apache.http.conn.socket.PlainConnectionSocketFactory;
import com.fr.third.org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import com.fr.third.org.apache.http.entity.FileEntity;
import com.fr.third.org.apache.http.entity.StringEntity;
import com.fr.third.org.apache.http.entity.mime.HttpMultipartMode;
import com.fr.third.org.apache.http.entity.mime.MultipartEntityBuilder;
import com.fr.third.org.apache.http.impl.client.CloseableHttpClient;
@ -45,20 +38,13 @@ import org.jetbrains.annotations.Nullable;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLException;
import javax.net.ssl.SSLHandshakeException;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InterruptedIOException;
import java.io.UnsupportedEncodingException;
import java.io.*;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URLEncoder;
import java.net.UnknownHostException;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.*;
import static com.fanruan.api.net.http.rs.HttpRequestType.POST;
@ -205,6 +191,30 @@ public class HttpKit {
});
}
/**
* 发起POST JSON请求并获取返回的文本
*
* @param url 响应请求的的服务器地址
* @param params POST请求的参数
* @return 服务器返回的文本内容
*/
public static String postJSON(String url, JSONObject params, Map<String, String> headers) throws IOException {
StringEntity jsonEntity = new StringEntity(params.toString(), "UTF-8");
jsonEntity.setContentEncoding("UTF-8");
if (headers != null) {
headers.put("Content-Type", "application/json");
} else {
headers = new HashMap<>();
headers.put("Content-Type", "application/json");
}
return executeAndParse(HttpRequest
.custom()
.headers(headers)
.url(url)
.post(jsonEntity)
.build());
}
/**
* 发起POST请求并获取返回的文本
*
@ -438,6 +448,7 @@ public class HttpKit {
/**
* 从指定的地址下载文件
*
* @param url 文件下载地址
* @return 文件的字节流
* @throws IOException 下载过程中出现错误则抛出此异常
@ -448,10 +459,11 @@ public class HttpKit {
/**
* 从指定的地址下载文件
* @param url 文件下载地址
* @param params 参数对
*
* @param url 文件下载地址
* @param params 参数对
* @param responseEncoding 响应的文件编码
* @param headers 请求头
* @param headers 请求头
* @return 文件的字节流
* @throws IOException 下载过程中出现错误则抛出此异常
*/

2
src/main/java/com/fanruan/api/net/http/rs/BaseHttpResponseHandle.java

@ -9,7 +9,7 @@ import java.io.IOException;
* http 结果解析器
*
* @author vito
* @date 2019-07-14
* @since 2019-07-14
*/
public abstract class BaseHttpResponseHandle<T> {

2
src/main/java/com/fanruan/api/net/http/rs/StreamResponseHandle.java

@ -12,7 +12,7 @@ import java.io.InputStream;
* 流响应解析器
*
* @author vito
* @date 2019-07-14
* @since 2019-07-14
*/
public class StreamResponseHandle extends BaseHttpResponseHandle<ByteArrayInputStream> {

2
src/main/java/com/fanruan/api/net/http/rs/TextResponseHandle.java

@ -10,7 +10,7 @@ import java.io.IOException;
* 文本响应解析器
*
* @author vito
* @date 2019-07-14
* @since 2019-07-14
*/
public class TextResponseHandle extends BaseHttpResponseHandle<String> {

2
src/main/java/com/fanruan/api/net/http/rs/UploadResponseHandle.java

@ -11,7 +11,7 @@ import java.io.IOException;
* 上传响应解析器
*
* @author vito
* @date 2019-07-14
* @since 2019-07-14
*/
public class UploadResponseHandle extends BaseHttpResponseHandle<Void> {

24
src/main/java/com/fanruan/api/report/ReportEntryKit.java

@ -0,0 +1,24 @@
package com.fanruan.api.report;
import com.fr.decision.webservice.v10.entry.ReportEntryService;
/**
* @author Zed
* @version 10.0
* Created by Zed on 2020/12/14
* 在平台挂查看FR模板的工具类
*/
public class ReportEntryKit {
/**
* 获取FR模板树
*
* @param currentUserId 当前用户id
* @param keyword keyword
* @return 模板树
* @throws Exception 异常
*/
public static Object getReportTemplateTree(String currentUserId, String keyword) throws Exception {
return ReportEntryService.getInstance().getReportTemplateTree(currentUserId, keyword);
}
}

2
src/main/java/com/fanruan/api/report/TemplateKit.java

@ -4,7 +4,7 @@ import com.fr.io.TemplateWorkBookIO;
import com.fr.main.TemplateWorkBook;
/**
* @author zack
* @date 2019/8/23
* @since 2019/8/23
* @version 10.0
* 模板操作相关工具类
*/

2
src/main/java/com/fanruan/api/report/analy/AnalyKit.java

@ -22,7 +22,7 @@ import java.util.Map;
/**
* @author zack
* @date 2019/8/23
* @since 2019/8/23
* @version 10.0
* 数据分析相关工具类
*/

9
src/main/java/com/fanruan/api/report/cell/CellImage.java

@ -0,0 +1,9 @@
package com.fanruan.api.report.cell;
/**
* @author Lucian.Chen
* @version 10.0
* Created by Lucian.Chen on 2020/3/23
*/
public class CellImage extends com.fr.report.cell.cellattr.CellImage {
}

22
src/main/java/com/fanruan/api/report/cell/FloatElement.java

@ -0,0 +1,22 @@
package com.fanruan.api.report.cell;
import com.fr.stable.unit.UNIT;
/**
* @author Lucian.Chen
* @version 10.0
* Created by Lucian.Chen on 2020/3/23
*/
public class FloatElement extends com.fr.report.cell.FloatElement {
public FloatElement() {
super();
}
public FloatElement(Object value) {
super(value);
}
public FloatElement(UNIT leftDistance, UNIT topDistance, UNIT width, UNIT height, Object value) {
super(leftDistance, topDistance, width, height, value);
}
}

12
src/main/java/com/fanruan/api/report/view/BaseViewActor.java

@ -28,4 +28,16 @@ public abstract class BaseViewActor extends ViewActor {
* @return 结果集
*/
public abstract ResultWorkBook run(TemplateWorkBook templateWorkBook, Map map, int sheetIndex);
/**
* 调用原始的分析执行操作
*
* @param templateWorkBook 模板
* @param map 参数
* @param sheetIndex sheet编号
* @return 结果集
*/
public final ResultWorkBook run0(TemplateWorkBook templateWorkBook, Map map, int sheetIndex) {
return super.executeWorkBook(templateWorkBook, map, sheetIndex);
}
}

12
src/main/java/com/fanruan/api/report/write/BaseWriteActor.java

@ -28,4 +28,16 @@ public abstract class BaseWriteActor extends WriteActor {
* @return 结果集
*/
public abstract ResultWorkBook run(TemplateWorkBook templateWorkBook, Map map, int sheetIndex);
/**
* 调用原始的填报预览执行操作
*
* @param templateWorkBook 模板
* @param map 参数
* @param sheetIndex sheet编号
* @return 结果集
*/
public final ResultWorkBook run0(TemplateWorkBook templateWorkBook, Map map, int sheetIndex) {
return super.executeWorkBook(templateWorkBook, map, sheetIndex);
}
}

9
src/main/java/com/fanruan/api/runtime/EnvKit.java

@ -48,4 +48,13 @@ public class EnvKit {
public static void checkout() {
SimpleWork.checkOut();
}
/**
* 判断工作目录是否是本地
*
* @return isLocal
*/
public static boolean isLocal() {
return WorkContext.getCurrent().isLocal();
}
}

40
src/main/java/com/fanruan/api/security/SecurityKit.java

@ -1,7 +1,9 @@
package com.fanruan.api.security;
import com.fr.security.SecurityConstant;
import com.fr.security.SecurityToolbox;
import com.fr.stable.CodeUtils;
import com.fr.third.org.apache.commons.lang3.RandomStringUtils;
/**
* @author richie
@ -12,22 +14,27 @@ import com.fr.stable.CodeUtils;
public class SecurityKit {
/**
* RSA加密
*
* @param plainText 要加密的文本内容
* @return 加密后的内容
*/
public static String encrypt(String plainText) {
return SecurityToolbox.encrypt(plainText);
}
/**
* RSA解密
*
* @param cipherText 密文数据
* @return 解密后的内容
*/
public static String decrypt(String cipherText) {
return SecurityToolbox.decrypt(cipherText);
}
/**
* 给字符串解密
*
* @param passwordText 待解密的字符串
* @return 解密后的字符串
*/
@ -38,10 +45,43 @@ public class SecurityKit {
/**
* 给字符串加密
*
* @param passwordText 待加密的字符串
* @return 解加密的字符串
*/
public static String passwordEncode(String passwordText) {
return CodeUtils.passwordEncode(passwordText);
}
/**
* aes加密
*
* @param plainText 明文
* @param seed seed
* @return 密文
*/
public static String aesEncrypt(String plainText, String seed) {
return SecurityToolbox.aesEncrypt(plainText, seed);
}
/**
* aes解密
*
* @param cipherText 密文
* @param seed seed
* @return 明文
*/
public static String aesDecrypt(String cipherText, String seed) {
return SecurityToolbox.aesDecrypt(cipherText, seed);
}
/**
* 生成seed
*
* @return seed
*/
public static String createSeed() {
return RandomStringUtils.randomAlphabetic(SecurityConstant.SEED_LENGTH);
}
}

4
src/main/java/com/fanruan/api/util/ArrayKit.java

@ -120,4 +120,8 @@ public class ArrayKit {
public static int getLength(Object array) {
return ArrayUtils.getLength(array);
}
public static <T> T[] insert(final int index, final T[] array, final T... values) {
return ArrayUtils.insert(index, array, values);
}
}

18
src/main/java/com/fanruan/api/util/AssistKit.java

@ -23,6 +23,24 @@ public class AssistKit {
return AssistUtils.equals(parm1, parm2);
}
/**
* 判断 float 类型是否相等
* <p>
* 浮点数采用尾数+阶码的编码方式类似于科学计数法的有效数字+指数的表示方式
* 二进制无法精确表示大部分的十进制小数
* <p>
* 这里首先比较该数二进制是否相等若不相等则采用近视精度比较精度可自定义
*
* @param f1 单精度浮点
* @param f2 单精度浮点
* @param delta 判断精度
* @return 是否相等
* @see #equals(float, float)
*/
public static boolean equalsFloat(float f1, float f2, float delta) {
return AssistUtils.equalsFloat(f1, f2 ,delta);
}
/**
* 判断两个Object类型数据是否相等
* @param parm1 第一个Object数据

1
src/main/java/com/fanruan/api/util/CodeKit.java

@ -41,7 +41,6 @@ public class CodeKit {
*
* @param text 经过处理的字符串
* @return 字符串
* @throws Exception
*/
public static String encodeURIComponent(String text) {
return CommonCodeUtils.encodeURIComponent(text);

11
src/main/java/com/fanruan/api/util/DateKit.java

@ -15,4 +15,15 @@ public class DateKit {
public static Date string2Date(String str, boolean returnNull) {
return DateUtils.string2Date(str, returnNull);
}
/**
* 取得某日期时间的特定表示格式的字符串
*
* @param format 时间格式
* @param date 某日期Date
* @return 某日期的字符串
*/
public static String getDate2Str(String format, Date date) {
return DateUtils.getDate2Str(format, date);
}
}

16
src/main/java/com/fanruan/api/util/FineCollectionKit.java

@ -0,0 +1,16 @@
package com.fanruan.api.util;
import com.fr.collections.FineCollections;
import com.fr.collections.api.FineCollectionClient;
/**
* @author Lucian.Chen
* @version 10.0
* Created by Lucian.Chen on 2020/3/23
*/
public class FineCollectionKit {
public static FineCollectionClient getClient() {
return FineCollections.getInstance().getClient();
}
}

10
src/main/java/com/fanruan/api/util/GeneralKit.java

@ -148,4 +148,14 @@ public class GeneralKit {
return (rgb & 0xff000000) | (gray << 16) | (gray << 8) | (gray);
}
/**
* 寻找指定名字的class文件
*
* @param className 指定的类名
* @return class类
*/
public static Class<?> classForName(String className) throws ClassNotFoundException, NoClassDefFoundError {
return StableUtils.classForName(className);
}
}

39
src/main/java/com/fanruan/api/util/HyperKit.java

@ -0,0 +1,39 @@
package com.fanruan.api.util;
import com.fr.js.HyperlinkUtils;
import com.fr.js.NameJavaScriptGroup;
import com.fr.json.JSONArray;
import com.fr.json.JSONException;
import com.fr.stable.web.Repository;
/**
* @author Lucian.Chen
* @version 10.0
* Created by Lucian.Chen on 2020/3/23
*/
public class HyperKit {
/**
* 写超链的内容
*
* @param g 超级链接的集合
* @param repo
* @return JSONArray转化的字符串
* @throws JSONException JSON异常 J
*/
public static String writeJSLinkContent(NameJavaScriptGroup g, Repository repo) throws JSONException {
return HyperlinkUtils.writeJSLinkContent(g, repo);
}
/**
* 把超链转化成json
*
* @param g 超链
* @param repo
* @return json对象
* @throws JSONException JSON异常
*/
public static JSONArray createJSLink(NameJavaScriptGroup g, Repository repo) throws JSONException {
return HyperlinkUtils.createJSLink(g, repo);
}
}

1
src/main/java/com/fanruan/api/util/IOKit.java

@ -142,7 +142,6 @@ public class IOKit {
/**
* 将输入流转为byte数组
* <p/>
* 原来的写法是 byte[] b = new byte[in.avalable]; in.read(b);
* 但是在CipherInputStream测试的时候,发现拿到的byte[]长度为0
*

32
src/main/java/com/fanruan/api/util/LicKit.java

@ -0,0 +1,32 @@
package com.fanruan.api.util;
import com.fr.json.JSONObject;
import com.fr.license.exception.RegistEditionException;
import com.fr.regist.FRCoreContext;
import com.fr.regist.FunctionPoint;
/**
* 获取Lic相关信息的类
*/
public class LicKit {
public LicKit() {
}
/**
* 获取Lic的JSON信息
* @return JSONObject
*/
public static JSONObject getJsonFromLic() {
return FRCoreContext.getLicense().getJSONObject();
}
/**
* 检查某个功能点的lic权限如果没有权限就跳转到没有lic权限的报错页面
* @param point 功能点
*/
public static void checkFunctionPointSupport(FunctionPoint point) {
if (!point.isSupport()) {
throw new RegistEditionException(point);
}
}
}

6
src/main/java/com/fanruan/api/util/StringKit.java

@ -16,7 +16,6 @@ public class StringKit {
/**
* <p>检查一个字符串是否是空字符串</p>
* <p/>
* <pre>
* StringKit.isEmpty(null) = true
* StringKit.isEmpty("") = true
@ -24,7 +23,6 @@ public class StringKit {
* StringKit.isEmpty("bob") = false
* StringKit.isEmpty(" bob ") = false
* </pre>
* <p/>
*
* @param text 被检查的字符串可能为null
* @return 如果字符串为空或者是null则返回true否则返回false
@ -35,14 +33,12 @@ public class StringKit {
/**
* <p>检查一个字符串是否不为空字符串</p>
* <p/>
* <pre>
* StringKit.isNotEmpty(null) = false
* StringKit.isNotEmpty("") = false
* StringKit.isNotEmpty(" ") = true
* StringKit.isNotEmpty("bob") = true
* StringKit.isNotEmpty(" bob ") = true
* </pre>
*
* @param text 被检查的字符串可能是null
* @return 如果字符串不为空且不是null则返回true否则返回false
@ -53,7 +49,6 @@ public class StringKit {
/**
* <p>检查一个字符串是否为空白字符串</p>
* <p/>
* <pre>
* StringKit.isBlank(null) = true
* StringKit.isBlank("") = true
@ -71,7 +66,6 @@ public class StringKit {
/**
* <p>检查一个字符串是否不是空白字符串</p>
* <p/>
* <pre>
* StringKit.isNotBlank(null) = false
* StringKit.isNotBlank("") = false

2
src/main/java/com/fanruan/api/util/TransmissionKit.java

@ -7,7 +7,7 @@ import com.fr.base.sms.SMSManager;
/**
* @author zack
* @date 2019/8/23
* @since 2019/8/23
* @version 10.0
* fine kit for data transmission.(eg. email or sms...)
* 数据发送工具类比如邮件发送短信发送

2
src/main/java/com/fanruan/api/util/trans/BaseSmsBody.java

@ -4,7 +4,7 @@ package com.fanruan.api.util.trans;
* 抽象短信体
*
* @author vito
* @date 2019-07-24
* @since 2019-07-24
*/
public abstract class BaseSmsBody {
private String templateCode;

2
src/main/java/com/fanruan/api/util/trans/BatchSmsBody.java

@ -9,7 +9,7 @@ import java.util.List;
* 批量短信体
*
* @author vito
* @date 2019-07-24
* @since 2019-07-24
*/
public class BatchSmsBody extends BaseSmsBody {
private List<String> mobiles;

2
src/main/java/com/fanruan/api/util/trans/EmailBody.java

@ -7,7 +7,7 @@ import org.jetbrains.annotations.Nullable;
* 邮件体
*
* @author vito
* @date 2019-07-24
* @since 2019-07-24
*/
public class EmailBody {
private String toAddress;

2
src/main/java/com/fanruan/api/util/trans/SingleSmsBody.java

@ -8,7 +8,7 @@ import org.jetbrains.annotations.Nullable;
* 单个短信体
*
* @author vito
* @date 2019-07-24
* @since 2019-07-24
*/
public class SingleSmsBody extends BaseSmsBody {
private String mobile;

2
src/test/java/com/fanruan/api/ModulePrepare.java

@ -19,7 +19,7 @@ import org.junit.Before;
/**
* @author zack
* @date 2019/8/26
* @since 2019/8/26
* @version 10.0
*/
public class ModulePrepare {

2
src/test/java/com/fanruan/api/cal/CalculatorKitEnvTest.java

@ -20,7 +20,7 @@ import java.util.Map;
* 需要启动模块的算子单元测试
*
* @author zack
* @date 2019/8/23
* @since 2019/8/23
* @version 10.0
*/
public class CalculatorKitEnvTest extends Prepare {

2
src/test/java/com/fanruan/api/cal/CalculatorKitTest.java

@ -10,7 +10,7 @@ import java.util.Map;
/**
* @author zack
* @date 2019/8/23
* @since 2019/8/23
* @version 10.0
*/
public class CalculatorKitTest {

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save