diff --git a/.mvn/jvm.config b/.mvn/jvm.config new file mode 100644 index 00000000000..5e5afe96f93 --- /dev/null +++ b/.mvn/jvm.config @@ -0,0 +1,6 @@ +-Xmx10240m +-XX:MaxMetaspaceSize=2560m +-XX:+UseG1GC +-XX:+UseStringDeduplication +-XX:ReservedCodeCacheSize=512m +-XX:NonProfiledCodeHeapSize=240m diff --git a/abstraction/pom.xml b/abstraction/pom.xml index f43ae6f7e96..8d7c408e2cf 100644 --- a/abstraction/pom.xml +++ b/abstraction/pom.xml @@ -15,24 +15,10 @@ maven-compiler-plugin ${project.compiler.version} - groovy-eclipse-compiler - ${project.java.version} - ${project.java.version} - lines,vars,source + ${project.java.version} true + true - - - org.codehaus.groovy - groovy-eclipse-compiler - ${groovy.eclipse.compiler} - - - org.codehaus.groovy - groovy-eclipse-batch - ${groovy.eclipse.batch} - - diff --git a/build/debug.sh b/build/debug.sh index afa2f92f8d6..9d5843d5d55 100755 --- a/build/debug.sh +++ b/build/debug.sh @@ -8,10 +8,17 @@ conf_dir=$zstack_dir/conf classpath= is_suspend="$1" +# 加载Java 17 JVM参数 +jvm_options_file="$conf_dir/jvm-options-java17.conf" +jvm_options="" +if [ -f "$jvm_options_file" ]; then + jvm_options=$(cat "$jvm_options_file" | grep -v '^#' | tr '\n' ' ') +fi + if [ x"$is_suspend" == x"true" ]; then - java_optitons="-Xdebug -Xms256m -Xmx512m -XX:+HeapDumpOnOutOfMemoryError -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=y" + java_optitons="$jvm_options -Xdebug -Xms256m -Xmx512m -XX:+HeapDumpOnOutOfMemoryError -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=y" else - java_optitons="-Xdebug -Xms256m -Xmx512m -XX:+HeapDumpOnOutOfMemoryError -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n" + java_optitons="$jvm_options -Xdebug -Xms256m -Xmx512m -XX:+HeapDumpOnOutOfMemoryError -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n" fi diff --git a/build/fix-groovy-compiler.sh b/build/fix-groovy-compiler.sh new file mode 100755 index 00000000000..b688fe185d9 --- /dev/null +++ b/build/fix-groovy-compiler.sh @@ -0,0 +1,283 @@ +#!/bin/bash + +# 批量修复Groovy编译配置脚本 +# 用于将groovy-eclipse-compiler替换为标准Java编译器或GMavenPlus + +set -e + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" + +cd "$PROJECT_ROOT" + +echo "==========================================" +echo "批量修复Groovy编译配置" +echo "==========================================" +echo "" + +# 查找所有包含groovy-eclipse-compiler的pom.xml文件 +FILES=$(grep -r "groovy-eclipse-compiler" --include="pom.xml" . | cut -d: -f1 | sort -u) + +TOTAL=$(echo "$FILES" | wc -l | tr -d ' ') +CURRENT=0 +FIXED=0 +SKIPPED=0 + +# 标准Java编译器配置(用于没有Groovy源文件的模块) +STANDARD_JAVA_CONFIG=' + ${project.java.version} + ${project.java.version} + true + true + ' + +# GMavenPlus配置(用于有Groovy源文件的模块) +GMAVENPLUS_CONFIG=' + + org.apache.maven.plugins + maven-compiler-plugin + ${project.compiler.version} + + ${project.java.version} + ${project.java.version} + true + true + + + + + org.codehaus.gmavenplus + gmavenplus-plugin + 4.2.1 + + + + generateStubs + compile + generateTestStubs + compileTests + + + + + ${groovy.version} + ${project.java.version} + + ' + +for FILE in $FILES; do + CURRENT=$((CURRENT + 1)) + echo "[$CURRENT/$TOTAL] 处理: $FILE" + + # 检查模块目录是否有Groovy源文件 + MODULE_DIR=$(dirname "$FILE") + HAS_GROOVY=$(find "$MODULE_DIR" -name "*.groovy" -type f 2>/dev/null | head -1) + + if [ -n "$HAS_GROOVY" ]; then + echo " ⚠️ 发现Groovy源文件,需要手动配置GMavenPlus" + echo " 📝 请手动编辑此文件,参考test/pom.xml的配置" + SKIPPED=$((SKIPPED + 1)) + continue + fi + + # 读取文件内容 + if [ ! -f "$FILE" ]; then + echo " ❌ 文件不存在,跳过" + SKIPPED=$((SKIPPED + 1)) + continue + fi + + # 创建备份 + BACKUP_FILE="${FILE}.backup.$(date +%Y%m%d_%H%M%S)" + cp "$FILE" "$BACKUP_FILE" + echo " 💾 备份文件: $BACKUP_FILE" + + # 使用Python进行精确替换(因为sed处理多行和缩进比较复杂) + python3 <开始到结束,包含groovy-eclipse-compiler的整个块 +pattern = r'''\s*\s* +\s*org\.apache\.maven\.plugins\s* +\s*maven-compiler-plugin\s* +\s*.*?\s* +\s*\s* +\s*groovy-eclipse-compiler\s* +\s*\$\{project\.java\.version\}\s* +\s*\$\{project\.java\.version\}\s* +\s*lines,vars,source\s* +\s*true\s* +\s*\s* +\s*\s* +\s*\s* +\s*org\.codehaus\.groovy\s* +\s*groovy-eclipse-compiler\s* +\s*.*?\s* +\s*\s* +\s*\s* +\s*org\.codehaus\.groovy\s* +\s*groovy-eclipse-batch\s* +\s*.*?\s* +\s*\s* +\s*\s* +\s*''' + +# 更灵活的匹配模式(处理不同的缩进和换行) +pattern2 = r'''(\s*)\s* +\1org\.apache\.maven\.plugins\s* +\1maven-compiler-plugin\s* +\1([^<]+)\s* +\1\s* +\1\s*groovy-eclipse-compiler\s* +\1\s*\$\{project\.java\.version\}\s* +\1\s*\$\{project\.java\.version\}\s* +\1\s*lines,vars,source\s* +\1\s*true\s* +\1\s* +\1\s* +\1\s*\s* +\1\s*org\.codehaus\.groovy\s* +\1\s*groovy-eclipse-compiler\s* +\1\s*[^<]+\s* +\1\s*\s* +\1\s*\s* +\1\s*org\.codehaus\.groovy\s* +\1\s*groovy-eclipse-batch\s* +\1\s*[^<]+\s* +\1\s*\s* +\1\s* +\1''' + +# 尝试匹配并替换 +def replace_plugin(match): + indent = match.group(1) + version = match.group(2).strip() + replacement = f'''{indent} +{indent} org.apache.maven.plugins +{indent} maven-compiler-plugin +{indent} {version} +{indent} +{indent} ${{project.java.version}} +{indent} ${{project.java.version}} +{indent} true +{indent} true +{indent} +{indent}''' + return replacement + +# 使用更简单的方法:逐行处理 +lines = content.split('\n') +new_lines = [] +i = 0 +in_plugin = False +in_config = False +in_dependencies = False +plugin_start = -1 +indent = "" + +while i < len(lines): + line = lines[i] + + # 检测plugin开始 + if '' in line and 'maven-compiler-plugin' in '\n'.join(lines[max(0, i-3):i+3]): + # 向前查找groupId和artifactId + if i > 0 and 'maven-compiler-plugin' in lines[i-1]: + plugin_start = len(new_lines) + indent = line[:len(line) - len(line.lstrip())] + in_plugin = True + new_lines.append(line) + i += 1 + continue + + # 如果在plugin块中,检测groovy-eclipse-compiler + if in_plugin: + if 'groovy-eclipse-compiler' in line: + # 找到了,需要替换整个plugin块 + # 回退到plugin开始位置 + new_lines = new_lines[:plugin_start] + # 添加新的标准配置 + version_line = None + for j in range(plugin_start, i): + if '' in lines[j] and '' in lines[j]: + version_line = lines[j] + break + + version = '${project.compiler.version}' + if version_line: + version_match = re.search(r'([^<]+)', version_line) + if version_match: + version = version_match.group(1).strip() + + new_lines.append(f'{indent}') + new_lines.append(f'{indent} org.apache.maven.plugins') + new_lines.append(f'{indent} maven-compiler-plugin') + new_lines.append(f'{indent} {version}') + new_lines.append(f'{indent} ') + new_lines.append(f'{indent} ${{project.java.version}}') + new_lines.append(f'{indent} ${{project.java.version}}') + new_lines.append(f'{indent} true') + new_lines.append(f'{indent} true') + new_lines.append(f'{indent} ') + new_lines.append(f'{indent}') + + # 跳过到 + while i < len(lines) and '' not in lines[i]: + i += 1 + if i < len(lines): + i += 1 # 跳过 + in_plugin = False + continue + elif '' in line: + in_plugin = False + new_lines.append(line) + i += 1 + continue + + new_lines.append(line) + i += 1 + +new_content = '\n'.join(new_lines) + +# 如果内容有变化,写入文件 +if new_content != content: + with open(file_path, 'w', encoding='utf-8') as f: + f.write(new_content) + print(" ✅ 修复完成") + sys.exit(0) +else: + print(" ⚠️ 未找到需要替换的内容(可能已修复或格式不同)") + sys.exit(1) + +PYTHON_SCRIPT + + if [ $? -eq 0 ]; then + FIXED=$((FIXED + 1)) + echo " ✅ 修复成功" + else + echo " ⚠️ 修复失败或无需修复,请手动检查" + SKIPPED=$((SKIPPED + 1)) + fi + echo "" +done + +echo "==========================================" +echo "修复完成!" +echo "==========================================" +echo "总计: $TOTAL 个文件" +echo "修复: $FIXED 个文件" +echo "跳过: $SKIPPED 个文件" +echo "" +echo "备份文件已保存,如需恢复请使用:" +echo " cp .backup.* " +echo "" +echo "建议运行验证:" +echo " mvn clean compile -DskipTests" +echo " 或" +echo " bash ./build/verify-java17.sh" diff --git a/build/pom.xml b/build/pom.xml index bb55c36cce8..bbf7fade4d3 100755 --- a/build/pom.xml +++ b/build/pom.xml @@ -18,7 +18,7 @@ maven-war-plugin - 2.3 + 3.3.2 %regex[WEB-INF/lib/maven(?!-artifact).*.jar], @@ -410,11 +410,6 @@ twoFactorAuthentication ${project.version} - - org.zstack - crypto - ${project.version} - org.zstack loginControl @@ -670,7 +665,7 @@ maven-war-plugin - 2.3 + 3.3.2 %regex[WEB-INF/lib/maven(?!-artifact).*.jar], diff --git a/build/verify-java17.sh b/build/verify-java17.sh new file mode 100755 index 00000000000..3608493a4ac --- /dev/null +++ b/build/verify-java17.sh @@ -0,0 +1,98 @@ +#!/bin/bash +# Java 17 兼容性验证脚本 +# 用于验证所有依赖在Java 17下的兼容性 + +set -e + +echo "==========================================" +echo " Java 17 兼容性验证" +echo "==========================================" +echo "" + +# 1. 检查Java版本 +echo "[1/6] 检查Java版本..." +JAVA_VERSION=$(java -version 2>&1 | head -1 | cut -d'"' -f2 | sed '/^1\./s///' | cut -d'.' -f1) +if [ "$JAVA_VERSION" != "17" ]; then + echo "❌ 错误: 需要Java 17,当前版本: $JAVA_VERSION" + java -version + exit 1 +fi +echo "✓ Java版本: $(java -version 2>&1 | head -1)" +echo "" + +# 2. 检查关键依赖版本 +echo "[2/6] 检查关键依赖版本..." +echo "检查Spring Framework版本..." +SPRING_VERSION=$(mvn help:evaluate -Dexpression=spring.framework.version -q -DforceStdout 2>/dev/null || echo "unknown") +echo " Spring Framework: $SPRING_VERSION" +if [[ "$SPRING_VERSION" == "5.2"* ]]; then + echo " ⚠️ 警告: Spring 5.2.x 非官方支持Java 17,建议升级到5.3.x" +fi + +echo "检查Hibernate版本..." +HIBERNATE_VERSION=$(mvn help:evaluate -Dexpression=hibernate.version -q -DforceStdout 2>/dev/null || echo "unknown") +echo " Hibernate: $HIBERNATE_VERSION" + +echo "检查AspectJ版本..." +ASPECTJ_VERSION=$(mvn help:evaluate -Dexpression=aspectj.version -q -DforceStdout 2>/dev/null || echo "unknown") +echo " AspectJ: $ASPECTJ_VERSION" + +echo "检查Groovy版本..." +GROOVY_VERSION=$(mvn help:evaluate -Dexpression=groovy.version -q -DforceStdout 2>/dev/null || echo "unknown") +echo " Groovy: $GROOVY_VERSION" +echo "" + +# 3. 编译测试(核心模块) +echo "[3/6] 编译核心模块 (core, header, utils)..." +if mvn clean compile -pl core,header,utils -DskipTests -q; then + echo "✓ 核心模块编译成功" +else + echo "❌ 错误: 核心模块编译失败" + exit 1 +fi +echo "" + +# 4. 编译测试(所有模块) +echo "[4/6] 编译所有模块..." +if mvn clean compile -DskipTests -q; then + echo "✓ 全量编译成功" +else + echo "❌ 错误: 全量编译失败" + exit 1 +fi +echo "" + +# 5. 单元测试(工具类) +echo "[5/6] 运行单元测试 (utils, abstraction)..." +if mvn test -pl utils,abstraction -Djacoco.skip=true -q 2>&1 | tee /tmp/java17-test.log; then + echo "✓ 单元测试通过" +else + TEST_FAILED=$(grep -c "FAILURE\|ERROR" /tmp/java17-test.log || echo "0") + if [ "$TEST_FAILED" -gt 0 ]; then + echo "⚠️ 警告: 部分单元测试失败,请检查日志" + else + echo "✓ 单元测试完成" + fi +fi +echo "" + +# 6. 依赖兼容性检查 +echo "[6/6] 检查依赖树(Spring/Hibernate相关)..." +echo "Spring相关依赖:" +mvn dependency:tree -Dincludes=org.springframework:* -q 2>/dev/null | grep -E "spring" | head -10 || echo " 无Spring依赖" +echo "" +echo "Hibernate相关依赖:" +mvn dependency:tree -Dincludes=org.hibernate:* -q 2>/dev/null | grep -E "hibernate" | head -10 || echo " 无Hibernate依赖" +echo "" + +echo "==========================================" +echo " 验证完成" +echo "==========================================" +echo "" +echo "建议:" +if [[ "$SPRING_VERSION" == "5.2"* ]]; then + echo " - 考虑升级Spring Framework到5.3.23以获得官方Java 17支持" +fi +echo " - 运行完整集成测试: mvn test -pl test -Dtest=SomeBasicCase" +echo " - 检查运行时兼容性: 启动应用并测试核心功能" +echo "" diff --git a/build/zstack b/build/zstack index 676a8961802..e83a429f6ea 100755 --- a/build/zstack +++ b/build/zstack @@ -20,7 +20,13 @@ buildClassPath() { } run() { - java -cp $classPath org.zstack.portal.main.Main "$@" + # 加载Java 17 JVM参数 + jvmOptionsFile="$confDir/jvm-options-java17.conf" + jvmOptions="" + if [ -f "$jvmOptionsFile" ]; then + jvmOptions=$(cat "$jvmOptionsFile" | grep -v '^#' | tr '\n' ' ') + fi + java $jvmOptions -cp $classPath org.zstack.portal.main.Main "$@" } main() { diff --git a/build/zstack-debug b/build/zstack-debug index a9d58db798b..2a2287e3132 100755 --- a/build/zstack-debug +++ b/build/zstack-debug @@ -20,7 +20,13 @@ buildClassPath() { } run() { - javaOptitons="-Xdebug -Xms256m -Xmx512m -XX:+HeapDumpOnOutOfMemoryError -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=y" + # 加载Java 17 JVM参数 + jvmOptionsFile="$confDir/jvm-options-java17.conf" + jvmOptions="" + if [ -f "$jvmOptionsFile" ]; then + jvmOptions=$(cat "$jvmOptionsFile" | grep -v '^#' | tr '\n' ' ') + fi + javaOptitons="$jvmOptions -Xdebug -Xms256m -Xmx512m -XX:+HeapDumpOnOutOfMemoryError -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=y" java $javaOptions -cp $classPath org.zstack.portal.main.Main "$@" } diff --git a/compute/pom.xml b/compute/pom.xml index d7543119ad7..efa30059f23 100755 --- a/compute/pom.xml +++ b/compute/pom.xml @@ -18,29 +18,23 @@ maven-compiler-plugin ${project.compiler.version} - groovy-eclipse-compiler - ${project.java.version} - ${project.java.version} - lines,vars,source + ${project.java.version} true + true - - - org.codehaus.groovy - groovy-eclipse-compiler - ${groovy.eclipse.compiler} - - - org.codehaus.groovy - groovy-eclipse-batch - ${groovy.eclipse.batch} - - + org.codehaus.mojo aspectj-maven-plugin ${aspectj.plugin.version} + + + org.aspectj + aspectjtools + ${aspectj.version} + + @@ -50,10 +44,12 @@ + ${project.java.version} ${project.java.version} ${project.java.version} - ${project.java.version} - true + ${project.build.sourceEncoding} + true + org.springframework diff --git a/compute/src/main/java/org/zstack/compute/allocator/HostAllocatorChainBuilder.java b/compute/src/main/java/org/zstack/compute/allocator/HostAllocatorChainBuilder.java index e839a567b60..464bce56323 100755 --- a/compute/src/main/java/org/zstack/compute/allocator/HostAllocatorChainBuilder.java +++ b/compute/src/main/java/org/zstack/compute/allocator/HostAllocatorChainBuilder.java @@ -43,7 +43,7 @@ private List buildFlows() { List flows = new ArrayList(); try { for (Class flowClass : classes) { - flows.add((AbstractHostAllocatorFlow) flowClass.newInstance()); + flows.add((AbstractHostAllocatorFlow) flowClass.getConstructor().newInstance()); } } catch (Exception e) { throw new CloudRuntimeException(e); @@ -54,9 +54,9 @@ private List buildFlows() { private List buildSortFlows() { List flows = new ArrayList<>(); try { - flows.add(RandomSortFlow.class.newInstance()); + flows.add(RandomSortFlow.class.getConstructor().newInstance()); for (Class flowClass : classes) { - flows.add((AbstractHostSortorFlow) flowClass.newInstance()); + flows.add((AbstractHostSortorFlow) flowClass.getConstructor().newInstance()); } } catch (Exception e) { throw new CloudRuntimeException(e); diff --git a/compute/src/main/java/org/zstack/compute/vm/VmInstanceBase.java b/compute/src/main/java/org/zstack/compute/vm/VmInstanceBase.java index d8c8be65325..ff9651e8101 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmInstanceBase.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmInstanceBase.java @@ -956,7 +956,7 @@ public void run(final SyncTaskChain chain) { HaStartVmJudger judger; try { Class clz = Class.forName(msg.getJudgerClassName()); - judger = (HaStartVmJudger) clz.newInstance(); + judger = (HaStartVmJudger) clz.getConstructor().newInstance(); } catch (Exception e) { throw new CloudRuntimeException(e); } diff --git a/conf/jvm-options-java17.conf b/conf/jvm-options-java17.conf new file mode 100644 index 00000000000..3898ac82bee --- /dev/null +++ b/conf/jvm-options-java17.conf @@ -0,0 +1,18 @@ +# Java 17 模块系统配置 +# 开放反射访问(226处setAccessible需要) +--add-opens java.base/java.lang=ALL-UNNAMED +--add-opens java.base/java.lang.reflect=ALL-UNNAMED +--add-opens java.base/java.util=ALL-UNNAMED +--add-opens java.base/java.util.concurrent=ALL-UNNAMED +--add-opens java.base/java.io=ALL-UNNAMED +--add-opens java.base/java.net=ALL-UNNAMED + +# 导出内部API(sun.misc.Signal需要) +--add-exports java.base/sun.misc=ALL-UNNAMED +--add-exports java.base/sun.security.ssl=ALL-UNNAMED + +# Hibernate需要 +--add-opens java.base/java.time=ALL-UNNAMED + +# AspectJ需要 +--add-opens java.base/java.lang.invoke=ALL-UNNAMED diff --git a/configuration/pom.xml b/configuration/pom.xml index d8e7e387489..07ff081a0cb 100755 --- a/configuration/pom.xml +++ b/configuration/pom.xml @@ -1,109 +1,105 @@ - - 4.0.0 - - zstack - org.zstack + + 4.0.0 + + zstack + org.zstack 5.5.0 - .. - - configuration - - - org.zstack - core - ${project.version} - - - org.zstack - utils - ${project.version} - - - org.zstack - header - ${project.version} - - - org.zstack - search - ${project.version} - - - org.zstack - tag - ${project.version} - - - org.zstack - identity - ${project.version} - - - - commons-codec - commons-codec - 1.15 - - - - - - org.apache.maven.plugins - maven-compiler-plugin - ${project.compiler.version} - - groovy-eclipse-compiler - ${project.java.version} - ${project.java.version} - lines,vars,source - true - - - - org.codehaus.groovy - groovy-eclipse-compiler - ${groovy.eclipse.compiler} - - - org.codehaus.groovy - groovy-eclipse-batch - ${groovy.eclipse.batch} - - - - - org.codehaus.mojo - aspectj-maven-plugin - ${aspectj.plugin.version} - - - - compile - test-compile - - - - - ${project.java.version} - ${project.java.version} - ${project.java.version} - true - - - org.springframework - spring-aspects - - - org.zstack - core - - - org.zstack - header - - - - - - - + .. + + configuration + + + org.zstack + core + ${project.version} + + + org.zstack + utils + ${project.version} + + + org.zstack + header + ${project.version} + + + org.zstack + search + ${project.version} + + + org.zstack + tag + ${project.version} + + + org.zstack + identity + ${project.version} + + + + commons-codec + commons-codec + 1.15 + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${project.compiler.version} + + ${project.java.version} + true + true + + + + + org.codehaus.mojo + aspectj-maven-plugin + ${aspectj.plugin.version} + + + org.aspectj + aspectjtools + ${aspectj.version} + + + + + + compile + test-compile + + + + + ${project.java.version} + ${project.java.version} + ${project.java.version} + ${project.build.sourceEncoding} + true + + + + org.springframework + spring-aspects + + + org.zstack + core + + + org.zstack + header + + + + + + + diff --git a/configuration/src/main/java/org/zstack/configuration/ConfigurationManagerImpl.java b/configuration/src/main/java/org/zstack/configuration/ConfigurationManagerImpl.java index ad0aa1efb24..20eb6be6d06 100755 --- a/configuration/src/main/java/org/zstack/configuration/ConfigurationManagerImpl.java +++ b/configuration/src/main/java/org/zstack/configuration/ConfigurationManagerImpl.java @@ -452,7 +452,7 @@ private void classToApiMessageGroovyClass(StringBuilder sb, Class clazz) { sb.append(String.format("\n\n%sdef fullName() { return '%s' }", whiteSpace(4), clazz.getName())); if (APIEvent.class.isAssignableFrom(clazz) && !Modifier.isAbstract(clazz.getModifiers())) { try { - APIEvent evt = (APIEvent) clazz.newInstance(); + APIEvent evt = (APIEvent) clazz.getConstructor().newInstance(); sb.append(String.format("\n%sdef eventType() { return '%s' }", whiteSpace(4), evt.getType().toString())); } catch (Exception e) { throw new CloudRuntimeException(String.format("cannot generate event type for %s", clazz.getName()), e); diff --git a/console/pom.xml b/console/pom.xml index 48ea5bcd42c..32fecad585f 100755 --- a/console/pom.xml +++ b/console/pom.xml @@ -19,29 +19,23 @@ maven-compiler-plugin ${project.compiler.version} - groovy-eclipse-compiler - ${project.java.version} - ${project.java.version} - lines,vars,source + ${project.java.version} true + true - - - org.codehaus.groovy - groovy-eclipse-compiler - ${groovy.eclipse.compiler} - - - org.codehaus.groovy - groovy-eclipse-batch - ${groovy.eclipse.batch} - - + org.codehaus.mojo aspectj-maven-plugin ${aspectj.plugin.version} + + + org.aspectj + aspectjtools + ${aspectj.version} + + @@ -51,10 +45,11 @@ + ${project.java.version} ${project.java.version} ${project.java.version} - ${project.java.version} - true + ${project.build.sourceEncoding} + true org.springframework diff --git a/core/pom.xml b/core/pom.xml index 701fd40f057..dcd42867310 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -10,6 +10,22 @@ core core core library for zstack + + + + + central + Maven Central Plugin Repository + https://repo1.maven.org/maven2 + + true + + + false + + + + org.zstack @@ -21,6 +37,32 @@ header ${project.version} + + + org.zstack + abstraction + ${project.version} + + + + + com.fasterxml.jackson.core + jackson-databind + + + com.fasterxml.jackson.core + jackson-core + + + com.fasterxml.jackson.core + jackson-annotations + + + + + com.rabbitmq + amqp-client + org.quartz-scheduler quartz @@ -203,29 +245,24 @@ maven-compiler-plugin ${project.compiler.version} - groovy-eclipse-compiler - ${project.java.version} - ${project.java.version} - lines,vars,source + ${project.java.version} true + true - - - org.codehaus.groovy - groovy-eclipse-compiler - ${groovy.eclipse.compiler} - - - org.codehaus.groovy - groovy-eclipse-batch - ${groovy.eclipse.batch} - - + + org.codehaus.mojo aspectj-maven-plugin ${aspectj.plugin.version} + + + org.aspectj + aspectjtools + ${aspectj.version} + + @@ -235,10 +272,12 @@ - ${project.java.version} ${project.java.version} + ${project.java.version} ${project.java.version} - true + ${project.build.sourceEncoding} + true + none org.springframework diff --git a/core/src/main/java/org/zstack/core/cloudbus/CloudBusImpl2.java b/core/src/main/java/org/zstack/core/cloudbus/CloudBusImpl2.java index 85e16f1e39f..c83ff204e78 100755 --- a/core/src/main/java/org/zstack/core/cloudbus/CloudBusImpl2.java +++ b/core/src/main/java/org/zstack/core/cloudbus/CloudBusImpl2.java @@ -685,7 +685,7 @@ private void tryBestToReplyError(byte[] binary, String errMsg) { String msgName = (String) msgObj.keySet().iterator().next(); Class msgClass = Class.forName(msgName); - Message msgInstance = (Message) msgClass.newInstance(); + Message msgInstance = (Message) msgClass.getConstructor().newInstance(); msgInstance.setHeaders(headers); msgInstance.setId((String) msg.get("id")); replyErrorByMessageType(msgInstance, argerr(ORG_ZSTACK_CORE_CLOUDBUS_10021, "message is not in corrected JSON mediaType, %s", errMsg)); diff --git a/core/src/main/java/org/zstack/core/db/DatabaseFacadeImpl.java b/core/src/main/java/org/zstack/core/db/DatabaseFacadeImpl.java index d0a92426313..1015389973a 100755 --- a/core/src/main/java/org/zstack/core/db/DatabaseFacadeImpl.java +++ b/core/src/main/java/org/zstack/core/db/DatabaseFacadeImpl.java @@ -670,7 +670,7 @@ public long generateSequenceNumber(Class seqTable) { if (id == null) { throw new CloudRuntimeException(String.format("sequence VO[%s] must have 'id' field", seqTable.getName())); } - Object vo = seqTable.newInstance(); + Object vo = seqTable.getConstructor().newInstance(); vo = persistAndRefresh(vo); id.setAccessible(true); return (Long) id.get(vo); diff --git a/core/src/main/java/org/zstack/core/gc/GarbageCollectorManagerImpl.java b/core/src/main/java/org/zstack/core/gc/GarbageCollectorManagerImpl.java index e3564021a3a..2c1d01d25ed 100755 --- a/core/src/main/java/org/zstack/core/gc/GarbageCollectorManagerImpl.java +++ b/core/src/main/java/org/zstack/core/gc/GarbageCollectorManagerImpl.java @@ -181,15 +181,15 @@ private GarbageCollector loadGCJob(GarbageCollectorVO vo) { GarbageCollector ret = null; Class clz = Class.forName(vo.getRunnerClass()); if (vo.getType().equals(GarbageCollectorType.EventBased.toString())) { - EventBasedGarbageCollector gc = (EventBasedGarbageCollector) clz.newInstance(); + EventBasedGarbageCollector gc = (EventBasedGarbageCollector) clz.getConstructor().newInstance(); gc.load(vo); ret = gc; } else if (vo.getType().equals(GarbageCollectorType.TimeBased.toString())) { - TimeBasedGarbageCollector gc = (TimeBasedGarbageCollector) clz.newInstance(); + TimeBasedGarbageCollector gc = (TimeBasedGarbageCollector) clz.getConstructor().newInstance(); gc.load(vo); ret = gc; } else if (vo.getType().equals(GarbageCollectorType.CycleBased.toString())) { - TimeBasedGarbageCollector gc = (TimeBasedGarbageCollector) clz.newInstance(); + TimeBasedGarbageCollector gc = (TimeBasedGarbageCollector) clz.getConstructor().newInstance(); gc.load(vo); ret = gc; } else { diff --git a/core/src/main/java/org/zstack/core/rest/RESTApiFacadeImpl.java b/core/src/main/java/org/zstack/core/rest/RESTApiFacadeImpl.java index db25fa2bb21..78fd2b70ce4 100755 --- a/core/src/main/java/org/zstack/core/rest/RESTApiFacadeImpl.java +++ b/core/src/main/java/org/zstack/core/rest/RESTApiFacadeImpl.java @@ -33,6 +33,7 @@ import javax.persistence.EntityManagerFactory; import javax.persistence.EntityTransaction; import javax.persistence.Query; +import java.lang.reflect.InvocationTargetException; import java.util.*; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; @@ -104,7 +105,8 @@ private void handle(final DeleteRestApiVOMsg msg){ } } - void init() throws ClassNotFoundException, InstantiationException, IllegalAccessException { + void init() throws ClassNotFoundException, InstantiationException, IllegalAccessException, + NoSuchMethodException, InvocationTargetException { Set boundEvents = new HashSet(100); ClassPathScanningCandidateComponentProvider scanner = new ClassPathScanningCandidateComponentProvider(true); scanner.resetFilters(false); @@ -115,7 +117,7 @@ void init() throws ClassNotFoundException, InstantiationException, IllegalAccess if (clazz == APIEvent.class) { continue; } - APIEvent evt = (APIEvent) clazz.newInstance(); + APIEvent evt = (APIEvent) clazz.getConstructor().newInstance(); boundEvents.add(evt); } } diff --git a/core/src/main/java/org/zstack/core/workflow/FlowChainBuilder.java b/core/src/main/java/org/zstack/core/workflow/FlowChainBuilder.java index 7b5a65d26c6..4f6f1d02147 100755 --- a/core/src/main/java/org/zstack/core/workflow/FlowChainBuilder.java +++ b/core/src/main/java/org/zstack/core/workflow/FlowChainBuilder.java @@ -24,7 +24,7 @@ public FlowChainBuilder construct() { for (Object name : flowClassNames) { String className = (String) name; Class clazz = (Class) Class.forName(className); - Flow flow = clazz.newInstance(); + Flow flow = clazz.getConstructor().newInstance(); flows.add(flow); } } diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md new file mode 100644 index 00000000000..796d3b5db53 --- /dev/null +++ b/docs/ARCHITECTURE.md @@ -0,0 +1,1199 @@ +# ZStack 后端架构索引 + +> 本文档描述 ZStack IaaS 云计算平台后端的核心架构设计、组件机制和扩展方式。 + +## 目录 + +- [一、架构概览](#一架构概览) +- [二、核心框架层](#二核心框架层) + - [2.1 消息总线 (CloudBus)](#21-消息总线-cloudbus) + - [2.2 依赖注入与组件管理](#22-依赖注入与组件管理) + - [2.3 数据库访问层 (DatabaseFacade)](#23-数据库访问层-databasefacade) + - [2.4 异步编程模型 (ThreadFacade)](#24-异步编程模型-threadfacade) + - [2.5 错误处理机制 (ErrorFacade)](#25-错误处理机制-errorfacade) +- [三、API 消息设计](#三api-消息设计) + - [3.1 消息类型层次](#31-消息类型层次) + - [3.2 数据模型架构](#32-数据模型架构) + - [3.3 关键注解](#33-关键注解) +- [四、REST API 层](#四rest-api-层) + - [4.1 核心组件](#41-核心组件) + - [4.2 请求处理流程](#42-请求处理流程) + - [4.3 异步 API 机制](#43-异步-api-机制) + - [4.4 限流机制](#44-限流机制) +- [五、工作流引擎 (FlowChain)](#五工作流引擎-flowchain) + - [5.1 工作流类型](#51-工作流类型) + - [5.2 Flow 接口](#52-flow-接口) + - [5.3 回滚机制](#53-回滚机制) +- [六、插件扩展系统](#六插件扩展系统) + - [6.1 插件类型分类](#61-插件类型分类) + - [6.2 插件注册方式](#62-插件注册方式) + - [6.3 扩展点类型](#63-扩展点类型) +- [七、配置管理系统](#七配置管理系统) + - [7.1 GlobalConfig (全局配置)](#71-globalconfig-全局配置) + - [7.2 ResourceConfig (资源配置)](#72-resourceconfig-资源配置) +- [八、启动流程](#八启动流程) + - [8.1 启动入口](#81-启动入口) + - [8.2 管理节点启动步骤](#82-管理节点启动步骤) + - [8.3 数据库 Schema 管理](#83-数据库-schema-管理) +- [九、测试框架](#九测试框架) + - [9.1 测试框架结构](#91-测试框架结构) + - [9.2 模拟器机制](#92-模拟器机制) + - [9.3 环境定义 DSL](#93-环境定义-dsl) +- [十、架构特性总结](#十架构特性总结) + +--- + +## 一、架构概览 + +ZStack 是一个企业级开源 IaaS 云计算平台,采用 **Java + Spring + JPA/Hibernate** 技术栈,以**消息总线**为核心构建分布式、可扩展的微服务架构。 + +### 核心设计理念 + +| 理念 | 说明 | +|------|------| +| **全异步架构** | 所有操作通过消息总线异步执行,提升系统吞吐量 | +| **插件化扩展** | 通过扩展点机制实现模块解耦,便于新功能接入 | +| **声明式 API** | 注解驱动的 REST API 设计,简化开发 | +| **统一错误处理** | AOP + 错误码体系,保证系统稳定性 | + +### 核心技术栈 + +| 层次 | 技术 | +|------|------| +| 依赖注入 | Spring Framework | +| ORM | JPA / Hibernate | +| AOP | AspectJ | +| 消息传输 | HTTP / RabbitMQ | +| 测试框架 | JUnit + Groovy DSL | +| 数据库迁移 | Flyway | +| 连接池 | C3P0 | + +### 项目模块结构 + +``` +zstack/ +├── core/ # 核心框架(消息总线、数据库、线程、错误处理) +├── header/ # API 消息定义、VO/Inventory、常量枚举 +├── rest/ # REST API 服务器 +├── portal/ # 管理节点启动入口 +├── configuration/ # 配置管理 +├── resourceconfig/ # 资源级配置 +├── compute/ # 计算资源管理 +├── storage/ # 存储资源管理 +├── network/ # 网络资源管理 +├── identity/ # 身份认证 +├── image/ # 镜像管理 +├── plugin/ # 插件模块(KVM、Ceph、虚拟路由器等) +├── test/ # 集成测试 +├── testlib/ # 测试框架库 +├── simulator/ # 模拟器 +└── conf/ # 配置文件和数据库 Schema +``` + +--- + +## 二、核心框架层 + +核心框架位于 `core/src/main/java/org/zstack/core/` 目录。 + +### 2.1 消息总线 (CloudBus) + +消息总线是 ZStack 架构的核心,负责服务间通信。 + +#### 核心类 + +| 类/接口 | 路径 | 说明 | +|---------|------|------| +| `CloudBus` | `core/cloudbus/CloudBus.java` | 消息总线核心接口 | +| `CloudBusImpl3` | `core/cloudbus/CloudBusImpl3.java` | 当前实现(基于 HTTP) | +| `CloudBusImpl2` | `core/cloudbus/CloudBusImpl2.java` | 旧实现(基于 RabbitMQ) | + +#### 消息类型层次 + +``` +Message (基础消息) + └── NeedReplyMessage (需要回复的消息) + └── APIMessage (API 消息) + ├── APICreateMessage (创建资源) + ├── APIGetMessage (获取资源) + └── APIQueryMessage (查询资源) + +MessageReply (消息回复) + └── APIReply (API 回复) + +Event (事件) + └── APIEvent (API 事件) +``` + +#### 核心功能 + +| 方法 | 说明 | +|------|------| +| `send(msg, callback)` | 异步发送消息,通过回调接收响应 | +| `call(msg)` | 同步调用,阻塞等待回复 | +| `route(msg)` | 根据 `serviceId` 路由消息到对应服务 | +| `publish(event)` | 发布事件给所有订阅者 | +| `registerService(service)` | 注册服务到消息总线 | + +#### 使用示例 + +```java +// 异步发送 +bus.send(msg, new CloudBusCallBack(completion) { + @Override + public void run(MessageReply reply) { + if (reply.isSuccess()) { + // 处理成功 + } else { + // 处理失败 + } + } +}); + +// 同步调用 +MessageReply reply = bus.call(msg); +``` + +### 2.2 依赖注入与组件管理 + +#### 核心类 + +| 类/接口 | 路径 | 说明 | +|---------|------|------| +| `ComponentLoader` | `core/componentloader/ComponentLoader.java` | 组件加载器接口 | +| `ComponentLoaderImpl` | `core/componentloader/ComponentLoaderImpl.java` | 基于 Spring 的实现 | +| `PluginRegistry` | `core/componentloader/PluginRegistry.java` | 插件注册表接口 | +| `PluginRegistryImpl` | `core/componentloader/PluginRegistryImpl.java` | 插件注册实现 | +| `Platform` | `core/Platform.java` | 平台入口(静态访问) | + +#### 组件生命周期接口 + +```java +// 组件接口 - 定义生命周期 +public interface Component { + boolean start(); // 启动 + boolean stop(); // 停止 +} + +// 服务接口 - 可处理消息 +public interface Service extends Component { + void handleMessage(Message msg); // 处理消息 + String getId(); // 服务 ID + int getSyncLevel(); // 同步级别 + List getAliasIds(); // 别名 +} +``` + +#### 获取组件 + +```java +// 通过 Platform 静态方法获取 +DatabaseFacade dbf = Platform.getComponentLoader().getComponent(DatabaseFacade.class); + +// 或使用 Spring 注入 +@Autowired +private DatabaseFacade dbf; +``` + +### 2.3 数据库访问层 (DatabaseFacade) + +#### 核心类 + +| 类/接口 | 路径 | 说明 | +|---------|------|------| +| `DatabaseFacade` | `core/db/DatabaseFacade.java` | 数据库门面接口 | +| `DatabaseFacadeImpl` | `core/db/DatabaseFacadeImpl.java` | JPA/Hibernate 实现 | +| `SQLBatch` | `core/db/SQLBatch.java` | SQL 批处理抽象类 | +| `SimpleQuery` | `core/db/SimpleQuery.java` | 查询构建器 | +| `SQL` | `core/db/SQL.java` | SQL 工具类 | + +#### 核心功能 + +| 方法 | 说明 | +|------|------| +| `persist(entity)` | 持久化实体 | +| `update(entity)` | 更新实体 | +| `remove(entity)` | 删除实体(支持软删除) | +| `findByUuid(uuid, class)` | 按 UUID 查找 | +| `createQuery(class)` | 创建查询 | +| `eoCleanup(class)` | 清理软删除的实体对象 | + +#### 软删除机制 + +```java +// VO 定义时使用 @EO 注解指定软删除实体 +@Entity +@Table +@EO(EOClazz = VmInstanceEO.class) +public class VmInstanceVO extends VmInstanceAO { + // ... +} + +// 软删除级联 +@Entity +@SoftDeletionCascades({ + @SoftDeletionCascade(parent = VmInstanceVO.class, joinColumn = "vmInstanceUuid") +}) +public class VmNicVO extends VmNicAO { + // ... +} +``` + +#### 死锁处理 + +```java +// 使用 @DeadlockAutoRestart 自动重试 +@DeadlockAutoRestart +public void updateResource() { + // 可能发生死锁的操作 +} +``` + +### 2.4 异步编程模型 (ThreadFacade) + +#### 核心类 + +| 类/接口 | 路径 | 说明 | +|---------|------|------| +| `ThreadFacade` | `core/thread/ThreadFacade.java` | 线程管理门面接口 | +| `ThreadFacadeImpl` | `core/thread/ThreadFacadeImpl.java` | 线程池实现 | +| `Completion` | `header/core/Completion.java` | 无返回值回调 | +| `ReturnValueCompletion` | `header/core/ReturnValueCompletion.java` | 有返回值回调 | +| `NoErrorCompletion` | `header/core/NoErrorCompletion.java` | 无错误回调 | + +#### 回调接口层次 + +``` +AbstractCompletion (抽象基类) +├── Completion (无返回值回调) +│ ├── success() +│ └── fail(ErrorCode) +│ +├── ReturnValueCompletion (有返回值回调) +│ ├── success(T returnValue) +│ └── fail(ErrorCode) +│ +└── NoErrorCompletion (无错误回调) + └── done() +``` + +#### 异步执行注解 + +| 注解 | 说明 | +|------|------| +| `@AsyncThread` | 异步执行方法 | +| `@SyncThread` | 同步执行(带同步级别) | +| `@ScheduledThread` | 定时执行 | + +#### 同步控制机制 + +```java +// SyncTask 接口 - 支持同步级别 +public interface SyncTask extends Task { + String getSyncSignature(); // 同步签名,相同签名的任务串行执行 + int getSyncLevel(); // 同步级别 +} + +// 使用示例 +thdf.syncSubmit(new SyncTask() { + @Override + public String getSyncSignature() { + return "host-" + hostUuid; // 同一主机的操作串行执行 + } + + @Override + public Void call() throws Exception { + // 执行操作 + return null; + } +}); +``` + +#### SingleFlight 模式 + +```java +// 相同 key 的请求只执行一次 +thdf.singleFlightSubmit(new SingleFlightTask(completion) { + @Override + public String getSingleFlightKey() { + return "refresh-" + resourceUuid; + } + + @Override + public void run(SingleFlightCompletion completion) { + // 执行操作 + completion.success(result); + } +}); +``` + +### 2.5 错误处理机制 (ErrorFacade) + +#### 核心类 + +| 类/接口 | 路径 | 说明 | +|---------|------|------| +| `ErrorFacade` | `core/errorcode/ErrorFacade.java` | 错误处理门面接口 | +| `ErrorFacadeImpl` | `core/errorcode/ErrorFacadeImpl.java` | 错误处理实现 | +| `ErrorCode` | `header/errorcode/ErrorCode.java` | 错误码类 | +| `OperationFailureException` | `header/exception/OperationFailureException.java` | 操作失败异常 | + +#### AOP 异常处理注解 + +| 注解 | 切面 | 说明 | +|------|------|------| +| `@ExceptionSafe` | `ExceptionSafeAspect.aj` | 自动捕获异常 | +| `@MessageSafe` | `MessageSafeAspect.aj` | 消息处理异常自动回复 | + +#### 错误码定义 + +```xml + + + SYS.1001 + Internal error + +``` + +#### 异常处理流程 + +``` +方法抛出异常 + ↓ +AOP 拦截 (ExceptionSafeAspect / MessageSafeAspect) + ↓ +转换为 ErrorCode + ↓ +通过 Completion.fail(ErrorCode) 回调 + 或 +通过 bus.replyErrorByMessageType() 回复消息 +``` + +--- + +## 三、API 消息设计 + +API 消息定义位于 `header/src/main/java/org/zstack/header/` 目录。 + +### 3.1 消息类型层次 + +| 类型 | 命名模式 | 基类 | 用途 | +|------|---------|------|------| +| 请求消息 | `API*Msg` | `APIMessage` | 客户端请求 | +| 异步事件 | `API*Event` | `APIEvent` | 异步操作结果通知 | +| 同步回复 | `API*Reply` | `APIReply` | 同步查询结果 | + +#### 消息流模式 + +``` +同步 API: APIMessage → CloudBus.call() → APIReply +异步 API: APIMessage → CloudBus.send() → APIEvent (通过回调) + +资源操作模式: +- Create: APICreateXxxMsg → APICreateXxxEvent +- Update: APIUpdateXxxMsg → APIUpdateXxxEvent +- Delete: APIDeleteXxxMsg → APIDeleteXxxEvent +- Query: APIQueryXxxMsg → APIQueryXxxReply +- Get: APIGetXxxMsg → APIGetXxxReply +``` + +### 3.2 数据模型架构 + +#### 层次结构 + +``` +AO (Abstract Object) - 定义字段 + └── VO (Value Object) - 数据库实体 + └── EO (Entity Object) - 软删除视图 + +数据流转: +VO (数据库实体) → Inventory (DTO) → API Response (REST 响应) +``` + +#### VO 定义示例 + +```java +@Entity +@Table +@EO(EOClazz = VmInstanceEO.class) +@BaseResource +@EntityGraph( + parents = { + @EntityGraph.Neighbour(type = ZoneVO.class, myField = "zoneUuid", targetField = "uuid"), + }, + friends = { + @EntityGraph.Neighbour(type = ImageVO.class, myField = "imageUuid", targetField = "uuid"), + } +) +public class VmInstanceVO extends VmInstanceAO implements OwnedByAccount, ToInventory { + // 字段定义 +} +``` + +#### Inventory 定义示例 + +```java +@Inventory(mappingVOClass = VmInstanceVO.class) +@ExpandedQueries({ + @ExpandedQuery(expandedField = "zone", inventoryClass = ZoneInventory.class, foreignKey = "zoneUuid") +}) +public class VmInstanceInventory implements Serializable { + + public static VmInstanceInventory valueOf(VmInstanceVO vo) { + return new VmInstanceInventory(vo); + } + + public static List valueOf(Collection vos) { + return vos.stream().map(VmInstanceInventory::valueOf).collect(Collectors.toList()); + } +} +``` + +### 3.3 关键注解 + +#### @RestRequest + +```java +@RestRequest( + path = "/vm-instances", + method = HttpMethod.POST, + responseClass = APICreateVmInstanceEvent.class, + parameterName = "params" +) +public class APICreateVmInstanceMsg extends APICreateMessage { + // ... +} +``` + +#### @APIParam + +```java +@APIParam( + required = true, // 必填 + maxLength = 255, // 最大长度 + resourceType = ZoneVO.class, // 资源类型验证 + checkAccount = true, // 账户权限检查 + validValues = {"Enabled", "Disabled"} // 有效值 +) +private String zoneUuid; +``` + +#### @RestResponse + +```java +@RestResponse(allTo = "inventory") // 所有字段映射到 inventory +public class APICreateVmInstanceEvent extends APIEvent { + private VmInstanceInventory inventory; +} +``` + +--- + +## 四、REST API 层 + +REST API 实现位于 `rest/src/main/java/org/zstack/rest/` 目录。 + +### 4.1 核心组件 + +| 类 | 说明 | +|----|------| +| `RestServer` | REST API 服务器核心实现 | +| `RestServerController` | Spring MVC 入口控制器 | +| `RateLimiter` | 限流器(Token Bucket 算法) | +| `AsyncRestApiStore` | 异步 API 存储接口 | +| `MysqlAsyncRestStore` | 异步 API 存储实现 | +| `RequestData` | 请求数据封装 | + +### 4.2 请求处理流程 + +``` +HTTP 请求 + ↓ +RestServerController (Spring MVC 入口) + ↓ +RestServer.handle() + ↓ +┌─────────────────────────────────┐ +│ 1. 限流检查 (RateLimiter) │ +│ 2. 请求拦截器处理 │ +│ 3. 路径匹配 (AntPathMatcher) │ +│ 4. 认证处理 │ +│ ├─ OAuth: Authorization: OAuth +│ └─ AccessKey: Authorization: ZStack : +│ 5. 参数解析 │ +│ ├─ GET/DELETE: Query String │ +│ └─ POST/PUT: Request Body │ +│ 6. 构建 APIMessage │ +│ 7. 发送到 CloudBus │ +│ ├─ 同步调用 → 200 OK │ +│ └─ 异步调用 → 202 Accepted │ +└─────────────────────────────────┘ +``` + +### 4.3 异步 API 机制 + +#### 工作流程 + +``` +1. 请求提交 + POST /v1/vm-instances + → 保存到 AsyncRestVO (状态: processing) + → 发送消息到 CloudBus + → 返回 202 Accepted + → Location: /v1/api-jobs/{uuid} + +2. 状态查询 + GET /v1/api-jobs/{uuid} + → processing: 202 Accepted + → done + success: 200 OK + → done + failed: 503 Service Unavailable + → expired: 404 Not Found + +3. WebHook 回调 (可选) + 请求头: X-Web-Hook: + 任务完成时自动 POST 结果到 WebHook URL +``` + +### 4.4 限流机制 + +基于 Token Bucket 算法实现: + +```java +public class RateLimiter { + private final LoadingCache requestCache; + private final int maxRequestsPerMinute; + + // 基于客户端 IP 限流 + public boolean isRateLimitExceeded(String clientIp) { + TokenBucket bucket = requestCache.get(clientIp); + return !bucket.tryConsume(); + } +} +``` + +配置: +- 默认限制:12000 请求/分钟 +- 可通过 `RestGlobalProperty.REST_RATE_LIMITS` 配置 + +--- + +## 五、工作流引擎 (FlowChain) + +工作流实现位于 `core/src/main/java/org/zstack/core/workflow/` 目录。 + +### 5.1 工作流类型 + +| 类型 | 特点 | 适用场景 | +|------|------|---------| +| `SimpleFlowChain` | 内存执行,无持久化,性能好 | 简单业务流程 | +| `WorkFlowChain` | 数据库持久化,支持恢复 | 复杂流程,需状态恢复 | +| `AsyncWorkFlowChain` | 异步执行和回调 | 异步场景 | +| `ShareFlowChain` | 动态流程编排 | 运行时构建流程 | + +### 5.2 Flow 接口 + +```java +public interface Flow { + // 执行流程 + void run(FlowTrigger trigger, Map data); + + // 回滚流程 + void rollback(FlowRollback trigger, Map data); + + // 是否跳过(默认不跳过) + default boolean skip(Map data) { return false; } +} + +public interface FlowTrigger { + void next(); // 继续下一个流程 + void fail(ErrorCode err); // 失败并触发回滚 +} + +public interface FlowRollback { + void rollback(); // 继续回滚 + void skipRestRollbacks(); // 跳过剩余回滚 +} +``` + +#### 使用示例 + +```java +new SimpleFlowChain() + .setName("create-vm-flow") + .then(new Flow() { + @Override + public void run(FlowTrigger trigger, Map data) { + // 步骤 1:分配资源 + data.put("allocated", true); + trigger.next(); + } + + @Override + public void rollback(FlowRollback trigger, Map data) { + // 回滚:释放资源 + releaseResource(); + trigger.rollback(); + } + }) + .then(new NoRollbackFlow() { + @Override + public void run(FlowTrigger trigger, Map data) { + // 步骤 2:启动 VM(无需回滚) + trigger.next(); + } + }) + .done(new FlowDoneHandler(completion) { + @Override + public void handle(Map data) { + // 完成处理 + completion.success(); + } + }) + .error(new FlowErrorHandler(completion) { + @Override + public void handle(ErrorCode err, Map data) { + // 错误处理 + completion.fail(err); + } + }) + .start(); +``` + +### 5.3 回滚机制 + +#### SimpleFlowChain 回滚 + +- 使用栈结构(LIFO)实现逆序回滚 +- 调用 `trigger.next()` 时,当前 Flow 入栈 +- 调用 `trigger.fail(err)` 时,触发回滚 +- 支持 `skipRestRollbacks()` 跳过剩余回滚 + +#### WorkFlowChain 回滚 + +- 每个 Flow 状态持久化到 `WorkFlowVO` +- 支持 `carryOn(chainUuid)` 从断点继续执行 +- 自动判断继续策略:重启或继续回滚 + +--- + +## 六、插件扩展系统 + +插件位于 `plugin/` 目录,每个插件是独立的 Maven 模块。 + +### 6.1 插件类型分类 + +| 类型 | 插件 | 说明 | +|------|------|------| +| **Hypervisor** | `kvm` | KVM 虚拟化 | +| **Primary Storage** | `nfsPrimaryStorage`, `localstorage`, `ceph`, `sharedMountPointPrimaryStorage` | 主存储 | +| **Backup Storage** | `sftpBackupStorage` | 备份存储 | +| **Network Provider** | `virtualRouterProvider`, `flatNetworkProvider`, `sdnController` | 网络服务提供者 | +| **Network Service** | `securityGroup`, `portForwarding`, `loadBalancer`, `eip`, `vip` | 网络服务 | +| **认证/授权** | `ldap`, `loginPlugin`, `directory` | 身份认证 | + +### 6.2 插件注册方式 + +#### XML 配置方式 + +```xml + + + + + + + + +``` + +#### 代码方式 (PluginDSL) + +```java +// 使用 PluginDSL 在代码中声明扩展 +PluginDSL.plugin("myPlugin") + .extension(SomeExtensionPoint.class, this) + .register(); +``` + +### 6.3 扩展点类型 + +#### Factory 模式 + +```java +// 定义工厂接口 +public interface HypervisorFactory { + HypervisorType getHypervisorType(); + Host createHost(HostVO vo); +} + +// 实现工厂 +public class KVMHostFactory implements HypervisorFactory { + public static final HypervisorType hypervisorType = new HypervisorType("KVM"); + + @Override + public HypervisorType getHypervisorType() { + return hypervisorType; + } +} + +// 使用工厂 +List factories = pluginRgty.getExtensionList(HypervisorFactory.class); +``` + +#### Backend 模式 + +```java +// 定义后端接口 +public interface PortForwardingBackend { + NetworkServiceProviderType getProviderType(); + void applyPortForwardingRule(PortForwardingRuleInventory rule, Completion completion); +} + +// 实现后端 +public class VirtualRouterPortForwardingBackend implements PortForwardingBackend { + @Override + public NetworkServiceProviderType getProviderType() { + return VirtualRouterConstant.VIRTUAL_ROUTER_PROVIDER_TYPE; + } +} + +// 注册和使用 +Map backends = new HashMap<>(); +for (PortForwardingBackend backend : pluginRgty.getExtensionList(PortForwardingBackend.class)) { + backends.put(backend.getProviderType().toString(), backend); +} +``` + +#### ExtensionPoint 回调模式 + +```java +// 定义扩展点接口 +public interface KVMStartVmExtensionPoint { + void beforeStartVmOnKvm(KVMHostInventory host, VmInstanceSpec spec, StartVmCmd cmd); + void afterStartVmOnKvm(KVMHostInventory host, VmInstanceSpec spec, StartVmCmd cmd); +} + +// 实现扩展点 +public class CephPrimaryStorageFactory implements KVMStartVmExtensionPoint { + @Override + public void beforeStartVmOnKvm(KVMHostInventory host, VmInstanceSpec spec, StartVmCmd cmd) { + // 在 VM 启动前执行 Ceph 相关逻辑 + } +} + +// 触发扩展点 +for (KVMStartVmExtensionPoint ext : pluginRgty.getExtensionList(KVMStartVmExtensionPoint.class)) { + ext.beforeStartVmOnKvm(host, spec, cmd); +} +``` + +--- + +## 七、配置管理系统 + +### 7.1 GlobalConfig (全局配置) + +位于 `core/src/main/java/org/zstack/core/config/` 目录。 + +#### 核心类 + +| 类 | 说明 | +|----|------| +| `GlobalConfig` | 配置项实体 | +| `GlobalConfigFacade` | 配置管理门面接口 | +| `GlobalConfigFacadeImpl` | 配置管理实现 | +| `GlobalConfigVO` | 配置数据库实体 | + +#### 配置来源优先级 + +``` +1. 数据库(运行时值) +2. XML 配置文件(conf/globalConfig/*.xml) +3. Java 注解(@GlobalConfigDef) +4. 扩展点自动生成 +``` + +#### 定义方式 + +**XML 方式**: +```xml + + + + vm + vm.cleanTraffic + Whether to clean traffic when deleting VM + false + java.lang.Boolean + + +``` + +**注解方式**: +```java +@GlobalConfigDefinition +public class VmGlobalConfig { + public static final String CATEGORY = "vm"; + + @GlobalConfigValidation(notNull = true) + public static GlobalConfig VM_CLEAN_TRAFFIC = new GlobalConfig(CATEGORY, "vm.cleanTraffic"); +} +``` + +#### 使用方式 + +```java +// 获取配置值 +boolean cleanTraffic = VmGlobalConfig.VM_CLEAN_TRAFFIC.value(Boolean.class); + +// 监听配置变更 +VmGlobalConfig.VM_CLEAN_TRAFFIC.installUpdateExtension((oldValue, newValue) -> { + // 处理配置变更 +}); +``` + +### 7.2 ResourceConfig (资源配置) + +位于 `resourceconfig/src/main/java/org/zstack/resourceconfig/` 目录。 + +#### 与 GlobalConfig 的区别 + +| 特性 | GlobalConfig | ResourceConfig | +|------|-------------|----------------| +| 作用域 | 全局共享 | 资源级独立设置 | +| 存储 | `GlobalConfigVO` | `ResourceConfigVO` | +| 查找顺序 | 直接返回全局值 | 资源 → 父资源 → GlobalConfig | + +#### 绑定方式 + +```java +@GlobalConfigDefinition +public class VmGlobalConfig { + // 绑定到 VM 和 Cluster,支持多级继承 + @BindResourceConfig({VmInstanceVO.class, ClusterVO.class}) + public static GlobalConfig VM_VIDEO_TYPE = new GlobalConfig(CATEGORY, "videoType"); +} +``` + +#### 查找优先级 + +``` +1. 资源自身配置(ResourceConfigVO 中 resourceUuid 匹配) +2. 父资源配置(通过 DBGraph 查找父资源) +3. GlobalConfig 默认值 +``` + +#### API 接口 + +| API | 说明 | +|-----|------| +| `APIUpdateResourceConfigMsg` | 更新资源配置 | +| `APIDeleteResourceConfigMsg` | 删除资源配置 | +| `APIGetResourceConfigMsg` | 获取资源配置 | +| `APIGetResourceBindableConfigMsg` | 查询可绑定的配置 | + +--- + +## 八、启动流程 + +### 8.1 启动入口 + +``` +Servlet 容器启动 + ↓ +BootstrapWebListener.contextInitialized() + → 触发 Platform 静态初始化 + ↓ +BootstrapContextLoaderListener.contextInitialized() + → 加载 Spring 上下文 (beanRefContext.xml → zstack.xml) + ↓ +ComponentLoaderWebListener.contextInitialized() + → Platform.createComponentLoaderFromWebApplicationContext() + → ManagementNodeManager.startNode() +``` + +### 8.2 管理节点启动步骤 + +`ManagementNodeManagerImpl.start()` 使用 FlowChain 编排启动步骤: + +| 步骤 | 名称 | 说明 | +|------|------|------| +| 1 | `bootstrap-cloudbus` | CloudBus 初始化(已在 Platform 中完成) | +| 2 | `populate-components` | 收集所有 Component 和 Service | +| 3 | `register-node-on-cloudbus` | 注册管理节点服务到 CloudBus | +| 4 | `call-prepare-db-extension` | 准备数据库初始值 | +| 5 | `start-components` | 启动所有组件和服务 | +| 6 | `create-DB-record` | 创建/更新 ManagementNodeVO | +| 7 | `start-heartbeat` | 启动心跳机制 | +| 8 | `start-api-mediator` | 启动 API 中介器 | +| 9 | `set-node-to-running` | 设置节点状态为 RUNNING | +| 10 | `I-join` | 触发节点加入事件 | +| 11 | `node-is-ready` | 调用 ManagementNodeReadyExtensionPoint | +| 12 | `listen-node-life-cycle-events` | 监听节点生命周期事件 | +| 13 | `say-I-join` | 通知其他管理节点 | + +### 8.3 数据库 Schema 管理 + +#### Flyway 迁移 + +```bash +# 部署脚本 (conf/deploydb.sh) +1. 创建数据库(如果不存在) +2. 复制 SQL 文件到 Flyway 目录 + - conf/db/V0.6__schema.sql (基础 schema) + - conf/db/upgrade/*.sql (升级脚本) +3. Flyway clean (清理) +4. Flyway baseline (创建 baseline) +5. Flyway migrate (执行迁移,outOfOrder=true) +``` + +#### Schema 文件结构 + +``` +conf/db/ +├── V0.6__schema.sql # 基础 schema +├── upgrade/ +│ ├── V2.5.0__schema.sql # 升级脚本 +│ ├── V3.9.0__schema.sql +│ └── ... +├── beforeMigrate.sql # 迁移前执行 +└── beforeValidate.sql # 验证前执行 +``` + +--- + +## 九、测试框架 + +测试框架位于 `test/` 和 `testlib/` 目录。 + +### 9.1 测试框架结构 + +```groovy +// 测试用例基类 +class ExampleCase extends SubCase { + EnvSpec env + + @Override + void setup() { + // 配置 Spring,指定需要的服务模块 + spring { + sftpBackupStorage() + localStorage() + kvm() + } + } + + @Override + void environment() { + // 定义测试环境 + env = env { + zone { + name = "zone1" + cluster { ... } + } + } + } + + @Override + void test() { + // 创建环境并执行测试 + env.create { + testMethod1() + testMethod2() + } + } + + @Override + void clean() { + env.delete() + } +} +``` + +#### 生命周期 + +``` +setup() → 配置 Spring,指定模块 +environment() → 定义测试环境(不创建) +test() → env.create() 创建环境,执行测试 +clean() → 清理环境 +``` + +### 9.2 模拟器机制 + +模拟器拦截 Agent HTTP 请求,返回模拟响应。 + +```groovy +class KVMSimulator implements Simulator { + @Override + void registerSimulators(EnvSpec spec) { + // 注册 KVM Agent 路径处理器 + spec.simulator(KVMConstant.KVM_HOST_CAPACITY_PATH) { HttpEntity e, EnvSpec espec -> + def rsp = new KVMAgentCommands.HostCapacityResponse() + rsp.success = true + rsp.cpuNum = 8 + rsp.totalMemory = SizeUnit.GIGABYTE.toByte(32) + return rsp + } + + spec.simulator(KVMConstant.KVM_START_VM_PATH) { HttpEntity e -> + def cmd = JSONObjectUtil.toObject(e.body, KVMAgentCommands.StartVmCmd.class) + def rsp = new KVMAgentCommands.StartVmResponse() + rsp.success = true + return rsp + } + } +} +``` + +#### 处理器类型 + +| 类型 | 说明 | +|------|------| +| `simulator(path, closure)` | 基础 HTTP 处理器 | +| `preSimulator(path, closure)` | 请求前处理器 | +| `afterSimulator(path, closure)` | 请求后处理器 | +| `hijackSimulator(path, closure)` | 最终拦截处理器 | + +### 9.3 环境定义 DSL + +```groovy +env = env { + zone { + name = "zone" + cluster { + name = "cluster" + kvmHost { + name = "host" + totalCpu = 8 + totalMem = SizeUnit.GIGABYTE.toByte(32) + } + } + instanceOffering { + name = "instanceOffering" + cpuNum = 2 + memorySize = SizeUnit.GIGABYTE.toByte(4) + } + diskOffering { + name = "diskOffering" + diskSize = SizeUnit.GIGABYTE.toByte(100) + } + sftpBackupStorage { + name = "bs" + url = "/tmp/bs" + } + nfsPrimaryStorage { + name = "ps" + url = "/tmp/ps" + } + l2NoVlanNetwork { + name = "l2" + l3Network { + name = "l3" + ip { + startIp = "192.168.0.2" + endIp = "192.168.0.254" + gateway = "192.168.0.1" + netmask = "255.255.255.0" + } + } + } + vm { + name = "vm" + useHost("host") + useL3Networks("l3") + useInstanceOffering("instanceOffering") + useImage("image") + } + } +} +``` + +--- + +## 十、架构特性总结 + +### 设计模式应用 + +| 模式 | 应用场景 | +|------|---------| +| **门面模式** | `DatabaseFacade`, `ThreadFacade`, `ErrorFacade`, `GlobalConfigFacade` | +| **工厂模式** | `HypervisorFactory`, `PrimaryStorageFactory`, `BackupStorageFactory` | +| **观察者模式** | 事件订阅机制、配置变更监听 | +| **策略模式** | 插件扩展点、Backend 接口 | +| **模板方法** | `SQLBatch`, `AbstractService`, `Flow` | +| **责任链模式** | `FlowChain` 工作流 | +| **代理模式** | AOP 增强(AspectJ) | + +### 架构优势 + +| 优势 | 说明 | +|------|------| +| **高度解耦** | 消息总线 + 插件系统实现模块解耦 | +| **可扩展性** | 扩展点机制便于新功能接入 | +| **异步优先** | 全异步架构提升系统吞吐量 | +| **容错性** | FlowChain 支持回滚和状态恢复 | +| **统一抽象** | 门面模式简化复杂性 | +| **测试友好** | 模拟器机制便于集成测试 | +| **配置灵活** | GlobalConfig + ResourceConfig 多级配置 | + +### 关键目录索引 + +| 目录 | 内容 | +|------|------| +| `core/` | 核心框架(消息总线、数据库、线程、错误处理) | +| `header/` | API 消息定义、VO/Inventory、常量枚举 | +| `rest/` | REST API 服务器 | +| `portal/` | 管理节点启动入口 | +| `configuration/` | 配置管理 | +| `resourceconfig/` | 资源级配置 | +| `plugin/` | 插件模块 | +| `test/` | 集成测试 | +| `testlib/` | 测试框架库 | +| `conf/` | 配置文件和数据库 Schema | + +--- + +## 附录:常用类速查 + +### 核心框架 + +| 类 | 包路径 | 用途 | +|----|--------|------| +| `Platform` | `org.zstack.core` | 平台入口,静态访问组件 | +| `CloudBus` | `org.zstack.core.cloudbus` | 消息总线 | +| `DatabaseFacade` | `org.zstack.core.db` | 数据库访问 | +| `ThreadFacade` | `org.zstack.core.thread` | 线程管理 | +| `ErrorFacade` | `org.zstack.core.errorcode` | 错误处理 | +| `PluginRegistry` | `org.zstack.core.componentloader` | 插件注册 | +| `GlobalConfigFacade` | `org.zstack.core.config` | 全局配置 | + +### API 相关 + +| 类 | 包路径 | 用途 | +|----|--------|------| +| `APIMessage` | `org.zstack.header.message` | API 消息基类 | +| `APIEvent` | `org.zstack.header.message` | API 事件基类 | +| `APIReply` | `org.zstack.header.message` | API 回复基类 | +| `RestServer` | `org.zstack.rest` | REST API 服务器 | + +### 工作流 + +| 类 | 包路径 | 用途 | +|----|--------|------| +| `SimpleFlowChain` | `org.zstack.core.workflow` | 简单工作流 | +| `Flow` | `org.zstack.header.core.workflow` | 流程接口 | +| `FlowTrigger` | `org.zstack.header.core.workflow` | 流程触发器 | + +### 回调 + +| 类 | 包路径 | 用途 | +|----|--------|------| +| `Completion` | `org.zstack.header.core` | 无返回值回调 | +| `ReturnValueCompletion` | `org.zstack.header.core` | 有返回值回调 | +| `NoErrorCompletion` | `org.zstack.header.core` | 无错误回调 | + +--- + +*文档版本: 1.0* +*最后更新: 2025-01* diff --git a/docs/BUILD-ACCELERATION.md b/docs/BUILD-ACCELERATION.md new file mode 100644 index 00000000000..4ae9277103f --- /dev/null +++ b/docs/BUILD-ACCELERATION.md @@ -0,0 +1,141 @@ +# ZStack 构建加速指南 + +## 为什么 `-T 1C` 提升有限? + +- **依赖链长**:header → core → plugin* → premium,大量模块串行,可并行的只有同一“层”的模块。 +- **单模块重**:mevoco、testlib-premium、hybrid、header 等单模块编译时间 30s~70s,并行只能缩短“层内”时间。 +- **内存压力**:并行会起多个 JVM(GMavenPlus/编译器),若总内存不足易触发 GC 或交换,反而变慢。 + +--- + +## 推荐做法(按收益排序) + +### 1. 日常开发:不 clean,只编改动的模块(收益最大) + +**从 zstack 根目录构建 premium 时,必须先激活 profile `-P premium`**(根 pom 默认模块列表里没有 premium,只有激活该 profile 后 reactor 才会包含 premium)。 + +```bash +# 只编 premium 整棵子工程(含其依赖:header、core、plugin 等) +# -Dmevoco.skip.obfuscate=true 避免 mvnd 下 exec 插件 NPE,见下文说明 +mvnd install -DskipTests -P premium -Dmevoco.skip.obfuscate=true -pl premium -am + +# 只编 premium 下某模块(如 mevoco)及其依赖 +mvnd install -DskipTests -P premium -Dmevoco.skip.obfuscate=true -pl premium/mevoco -am + +# 只编 premium 下某插件 +mvnd install -DskipTests -P premium -Dmevoco.skip.obfuscate=true -pl premium/plugin-premium/某插件名 -am +``` + +若**已进入 premium 目录**,则不需要 `-P premium`,直接: + +```bash +cd premium && mvnd install -DskipTests -Dmevoco.skip.obfuscate=true + +# 只编 premium 内某模块 +cd premium && mvnd install -DskipTests -Dmevoco.skip.obfuscate=true -pl mevoco -am +``` + +避免每次 `clean` 全量重编,可节省大半时间。 + +### 2. 使用 Maven Daemon(mvnd)— 二次及以后构建明显更快 + +mvnd 保持 JVM 常驻,避免每次冷启动和重复加载类,对多模块项目通常有 **2~4 倍** 提升。 + +```bash +# macOS(mvnd 需通过官方 tap 安装,默认 brew 无此 formula) +brew install mvndaemon/homebrew-mvnd/mvnd + +# 使用方式与 mvn 一致 +mvnd clean install -DskipTests +mvnd install -DskipTests -pl premium/mevoco -am +``` + +**使用 mvnd 构建含 premium 时**:exec-maven-plugin 在 mvnd 下会因 `MavenSession.getContainer()` 为 null 报错,需跳过 mevoco 的混淆步骤: + +```bash +mvnd install -DskipTests -P premium -Dmevoco.skip.obfuscate=true +``` + +需要发布/混淆时用普通 Maven:`mvn install -DskipTests -P premium`(不加该参数)。 + +注意:首次运行仍会较慢,后续构建才会体现加速。 + +**mvnd 内存与 Groovy 编译**:test-premium、test、testlib-premium 等模块大量使用 Groovy,gmavenplus 会在同一 JVM(mvnd daemon)里解析/编译,易占满堆或 Metaspace 导致无响应。已为 gmavenplus-plugin 开启 **`true`**:Groovy 编译在独立子进程中执行,完成后子进程退出释放内存,减轻 daemon 压力。根目录 `.mvn/jvm.config` 已为 mvnd daemon 配置: + +- **堆**:`-Xmx10240m`(10GB),供 Groovy 源码与 stub 常驻 +- **Metaspace**:`-XX:MaxMetaspaceSize=2560m`(2.5GB),应对大量 Groovy/Java 类加载 +- **CodeCache**:`-XX:ReservedCodeCacheSize=512m`、`-XX:NonProfiledCodeHeapSize=240m`,避免 JIT 代码缓存满 +- **G1**:`-XX:+UseG1GC`、`-XX:+UseStringDeduplication` + +建议物理内存 ≥16GB 再跑 `mvnd install -DskipTests -P premium` 全量;否则可先用 `mvn` 或只编到 `test`(`-pl test -am`)。修改 `.mvn/jvm.config` 后必须重启 daemon 才生效: + +```bash +mvnd --stop +mvnd install -DskipTests -P premium -Dmevoco.skip.obfuscate=true +``` + +### 3. 离线构建(依赖已齐全时) + +```bash +mvn install -DskipTests -o +``` + +避免每次解析/检查远程仓库,可省数秒到数十秒。 + +### 4. 适当提高并行度(在内存充足时) + +若机器内存 ≥16GB,可尝试: + +```bash +# 最多 4 个线程,避免过多并行导致 OOM +mvn install -DskipTests -T 4 +``` + +不建议在 8GB 或以下机器用 `-T 1C`,易与 `.mvn/jvm.config` 里的大堆一起导致交换。 + +### 5. 只编到某模块,不编完全部 + +```bash +# 只编到 build(含 header/core/plugin 等),不编 test/testlib/premium 测试相关 +mvn install -DskipTests -pl build -am + +# 只编到 crypto,不编 testlib-premium / test-premium +mvn install -DskipTests -pl premium/crypto -am +``` + +适合验证主链或某个子模块,跳过最耗时的 testlib-premium 等。 + +### 6. 关闭/缩短测试(已有 -DskipTests 时可略过) + +已使用 `-DskipTests` 时,测试已跳过。若某处仍会跑测试,可再加: + +```bash +-Dmaven.test.skip=true +``` + +--- + +## 建议的日常组合 + +| 场景 | 命令示例 | +|------|----------| +| 从**根目录**只编 premium | `mvnd install -DskipTests -P premium -Dmevoco.skip.obfuscate=true -pl premium -am` | +| 从**根目录**只编 mevoco | `mvnd install -DskipTests -P premium -Dmevoco.skip.obfuscate=true -pl premium/mevoco -am` | +| 已 **cd premium**,只编某插件 | `mvnd install -DskipTests -Dmevoco.skip.obfuscate=true -pl plugin-premium/xxx -am` | +| 全量构建(含 premium,少用 clean) | `mvnd install -DskipTests -P premium -Dmevoco.skip.obfuscate=true` | +| 全量 + 并行(内存够) | `mvnd install -DskipTests -P premium -Dmevoco.skip.obfuscate=true -T 4` | +| 依赖已全、不想连网 | `mvnd install -DskipTests -P premium -Dmevoco.skip.obfuscate=true -o` | + +--- + +## 可选:为编译器开启增量(需各模块兼容) + +在根 `pom.xml` 的 `maven-compiler-plugin` 的 `pluginManagement` 里可统一开启: + +```xml + + true + +``` + +部分老模块若出现“改完不重编”的异常,再对单模块关闭即可。当前项目未全局开启,可按需试验。 diff --git a/externalservice/pom.xml b/externalservice/pom.xml index 9346a6ff780..b6971f6a68f 100755 --- a/externalservice/pom.xml +++ b/externalservice/pom.xml @@ -38,30 +38,24 @@ maven-compiler-plugin ${project.compiler.version} - groovy-eclipse-compiler - ${project.java.version} - ${project.java.version} - lines,vars,source + ${project.java.version} true + true - - - org.codehaus.groovy - groovy-eclipse-compiler - 2.9.2-01 - - - org.codehaus.groovy - groovy-eclipse-batch - 2.4.3-01 - - + org.codehaus.mojo aspectj-maven-plugin ${aspectj.plugin.version} + + + org.aspectj + aspectjtools + ${aspectj.version} + + @@ -71,10 +65,12 @@ + ${project.java.version} ${project.java.version} ${project.java.version} - ${project.java.version} - true + ${project.build.sourceEncoding} + true + org.springframework diff --git a/header/pom.xml b/header/pom.xml index 9c7bb823e76..e04d4f41e08 100755 --- a/header/pom.xml +++ b/header/pom.xml @@ -11,34 +11,76 @@ + org.apache.maven.plugins maven-compiler-plugin ${project.compiler.version} - groovy-eclipse-compiler - ${project.java.version} - ${project.java.version} - lines,vars,source + ${project.java.version} true + true - - - org.codehaus.groovy - groovy-eclipse-compiler - ${groovy.eclipse.compiler} - - - org.codehaus.groovy - groovy-eclipse-batch - ${groovy.eclipse.batch} - - + + + + + org.codehaus.gmavenplus + gmavenplus-plugin + 4.2.1 + + + + generate-stubs + process-sources + + generateStubs + + + + + compile-groovy + compile + + compile + + + + + generate-test-stubs + process-test-sources + + generateTestStubs + + + + + compile-test-groovy + test-compile + + compileTests + + + + + ${groovy.version} + ${project.java.version} + + + + org.codehaus.mojo aspectj-maven-plugin ${aspectj.plugin.version} + + + org.aspectj + aspectjtools + ${aspectj.version} + + @@ -47,13 +89,13 @@ - ${project.java.version} ${project.java.version} ${project.java.version} - true - true + ${project.build.sourceEncoding} + true + none org.springframework @@ -66,6 +108,12 @@ + + org.apache.groovy + groovy + ${groovy.version} + + org.hibernate.javax.persistence hibernate-jpa-2.1-api diff --git a/header/src/main/java/org/zstack/header/zql/ASTNode.groovy b/header/src/main/groovy/org/zstack/header/zql/ASTNode.groovy old mode 100755 new mode 100644 similarity index 95% rename from header/src/main/java/org/zstack/header/zql/ASTNode.groovy rename to header/src/main/groovy/org/zstack/header/zql/ASTNode.groovy index 3148ec77ab2..4aa255f21c6 --- a/header/src/main/java/org/zstack/header/zql/ASTNode.groovy +++ b/header/src/main/groovy/org/zstack/header/zql/ASTNode.groovy @@ -1,220 +1,221 @@ -package org.zstack.header.zql - -class ASTNode { - private static final Map> childrenNames = [:] - - List getChildren() { - List childNames - synchronized (childrenNames) { - childNames = childrenNames.get(getClass(), metaClass.getProperties().findAll { ASTNode.isAssignableFrom(it.type) }.collect { it.name }) - } - - return childNames.collect { owner[it] as ASTNode } - } - - Object accept(ASTVisitor visitor) { - return visitor.visit(this) - } - - interface Value { - } - - interface Condition { - } - - interface ReturnWithExpr { - } - - static class Function extends ASTNode { - String functionName - } - - static class QueryTarget extends ASTNode { - String entity - List fields - } - - static class QueryTargetWithFunction extends QueryTarget { - Function function - QueryTargetWithFunction subTarget - List joinClauseList - - static QueryTargetWithFunction valueOf(QueryTarget q) { - return new QueryTargetWithFunction(entity: q.entity, fields: q.fields) - } - - @Override - String getEntity() { - if (subTarget != null) { - return subTarget.getEntity() - } else { - return super.getEntity() - } - } - - @Override - List getFields() { - if (subTarget != null) { - return subTarget.getFields() - } else { - return super.getFields() - } - } - } - - static class ComplexValue extends ASTNode implements Value { - SubQuery subQuery - } - - static class PlainValue extends ASTNode implements Value { - String text - transient Class type - String ctype - } - - static class ListValue extends ASTNode implements Value { - List values - } - - static class Expr extends ASTNode implements Condition { - String operator - List left - Value right - } - - static class LogicalOperator extends ASTNode implements Condition { - String operator - Condition left - Condition right - } - - static class JoinExpr extends ASTNode implements Condition { - QueryTarget left - String operator - QueryTarget right - } - - static class ExprAtom extends ASTNode { - String text - List fields = new ArrayList<>() - QueryTarget queryTarget - Function function - } - - static class OrderByExpr extends ASTNode { - ExprAtom expr - String direction - } - - static class OrderBy extends ASTNode { - List exprs - } - - static class Limit extends ASTNode { - int limit - } - - static class Offset extends ASTNode { - int offset - } - - static class RestrictExpr extends ASTNode { - String entity - String field - String operator - Value value - } - - static class RestrictBy extends ASTNode { - List exprs - } - - static class ReturnWithIDExpr extends ASTNode implements ReturnWithExpr { - List names - } - - static class ReturnWithBlockExpr extends ASTNode implements ReturnWithExpr { - String name - String content - } - - static class ReturnWith extends ASTNode { - List exprs - } - - static class Sum extends Query { - String groupByField - } - - static class GroupByExpr extends ASTNode { - List fields - } - - static class Query extends ASTNode { - QueryTargetWithFunction target - List conditions - RestrictBy restrictBy - ReturnWith returnWith - FilterBy filterBy - OrderBy orderBy - Limit limit - Offset offset - String name - GroupByExpr groupBy - - void addRestrictExpr(RestrictExpr expr) { - if (restrictBy == null) { - restrictBy = new RestrictBy() - } - - if (restrictBy.exprs == null) { - restrictBy.exprs = [] - } - - restrictBy.exprs.add(expr) - } - } - - static class SubQueryTarget extends ASTNode { - String entity - List fields - } - - static class SubQuery extends ASTNode { - SubQueryTarget target - List conditions - } - - static class FilterByExpr extends ASTNode { - String filterName - String content - } - - static class FilterBy extends ASTNode { - List exprs - } - - static class Search extends ASTNode { - Keyword keyword - Index index - RestrictBy restrictBy - Limit limit - Offset offset - } - - static class Keyword extends ASTNode { - String value - } - - static class Index extends ASTNode { - List indexs - } - - static class JoinClause extends ASTNode { - String joinType - String join - QueryTarget queryTarget - String on - List conditions - } -} +package org.zstack.header.zql + +class ASTNode { + private static final Map> childrenNames = [:] + + List getChildren() { + List childNames + synchronized (childrenNames) { + childNames = childrenNames.get(getClass(), metaClass.getProperties().findAll { ASTNode.isAssignableFrom(it.type) }.collect { it.name }) + } + + return childNames.collect { owner[it] as ASTNode } + } + + Object accept(ASTVisitor visitor) { + return visitor.visit(this) + } + + interface Value { + } + + interface Condition { + } + + interface ReturnWithExpr { + } + + static class Function extends ASTNode { + String functionName + } + + static class QueryTarget extends ASTNode { + String entity + List fields + } + + static class QueryTargetWithFunction extends QueryTarget { + Function function + QueryTargetWithFunction subTarget + List joinClauseList + + static QueryTargetWithFunction valueOf(QueryTarget q) { + return new QueryTargetWithFunction(entity: q.entity, fields: q.fields) + } + + @Override + String getEntity() { + if (subTarget != null) { + return subTarget.getEntity() + } else { + return super.getEntity() + } + } + + @Override + List getFields() { + if (subTarget != null) { + return subTarget.getFields() + } else { + return super.getFields() + } + } + } + + static class ComplexValue extends ASTNode implements Value { + SubQuery subQuery + } + + static class PlainValue extends ASTNode implements Value { + String text + transient Class type + String ctype + } + + static class ListValue extends ASTNode implements Value { + List values + } + + static class Expr extends ASTNode implements Condition { + String operator + List left + Value right + } + + static class LogicalOperator extends ASTNode implements Condition { + String operator + Condition left + Condition right + } + + static class JoinExpr extends ASTNode implements Condition { + QueryTarget left + String operator + QueryTarget right + } + + static class ExprAtom extends ASTNode { + String text + List fields = new ArrayList<>() + QueryTarget queryTarget + Function function + } + + static class OrderByExpr extends ASTNode { + ExprAtom expr + String direction + } + + static class OrderBy extends ASTNode { + List exprs + } + + static class Limit extends ASTNode { + int limit + } + + static class Offset extends ASTNode { + int offset + } + + static class RestrictExpr extends ASTNode { + String entity + String field + String operator + Value value + } + + static class RestrictBy extends ASTNode { + List exprs + } + + static class ReturnWithIDExpr extends ASTNode implements ReturnWithExpr { + List names + } + + static class ReturnWithBlockExpr extends ASTNode implements ReturnWithExpr { + String name + String content + } + + static class ReturnWith extends ASTNode { + List exprs + } + + static class Sum extends Query { + String groupByField + } + + static class GroupByExpr extends ASTNode { + List fields + } + + static class Query extends ASTNode { + QueryTargetWithFunction target + List conditions + RestrictBy restrictBy + ReturnWith returnWith + FilterBy filterBy + OrderBy orderBy + Limit limit + Offset offset + String name + GroupByExpr groupBy + + void addRestrictExpr(RestrictExpr expr) { + if (restrictBy == null) { + restrictBy = new RestrictBy() + } + + if (restrictBy.exprs == null) { + restrictBy.exprs = [] + } + + restrictBy.exprs.add(expr) + } + } + + static class SubQueryTarget extends ASTNode { + String entity + List fields + } + + static class SubQuery extends ASTNode { + SubQueryTarget target + List conditions + } + + static class FilterByExpr extends ASTNode { + String filterName + String content + } + + static class FilterBy extends ASTNode { + List exprs + } + + static class Search extends ASTNode { + Keyword keyword + Index index + RestrictBy restrictBy + Limit limit + Offset offset + } + + static class Keyword extends ASTNode { + String value + } + + static class Index extends ASTNode { + List indexs + } + + static class JoinClause extends ASTNode { + String joinType + String join + QueryTarget queryTarget + String on + List conditions + } +} + diff --git a/header/src/main/java/org/zstack/header/zql/ASTVisitor.groovy b/header/src/main/groovy/org/zstack/header/zql/ASTVisitor.groovy old mode 100755 new mode 100644 similarity index 95% rename from header/src/main/java/org/zstack/header/zql/ASTVisitor.groovy rename to header/src/main/groovy/org/zstack/header/zql/ASTVisitor.groovy index a3fe304ce34..9a5130f80ff --- a/header/src/main/java/org/zstack/header/zql/ASTVisitor.groovy +++ b/header/src/main/groovy/org/zstack/header/zql/ASTVisitor.groovy @@ -1,5 +1,6 @@ -package org.zstack.header.zql - -interface ASTVisitor { - T visit(K node) -} +package org.zstack.header.zql + +interface ASTVisitor { + T visit(K node) +} + diff --git a/header/src/main/java/org/zstack/header/aspect/OwnedByAccountAspect.aj b/header/src/main/java/org/zstack/header/aspect/OwnedByAccountAspect.aj index 944c3c20229..260d8d77af8 100644 --- a/header/src/main/java/org/zstack/header/aspect/OwnedByAccountAspect.aj +++ b/header/src/main/java/org/zstack/header/aspect/OwnedByAccountAspect.aj @@ -1,44 +1,44 @@ -package org.zstack.header.aspect; - -import org.zstack.header.identity.OwnedByAccount; -import org.zstack.header.vo.ResourceVO; -import org.zstack.utils.Utils; -import org.zstack.utils.logging.CLogger; - -import javax.persistence.EntityManager; -import java.util.function.Function; - -public aspect OwnedByAccountAspect { - private static final CLogger logger = Utils.getLogger(OwnedByAccountAspect.class); - - private static Function accountUuidGetter; - - public static Function getAccountUuidGetter() { - return accountUuidGetter; - } - - public static void setAccountUuidGetter(Function accountUuidGetter) { - OwnedByAccountAspect.accountUuidGetter = accountUuidGetter; - } - - Object around(OwnedByAccount oa) : this(oa) && execution(java.lang.String OwnedByAccount+.getAccountUuid()) { - Object accountUuid = proceed(oa); - - if (accountUuid == null) { - accountUuid = accountUuidGetter.apply(((ResourceVO) oa).getUuid()); - } - - return accountUuid; - } - - after(EntityManager mgr, Object entity) : call(void EntityManager+.persist(Object)) - && target(mgr) - && args(entity) { - if (!(entity instanceof OwnedByAccount)) { - return; - } - - OwnedByAccount oa = (OwnedByAccount) entity; - OwnedByAccountAspectHelper.createAccountResourceRefVO(oa, mgr, entity); - } -} \ No newline at end of file +package org.zstack.header.aspect; + +import org.zstack.header.identity.OwnedByAccount; +import org.zstack.header.vo.ResourceVO; +import org.zstack.utils.Utils; +import org.zstack.utils.logging.CLogger; + +import javax.persistence.EntityManager; +import java.util.function.Function; + +public aspect OwnedByAccountAspect { + private static final CLogger logger = Utils.getLogger(OwnedByAccountAspect.class); + + private static Function accountUuidGetter; + + public static Function getAccountUuidGetter() { + return accountUuidGetter; + } + + public static void setAccountUuidGetter(Function accountUuidGetter) { + OwnedByAccountAspect.accountUuidGetter = accountUuidGetter; + } + + Object around(OwnedByAccount oa) : this(oa) && execution(java.lang.String OwnedByAccount+.getAccountUuid()) { + Object accountUuid = proceed(oa); + + if (accountUuid == null) { + accountUuid = accountUuidGetter.apply(((ResourceVO) oa).getUuid()); + } + + return accountUuid; + } + + after(EntityManager mgr, Object entity) : call(void EntityManager+.persist(Object)) + && target(mgr) + && args(entity) { + if (!(entity instanceof OwnedByAccount)) { + return; + } + + OwnedByAccount oa = (OwnedByAccount) entity; + OwnedByAccountAspectHelper.createAccountResourceRefVO(oa, mgr, entity); + } +} diff --git a/header/src/main/java/org/zstack/header/core/encrypt/EncryptionIntegrityInventory.java b/header/src/main/java/org/zstack/header/core/encrypt/EncryptionIntegrityInventory.java index 5d2aa5f5ef6..695684e2187 100644 --- a/header/src/main/java/org/zstack/header/core/encrypt/EncryptionIntegrityInventory.java +++ b/header/src/main/java/org/zstack/header/core/encrypt/EncryptionIntegrityInventory.java @@ -2,7 +2,6 @@ import org.zstack.header.configuration.PythonClassInventory; import org.zstack.header.search.Inventory; -import sun.awt.PlatformFont; import java.io.Serializable; import java.sql.Timestamp; diff --git a/header/src/main/java/org/zstack/header/core/workflow/CheckFlow.java b/header/src/main/java/org/zstack/header/core/workflow/CheckFlow.java index 2999ca32209..09cdae37476 100644 --- a/header/src/main/java/org/zstack/header/core/workflow/CheckFlow.java +++ b/header/src/main/java/org/zstack/header/core/workflow/CheckFlow.java @@ -15,7 +15,7 @@ public abstract class CheckFlow implements Flow { @Override public void run(FlowTrigger trigger, Map data) { try { - targetFlow = getTargetFlow().newInstance(); + targetFlow = getTargetFlow().getConstructor().newInstance(); } catch (Exception e){ throw new RuntimeException(e); } diff --git a/identity/pom.xml b/identity/pom.xml index 8f963f0e697..3877b727408 100755 --- a/identity/pom.xml +++ b/identity/pom.xml @@ -1,96 +1,92 @@ - - 4.0.0 - - zstack - org.zstack + + 4.0.0 + + zstack + org.zstack 5.5.0 - .. - - identity - - - org.zstack - header - ${project.version} - - - org.zstack - core - ${project.version} - - - org.zstack - utils - ${project.version} - - - org.zstack - search - ${project.version} - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - ${project.compiler.version} - - groovy-eclipse-compiler - ${project.java.version} - ${project.java.version} - lines,vars,source - true - - - - org.codehaus.groovy - groovy-eclipse-compiler - ${groovy.eclipse.compiler} - - - org.codehaus.groovy - groovy-eclipse-batch - ${groovy.eclipse.batch} - - - - - - org.codehaus.mojo - aspectj-maven-plugin - ${aspectj.plugin.version} - - - - compile - test-compile - - - - - ${project.java.version} - ${project.java.version} - ${project.java.version} - true - - - org.springframework - spring-aspects - - - org.zstack - core - - - org.zstack - header - - - - - - - + .. + + identity + + + org.zstack + header + ${project.version} + + + org.zstack + core + ${project.version} + + + org.zstack + utils + ${project.version} + + + org.zstack + search + ${project.version} + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${project.compiler.version} + + ${project.java.version} + true + true + + + + + + org.codehaus.mojo + aspectj-maven-plugin + ${aspectj.plugin.version} + + + org.aspectj + aspectjtools + ${aspectj.version} + + + + + + compile + test-compile + + + + + ${project.java.version} + ${project.java.version} + ${project.java.version} + ${project.build.sourceEncoding} + true + + + + org.springframework + spring-aspects + + + org.zstack + core + + + org.zstack + header + + + + + + + diff --git a/identity/src/main/java/org/zstack/identity/AccountManagerImpl.java b/identity/src/main/java/org/zstack/identity/AccountManagerImpl.java index e11ee611ffe..8a411d7254b 100755 --- a/identity/src/main/java/org/zstack/identity/AccountManagerImpl.java +++ b/identity/src/main/java/org/zstack/identity/AccountManagerImpl.java @@ -426,7 +426,7 @@ private void handle(APICheckApiPermissionMsg msg) { for (String apiName : msg.getApiNames()) { try { Class apiClass = Class.forName(apiName); - APIMessage api = (APIMessage) apiClass.newInstance(); + APIMessage api = (APIMessage) apiClass.getConstructor().newInstance(); api.setSession(session); try { diff --git a/image/pom.xml b/image/pom.xml index 63bdc6a064f..6ad08850719 100755 --- a/image/pom.xml +++ b/image/pom.xml @@ -1,115 +1,111 @@ - - 4.0.0 - - zstack - org.zstack + + 4.0.0 + + zstack + org.zstack 5.5.0 - .. - - image - - - - org.zstack - core - ${project.version} - - - org.zstack - utils - ${project.version} - - - org.zstack - search - ${project.version} - - - org.zstack - identity - ${project.version} - - - org.zstack - header - ${project.version} - - - org.zstack - tag - ${project.version} - - - org.zstack - compute - ${project.version} - - - org.zstack - longjob - ${project.version} - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - ${project.compiler.version} - - groovy-eclipse-compiler - ${project.java.version} - ${project.java.version} - lines,vars,source - true - - - - org.codehaus.groovy - groovy-eclipse-compiler - ${groovy.eclipse.compiler} - - - org.codehaus.groovy - groovy-eclipse-batch - ${groovy.eclipse.batch} - - - - - org.codehaus.mojo - aspectj-maven-plugin - ${aspectj.plugin.version} - - - - compile - test-compile - - - - - ${project.java.version} - ${project.java.version} - ${project.java.version} - true - - - org.springframework - spring-aspects - - - org.zstack - core - - - org.zstack - header - - - - - - - + .. + + image + + + + org.zstack + core + ${project.version} + + + org.zstack + utils + ${project.version} + + + org.zstack + search + ${project.version} + + + org.zstack + identity + ${project.version} + + + org.zstack + header + ${project.version} + + + org.zstack + tag + ${project.version} + + + org.zstack + compute + ${project.version} + + + org.zstack + longjob + ${project.version} + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${project.compiler.version} + + ${project.java.version} + true + true + + + + + org.codehaus.mojo + aspectj-maven-plugin + ${aspectj.plugin.version} + + + org.aspectj + aspectjtools + ${aspectj.version} + + + + + + compile + test-compile + + + + + ${project.java.version} + ${project.java.version} + ${project.java.version} + ${project.build.sourceEncoding} + true + + + + org.springframework + spring-aspects + + + org.zstack + core + + + org.zstack + header + + + + + + + diff --git a/image/src/main/java/org/zstack/image/ImageManagerImpl.java b/image/src/main/java/org/zstack/image/ImageManagerImpl.java index 08e8b92a552..16736fa4e2e 100755 --- a/image/src/main/java/org/zstack/image/ImageManagerImpl.java +++ b/image/src/main/java/org/zstack/image/ImageManagerImpl.java @@ -75,7 +75,6 @@ import javax.persistence.Tuple; import javax.persistence.TypedQuery; -import javax.xml.ws.ResponseWrapper; import java.net.URI; import java.net.URISyntaxException; import java.sql.Timestamp; diff --git a/longjob/pom.xml b/longjob/pom.xml index 3006e2f90a4..3594448f78b 100755 --- a/longjob/pom.xml +++ b/longjob/pom.xml @@ -1,110 +1,106 @@ - - 4.0.0 - - zstack - org.zstack + + 4.0.0 + + zstack + org.zstack 5.5.0 - .. - - longjob - - - - org.zstack - core - ${project.version} - - - org.zstack - utils - ${project.version} - - - org.zstack - search - ${project.version} - - - org.zstack - identity - ${project.version} - - - org.zstack - header - ${project.version} - - - org.zstack - tag - ${project.version} - - - org.zstack - portal - ${project.version} - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - ${project.compiler.version} - - groovy-eclipse-compiler - ${project.java.version} - ${project.java.version} - lines,vars,source - true - - - - org.codehaus.groovy - groovy-eclipse-compiler - ${groovy.eclipse.compiler} - - - org.codehaus.groovy - groovy-eclipse-batch - ${groovy.eclipse.batch} - - - - - org.codehaus.mojo - aspectj-maven-plugin - ${aspectj.plugin.version} - - - - compile - test-compile - - - - - ${project.java.version} - ${project.java.version} - ${project.java.version} - true - - - org.springframework - spring-aspects - - - org.zstack - core - - - org.zstack - header - - - - - - - + .. + + longjob + + + + org.zstack + core + ${project.version} + + + org.zstack + utils + ${project.version} + + + org.zstack + search + ${project.version} + + + org.zstack + identity + ${project.version} + + + org.zstack + header + ${project.version} + + + org.zstack + tag + ${project.version} + + + org.zstack + portal + ${project.version} + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${project.compiler.version} + + ${project.java.version} + true + true + + + + + org.codehaus.mojo + aspectj-maven-plugin + ${aspectj.plugin.version} + + + org.aspectj + aspectjtools + ${aspectj.version} + + + + + + compile + test-compile + + + + + ${project.java.version} + ${project.java.version} + ${project.java.version} + ${project.build.sourceEncoding} + true + + + + org.springframework + spring-aspects + + + org.zstack + core + + + org.zstack + header + + + + + + + diff --git a/longjob/src/main/java/org/zstack/longjob/LongJobFactoryImpl.java b/longjob/src/main/java/org/zstack/longjob/LongJobFactoryImpl.java index bf73119e693..50d5c7244e5 100755 --- a/longjob/src/main/java/org/zstack/longjob/LongJobFactoryImpl.java +++ b/longjob/src/main/java/org/zstack/longjob/LongJobFactoryImpl.java @@ -10,6 +10,7 @@ import org.zstack.utils.Utils; import org.zstack.utils.logging.CLogger; +import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.HashSet; import java.util.Set; @@ -50,8 +51,8 @@ public boolean start() { for (Class it : longJobClasses) { LongJobFor at = (LongJobFor) it.getAnnotation(LongJobFor.class); try { - job = (LongJob) it.newInstance(); - } catch (InstantiationException | IllegalAccessException e) { + job = (LongJob) it.getConstructor().newInstance(); + } catch (InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) { e.printStackTrace(); } if (null == job) { diff --git a/longjob/src/main/java/org/zstack/longjob/LongJobManagerImpl.java b/longjob/src/main/java/org/zstack/longjob/LongJobManagerImpl.java index 549d2c5d043..02ef7accfff 100755 --- a/longjob/src/main/java/org/zstack/longjob/LongJobManagerImpl.java +++ b/longjob/src/main/java/org/zstack/longjob/LongJobManagerImpl.java @@ -45,6 +45,7 @@ import org.zstack.utils.logging.CLogger; import javax.persistence.Tuple; +import java.lang.reflect.InvocationTargetException; import java.sql.SQLNonTransientConnectionException; import java.sql.Timestamp; import java.time.LocalDateTime; @@ -997,8 +998,8 @@ public Long getApiTimeout() { private long getMessageTimeout(Class clz) { try { - return timeoutMgr.getMessageTimeout(clz.newInstance()); - } catch (InstantiationException | IllegalAccessException e) { + return timeoutMgr.getMessageTimeout(clz.getConstructor().newInstance()); + } catch (InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) { throw new CloudRuntimeException(e); } } diff --git a/network/pom.xml b/network/pom.xml index d51e13e2245..47e27bd3362 100755 --- a/network/pom.xml +++ b/network/pom.xml @@ -1,109 +1,105 @@ - - 4.0.0 - - zstack - org.zstack + + 4.0.0 + + zstack + org.zstack 5.5.0 - .. - - network - - - org.zstack - core - ${project.version} - - - org.zstack - utils - ${project.version} - - - org.zstack - search - ${project.version} - - - org.zstack - identity - ${project.version} - - - org.zstack - header - ${project.version} - - - org.zstack - tag - ${project.version} - - - org.zstack - resourceconfig - ${project.version} - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - ${project.compiler.version} - - groovy-eclipse-compiler - ${project.java.version} - ${project.java.version} - lines,vars,source - true - - - - org.codehaus.groovy - groovy-eclipse-compiler - ${groovy.eclipse.compiler} - - - org.codehaus.groovy - groovy-eclipse-batch - ${groovy.eclipse.batch} - - - - - org.codehaus.mojo - aspectj-maven-plugin - ${aspectj.plugin.version} - - - - compile - test-compile - - - - - ${project.java.version} - ${project.java.version} - ${project.java.version} - true - - - org.springframework - spring-aspects - - - org.zstack - core - - - org.zstack - header - - - - - - - + .. + + network + + + org.zstack + core + ${project.version} + + + org.zstack + utils + ${project.version} + + + org.zstack + search + ${project.version} + + + org.zstack + identity + ${project.version} + + + org.zstack + header + ${project.version} + + + org.zstack + tag + ${project.version} + + + org.zstack + resourceconfig + ${project.version} + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${project.compiler.version} + + ${project.java.version} + true + true + + + + + org.codehaus.mojo + aspectj-maven-plugin + ${aspectj.plugin.version} + + + org.aspectj + aspectjtools + ${aspectj.version} + + + + + + compile + test-compile + + + + + ${project.java.version} + ${project.java.version} + ${project.java.version} + ${project.build.sourceEncoding} + true + + + + org.springframework + spring-aspects + + + org.zstack + core + + + org.zstack + header + + + + + + + diff --git a/plugin/acl/pom.xml b/plugin/acl/pom.xml index 9653ec4e982..a616caab80c 100644 --- a/plugin/acl/pom.xml +++ b/plugin/acl/pom.xml @@ -25,29 +25,42 @@ maven-compiler-plugin ${project.compiler.version} - groovy-eclipse-compiler - ${project.java.version} - ${project.java.version} - lines,vars,source + ${project.java.version} true + true + + + + + + org.codehaus.gmavenplus + gmavenplus-plugin + 4.2.1 + + + + generateStubs + compile + + + + + ${groovy.version} + ${project.java.version} - - - org.codehaus.groovy - groovy-eclipse-compiler - ${groovy.eclipse.compiler} - - - org.codehaus.groovy - groovy-eclipse-batch - ${groovy.eclipse.batch} - - + org.codehaus.mojo aspectj-maven-plugin ${aspectj.plugin.version} + + + org.aspectj + aspectjtools + ${aspectj.version} + + @@ -57,10 +70,12 @@ + ${project.java.version} ${project.java.version} ${project.java.version} - ${project.java.version} - true + ${project.build.sourceEncoding} + true + org.springframework diff --git a/plugin/applianceVm/pom.xml b/plugin/applianceVm/pom.xml index 72613eb9881..2dbb8230d45 100755 --- a/plugin/applianceVm/pom.xml +++ b/plugin/applianceVm/pom.xml @@ -36,29 +36,41 @@ maven-compiler-plugin ${project.compiler.version} - groovy-eclipse-compiler - ${project.java.version} - ${project.java.version} - lines,vars,source + ${project.java.version} true + true - - - org.codehaus.groovy - groovy-eclipse-compiler - ${groovy.eclipse.compiler} - - - org.codehaus.groovy - groovy-eclipse-batch - ${groovy.eclipse.batch} - - + + + org.codehaus.gmavenplus + gmavenplus-plugin + 4.2.1 + + + + generateStubs + compile + + + + + ${groovy.version} + ${project.java.version} + + + org.codehaus.mojo aspectj-maven-plugin ${aspectj.plugin.version} + + + org.aspectj + aspectjtools + ${aspectj.version} + + @@ -68,10 +80,12 @@ + ${project.java.version} ${project.java.version} ${project.java.version} - ${project.java.version} - true + ${project.build.sourceEncoding} + true + org.springframework diff --git a/plugin/cbd/pom.xml b/plugin/cbd/pom.xml index 119a099cab4..62bfdc7e637 100644 --- a/plugin/cbd/pom.xml +++ b/plugin/cbd/pom.xml @@ -36,29 +36,41 @@ maven-compiler-plugin ${project.compiler.version} - groovy-eclipse-compiler - ${project.java.version} - ${project.java.version} - lines,vars,source + ${project.java.version} true + true - - - org.codehaus.groovy - groovy-eclipse-compiler - ${groovy.eclipse.compiler} - - - org.codehaus.groovy - groovy-eclipse-batch - ${groovy.eclipse.batch} - - + + + org.codehaus.gmavenplus + gmavenplus-plugin + 4.2.1 + + + + generateStubs + compile + + + + + ${groovy.version} + ${project.java.version} + + + org.codehaus.mojo aspectj-maven-plugin ${aspectj.plugin.version} + + + org.aspectj + aspectjtools + ${aspectj.version} + + @@ -68,10 +80,12 @@ + ${project.java.version} ${project.java.version} ${project.java.version} - ${project.java.version} - true + ${project.build.sourceEncoding} + true + org.springframework diff --git a/plugin/ceph/pom.xml b/plugin/ceph/pom.xml index 6370dc22be9..4112cd22fb4 100755 --- a/plugin/ceph/pom.xml +++ b/plugin/ceph/pom.xml @@ -35,29 +35,42 @@ maven-compiler-plugin ${project.compiler.version} - groovy-eclipse-compiler - ${project.java.version} - ${project.java.version} - lines,vars,source + ${project.java.version} true + true + + + + + + org.codehaus.gmavenplus + gmavenplus-plugin + 4.2.1 + + + + generateStubs + compile + + + + + ${groovy.version} + ${project.java.version} - - - org.codehaus.groovy - groovy-eclipse-compiler - ${groovy.eclipse.compiler} - - - org.codehaus.groovy - groovy-eclipse-batch - ${groovy.eclipse.batch} - - + org.codehaus.mojo aspectj-maven-plugin ${aspectj.plugin.version} + + + org.aspectj + aspectjtools + ${aspectj.version} + + @@ -67,10 +80,12 @@ + ${project.java.version} ${project.java.version} ${project.java.version} - ${project.java.version} - true + ${project.build.sourceEncoding} + true + org.springframework diff --git a/plugin/directory/pom.xml b/plugin/directory/pom.xml index ae7c46506f2..cec8db61681 100644 --- a/plugin/directory/pom.xml +++ b/plugin/directory/pom.xml @@ -18,29 +18,42 @@ maven-compiler-plugin ${project.compiler.version} - groovy-eclipse-compiler - ${project.java.version} - ${project.java.version} - lines,vars,source + ${project.java.version} true + true + + + + + + org.codehaus.gmavenplus + gmavenplus-plugin + 4.2.1 + + + + generateStubs + compile + + + + + ${groovy.version} + ${project.java.version} - - - org.codehaus.groovy - groovy-eclipse-compiler - ${groovy.eclipse.compiler} - - - org.codehaus.groovy - groovy-eclipse-batch - ${groovy.eclipse.batch} - - + org.codehaus.mojo aspectj-maven-plugin ${aspectj.plugin.version} + + + org.aspectj + aspectjtools + ${aspectj.version} + + @@ -50,10 +63,12 @@ + ${project.java.version} ${project.java.version} ${project.java.version} - ${project.java.version} - true + ${project.build.sourceEncoding} + true + org.springframework diff --git a/plugin/eip/pom.xml b/plugin/eip/pom.xml index 3102f1b8735..89926e8181a 100755 --- a/plugin/eip/pom.xml +++ b/plugin/eip/pom.xml @@ -36,29 +36,41 @@ maven-compiler-plugin ${project.compiler.version} - groovy-eclipse-compiler - ${project.java.version} - ${project.java.version} - lines,vars,source + ${project.java.version} true + true - - - org.codehaus.groovy - groovy-eclipse-compiler - ${groovy.eclipse.compiler} - - - org.codehaus.groovy - groovy-eclipse-batch - ${groovy.eclipse.batch} - - + + + org.codehaus.gmavenplus + gmavenplus-plugin + 4.2.1 + + + + generateStubs + compile + + + + + ${groovy.version} + ${project.java.version} + + + org.codehaus.mojo aspectj-maven-plugin ${aspectj.plugin.version} + + + org.aspectj + aspectjtools + ${aspectj.version} + + @@ -68,10 +80,12 @@ + ${project.java.version} ${project.java.version} ${project.java.version} - ${project.java.version} - true + ${project.build.sourceEncoding} + true + org.springframework diff --git a/plugin/expon/pom.xml b/plugin/expon/pom.xml index 316de64b651..2fbc0a59a2f 100644 --- a/plugin/expon/pom.xml +++ b/plugin/expon/pom.xml @@ -51,29 +51,41 @@ maven-compiler-plugin ${project.compiler.version} - groovy-eclipse-compiler - ${project.java.version} - ${project.java.version} - lines,vars,source + ${project.java.version} true + true - - - org.codehaus.groovy - groovy-eclipse-compiler - ${groovy.eclipse.compiler} - - - org.codehaus.groovy - groovy-eclipse-batch - ${groovy.eclipse.batch} - - + + + org.codehaus.gmavenplus + gmavenplus-plugin + 4.2.1 + + + + generateStubs + compile + + + + + ${groovy.version} + ${project.java.version} + + + org.codehaus.mojo aspectj-maven-plugin ${aspectj.plugin.version} + + + org.aspectj + aspectjtools + ${aspectj.version} + + @@ -83,10 +95,12 @@ + ${project.java.version} ${project.java.version} ${project.java.version} - ${project.java.version} - true + ${project.build.sourceEncoding} + true + org.springframework diff --git a/plugin/externalStorage/pom.xml b/plugin/externalStorage/pom.xml index cd633512dd1..4fd06dd3004 100644 --- a/plugin/externalStorage/pom.xml +++ b/plugin/externalStorage/pom.xml @@ -29,29 +29,41 @@ maven-compiler-plugin ${project.compiler.version} - groovy-eclipse-compiler - ${project.java.version} - ${project.java.version} - lines,vars,source + ${project.java.version} true + true - - - org.codehaus.groovy - groovy-eclipse-compiler - ${groovy.eclipse.compiler} - - - org.codehaus.groovy - groovy-eclipse-batch - ${groovy.eclipse.batch} - - + + + org.codehaus.gmavenplus + gmavenplus-plugin + 4.2.1 + + + + generateStubs + compile + + + + + ${groovy.version} + ${project.java.version} + + + org.codehaus.mojo aspectj-maven-plugin ${aspectj.plugin.version} + + + org.aspectj + aspectjtools + ${aspectj.version} + + @@ -61,10 +73,11 @@ + ${project.java.version} ${project.java.version} ${project.java.version} - ${project.java.version} - true + ${project.build.sourceEncoding} + true org.springframework diff --git a/plugin/flatNetworkProvider/pom.xml b/plugin/flatNetworkProvider/pom.xml index 788c095401b..a5908c22a5f 100755 --- a/plugin/flatNetworkProvider/pom.xml +++ b/plugin/flatNetworkProvider/pom.xml @@ -40,29 +40,41 @@ maven-compiler-plugin ${project.compiler.version} - groovy-eclipse-compiler - ${project.java.version} - ${project.java.version} - lines,vars,source + ${project.java.version} true + true - - - org.codehaus.groovy - groovy-eclipse-compiler - ${groovy.eclipse.compiler} - - - org.codehaus.groovy - groovy-eclipse-batch - ${groovy.eclipse.batch} - - + + + org.codehaus.gmavenplus + gmavenplus-plugin + 4.2.1 + + + + generateStubs + compile + + + + + ${groovy.version} + ${project.java.version} + + + org.codehaus.mojo aspectj-maven-plugin ${aspectj.plugin.version} + + + org.aspectj + aspectjtools + ${aspectj.version} + + @@ -72,10 +84,12 @@ + ${project.java.version} ${project.java.version} ${project.java.version} - ${project.java.version} - true + ${project.build.sourceEncoding} + true + org.springframework diff --git a/plugin/hostNetworkInterface/pom.xml b/plugin/hostNetworkInterface/pom.xml index 9519574c0fe..21630b0523a 100644 --- a/plugin/hostNetworkInterface/pom.xml +++ b/plugin/hostNetworkInterface/pom.xml @@ -50,29 +50,41 @@ maven-compiler-plugin ${project.compiler.version} - groovy-eclipse-compiler - ${project.java.version} - ${project.java.version} - lines,vars,source + ${project.java.version} true + true - - - org.codehaus.groovy - groovy-eclipse-compiler - ${groovy.eclipse.compiler} - - - org.codehaus.groovy - groovy-eclipse-batch - ${groovy.eclipse.batch} - - + + + org.codehaus.gmavenplus + gmavenplus-plugin + 4.2.1 + + + + generateStubs + compile + + + + + ${groovy.version} + ${project.java.version} + + + org.codehaus.mojo aspectj-maven-plugin ${aspectj.plugin.version} + + + org.aspectj + aspectjtools + ${aspectj.version} + + @@ -82,10 +94,12 @@ + ${project.java.version} ${project.java.version} ${project.java.version} - ${project.java.version} - true + ${project.build.sourceEncoding} + true + org.springframework diff --git a/plugin/iscsi/pom.xml b/plugin/iscsi/pom.xml index 46dd095fe15..e276012c778 100644 --- a/plugin/iscsi/pom.xml +++ b/plugin/iscsi/pom.xml @@ -35,29 +35,41 @@ maven-compiler-plugin ${project.compiler.version} - groovy-eclipse-compiler - ${project.java.version} - ${project.java.version} - lines,vars,source + ${project.java.version} true + true - - - org.codehaus.groovy - groovy-eclipse-compiler - ${groovy.eclipse.compiler} - - - org.codehaus.groovy - groovy-eclipse-batch - ${groovy.eclipse.batch} - - + + + org.codehaus.gmavenplus + gmavenplus-plugin + 4.2.1 + + + + generateStubs + compile + + + + + ${groovy.version} + ${project.java.version} + + + org.codehaus.mojo aspectj-maven-plugin ${aspectj.plugin.version} + + + org.aspectj + aspectjtools + ${aspectj.version} + + @@ -67,10 +79,12 @@ + ${project.java.version} ${project.java.version} ${project.java.version} - ${project.java.version} - true + ${project.build.sourceEncoding} + true + org.springframework diff --git a/plugin/kvm/pom.xml b/plugin/kvm/pom.xml index 73e4c81afe3..0a32d04e9f0 100755 --- a/plugin/kvm/pom.xml +++ b/plugin/kvm/pom.xml @@ -1,100 +1,115 @@ - - 4.0.0 - - plugin - org.zstack + + 4.0.0 + + plugin + org.zstack 5.5.0 - .. - - kvm - - - org.zstack - compute - ${project.version} - - - org.zstack - securityGroup - ${project.version} - - - org.zstack - console - ${project.version} - - - org.zstack - resourceconfig - ${project.version} - - - org.apache.maven - maven-artifact - 3.0.5 - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - ${project.compiler.version} - - groovy-eclipse-compiler - ${project.java.version} - ${project.java.version} - lines,vars,source - true - - - - org.codehaus.groovy - groovy-eclipse-compiler - ${groovy.eclipse.compiler} - - - org.codehaus.groovy - groovy-eclipse-batch - ${groovy.eclipse.batch} - - - - - org.codehaus.mojo - aspectj-maven-plugin - ${aspectj.plugin.version} - - - - compile - test-compile - - - - - ${project.java.version} - ${project.java.version} - ${project.java.version} - true - - - org.springframework - spring-aspects - - - org.zstack - core - - - org.zstack - header - - - - - - - + .. + + kvm + + + org.zstack + compute + ${project.version} + + + org.zstack + securityGroup + ${project.version} + + + org.zstack + console + ${project.version} + + + org.zstack + resourceconfig + ${project.version} + + + org.apache.maven + maven-artifact + 3.0.5 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${project.compiler.version} + + ${project.java.version} + true + true + + + + + + org.codehaus.gmavenplus + gmavenplus-plugin + 4.2.1 + + + + generateStubs + compile + + + + + ${groovy.version} + ${project.java.version} + + + + + org.codehaus.mojo + aspectj-maven-plugin + ${aspectj.plugin.version} + + + org.aspectj + aspectjtools + ${aspectj.version} + + + + + + compile + test-compile + + + + + ${project.java.version} + ${project.java.version} + ${project.java.version} + ${project.build.sourceEncoding} + true + + + + org.springframework + spring-aspects + + + org.zstack + core + + + org.zstack + header + + + + + + + diff --git a/plugin/ldap/pom.xml b/plugin/ldap/pom.xml index dd2b61b30f1..7f9ca9d6cd8 100755 --- a/plugin/ldap/pom.xml +++ b/plugin/ldap/pom.xml @@ -18,29 +18,41 @@ maven-compiler-plugin ${project.compiler.version} - groovy-eclipse-compiler - ${project.java.version} - ${project.java.version} - lines,vars,source + ${project.java.version} true + true - - - org.codehaus.groovy - groovy-eclipse-compiler - ${groovy.eclipse.compiler} - - - org.codehaus.groovy - groovy-eclipse-batch - ${groovy.eclipse.batch} - - + + + org.codehaus.gmavenplus + gmavenplus-plugin + 4.2.1 + + + + generateStubs + compile + + + + + ${groovy.version} + ${project.java.version} + + + org.codehaus.mojo aspectj-maven-plugin ${aspectj.plugin.version} + + + org.aspectj + aspectjtools + ${aspectj.version} + + @@ -50,10 +62,12 @@ + ${project.java.version} ${project.java.version} ${project.java.version} - ${project.java.version} - true + ${project.build.sourceEncoding} + true + org.springframework diff --git a/plugin/loadBalancer/pom.xml b/plugin/loadBalancer/pom.xml index c16119dec18..beac6c0d4b4 100755 --- a/plugin/loadBalancer/pom.xml +++ b/plugin/loadBalancer/pom.xml @@ -41,29 +41,41 @@ maven-compiler-plugin ${project.compiler.version} - groovy-eclipse-compiler - ${project.java.version} - ${project.java.version} - lines,vars,source + ${project.java.version} true + true - - - org.codehaus.groovy - groovy-eclipse-compiler - ${groovy.eclipse.compiler} - - - org.codehaus.groovy - groovy-eclipse-batch - ${groovy.eclipse.batch} - - + + + org.codehaus.gmavenplus + gmavenplus-plugin + 4.2.1 + + + + generateStubs + compile + + + + + ${groovy.version} + ${project.java.version} + + + org.codehaus.mojo aspectj-maven-plugin ${aspectj.plugin.version} + + + org.aspectj + aspectjtools + ${aspectj.version} + + @@ -73,10 +85,12 @@ + ${project.java.version} ${project.java.version} ${project.java.version} - ${project.java.version} - true + ${project.build.sourceEncoding} + true + org.springframework diff --git a/plugin/localstorage/pom.xml b/plugin/localstorage/pom.xml index 24bb83bd960..f41b76f70e6 100755 --- a/plugin/localstorage/pom.xml +++ b/plugin/localstorage/pom.xml @@ -35,29 +35,41 @@ maven-compiler-plugin ${project.compiler.version} - groovy-eclipse-compiler - ${project.java.version} - ${project.java.version} - lines,vars,source + ${project.java.version} true + true - - - org.codehaus.groovy - groovy-eclipse-compiler - ${groovy.eclipse.compiler} - - - org.codehaus.groovy - groovy-eclipse-batch - ${groovy.eclipse.batch} - - + + + org.codehaus.gmavenplus + gmavenplus-plugin + 4.2.1 + + + + generateStubs + compile + + + + + ${groovy.version} + ${project.java.version} + + + org.codehaus.mojo aspectj-maven-plugin ${aspectj.plugin.version} + + + org.aspectj + aspectjtools + ${aspectj.version} + + @@ -67,10 +79,12 @@ + ${project.java.version} ${project.java.version} ${project.java.version} - ${project.java.version} - true + ${project.build.sourceEncoding} + true + org.springframework diff --git a/plugin/loginPlugin/pom.xml b/plugin/loginPlugin/pom.xml index 7b58aa30f8a..b0dc2777003 100644 --- a/plugin/loginPlugin/pom.xml +++ b/plugin/loginPlugin/pom.xml @@ -38,29 +38,41 @@ maven-compiler-plugin ${project.compiler.version} - groovy-eclipse-compiler - ${project.java.version} - ${project.java.version} - lines,vars,source + ${project.java.version} true + true - - - org.codehaus.groovy - groovy-eclipse-compiler - ${groovy.eclipse.compiler} - - - org.codehaus.groovy - groovy-eclipse-batch - ${groovy.eclipse.batch} - - + + + org.codehaus.gmavenplus + gmavenplus-plugin + 4.2.1 + + + + generateStubs + compile + + + + + ${groovy.version} + ${project.java.version} + + + org.codehaus.mojo aspectj-maven-plugin ${aspectj.plugin.version} + + + org.aspectj + aspectjtools + ${aspectj.version} + + @@ -70,10 +82,12 @@ + ${project.java.version} ${project.java.version} ${project.java.version} - ${project.java.version} - true + ${project.build.sourceEncoding} + true + org.springframework diff --git a/plugin/mediator/pom.xml b/plugin/mediator/pom.xml index ea2e6d03ebf..37571225c49 100755 --- a/plugin/mediator/pom.xml +++ b/plugin/mediator/pom.xml @@ -46,29 +46,41 @@ maven-compiler-plugin ${project.compiler.version} - groovy-eclipse-compiler - ${project.java.version} - ${project.java.version} - lines,vars,source + ${project.java.version} true + true - - - org.codehaus.groovy - groovy-eclipse-compiler - ${groovy.eclipse.compiler} - - - org.codehaus.groovy - groovy-eclipse-batch - ${groovy.eclipse.batch} - - + + + org.codehaus.gmavenplus + gmavenplus-plugin + 4.2.1 + + + + generateStubs + compile + + + + + ${groovy.version} + ${project.java.version} + + + org.codehaus.mojo aspectj-maven-plugin ${aspectj.plugin.version} + + + org.aspectj + aspectjtools + ${aspectj.version} + + @@ -78,10 +90,12 @@ + ${project.java.version} ${project.java.version} ${project.java.version} - ${project.java.version} - true + ${project.build.sourceEncoding} + true + org.springframework diff --git a/plugin/nfsPrimaryStorage/pom.xml b/plugin/nfsPrimaryStorage/pom.xml index 36bb5f3fcc5..4222e643031 100755 --- a/plugin/nfsPrimaryStorage/pom.xml +++ b/plugin/nfsPrimaryStorage/pom.xml @@ -1,90 +1,104 @@ - - 4.0.0 - - plugin - org.zstack + + 4.0.0 + + plugin + org.zstack 5.5.0 - .. - - nfsPrimaryStorage - - - org.zstack - kvm - ${project.version} - - - org.zstack - sftpBackupStorage - ${project.version} - - - org.zstack - storage - ${project.version} - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - ${project.compiler.version} - - groovy-eclipse-compiler - ${project.java.version} - ${project.java.version} - lines,vars,source - true - - - - org.codehaus.groovy - groovy-eclipse-compiler - ${groovy.eclipse.compiler} - - - org.codehaus.groovy - groovy-eclipse-batch - ${groovy.eclipse.batch} - - - - - org.codehaus.mojo - aspectj-maven-plugin - ${aspectj.plugin.version} - - - - compile - test-compile - - - - - ${project.java.version} - ${project.java.version} - ${project.java.version} - true - - - org.springframework - spring-aspects - - - org.zstack - core - - - org.zstack - header - - - - - - - + .. + + nfsPrimaryStorage + + + org.zstack + kvm + ${project.version} + + + org.zstack + sftpBackupStorage + ${project.version} + + + org.zstack + storage + ${project.version} + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${project.compiler.version} + + ${project.java.version} + true + true + + + + + org.codehaus.gmavenplus + gmavenplus-plugin + 4.2.1 + + + + generateStubs + compile + + + + + ${groovy.version} + ${project.java.version} + + + + + org.codehaus.mojo + aspectj-maven-plugin + ${aspectj.plugin.version} + + + org.aspectj + aspectjtools + ${aspectj.version} + + + + + + compile + test-compile + + + + + ${project.java.version} + ${project.java.version} + ${project.java.version} + ${project.build.sourceEncoding} + true + + + + org.springframework + spring-aspects + + + org.zstack + core + + + org.zstack + header + + + + + + + diff --git a/plugin/pom.xml b/plugin/pom.xml index 22f39138fc7..f90ff85b78a 100755 --- a/plugin/pom.xml +++ b/plugin/pom.xml @@ -1,113 +1,124 @@ - - 4.0.0 - - zstack - org.zstack + + 4.0.0 + + zstack + org.zstack 5.5.0 - .. - - plugin - pom - - nfsPrimaryStorage - kvm - sftpBackupStorage - virtualRouterProvider - securityGroup - portForwarding - applianceVm - vip - eip - mediator - localstorage - ceph - loadBalancer - flatNetworkProvider - sharedMountPointPrimaryStorage - ldap - vxlan - acl - sdnController - sugonSdnController - directory - sshKeyPair - hostNetworkInterface - vhost - expon - externalStorage - zbs - cbd - xinfini - - - - org.zstack - header - ${project.version} - - - org.zstack - core - ${project.version} - - - org.zstack - utils - ${project.version} - - - org.zstack - search - ${project.version} - - - org.zstack - identity - ${project.version} - - - org.zstack - tag - ${project.version} - - - - - - - org.codehaus.mojo - aspectj-maven-plugin - ${aspectj.plugin.version} - - - - compile - test-compile - - - - - ${project.java.version} - ${project.java.version} - ${project.java.version} - true - - - org.springframework - spring-aspects - - - org.zstack - core - - - org.zstack - header - - - - - - - + .. + + plugin + pom + + nfsPrimaryStorage + kvm + sftpBackupStorage + virtualRouterProvider + securityGroup + portForwarding + applianceVm + vip + eip + mediator + localstorage + ceph + loadBalancer + flatNetworkProvider + sharedMountPointPrimaryStorage + ldap + vxlan + acl + sdnController + sugonSdnController + directory + sshKeyPair + hostNetworkInterface + vhost + expon + externalStorage + zbs + cbd + xinfini + + + + org.zstack + header + ${project.version} + + + org.zstack + core + ${project.version} + + + org.zstack + utils + ${project.version} + + + org.zstack + search + ${project.version} + + + org.zstack + identity + ${project.version} + + + org.zstack + tag + ${project.version} + + + + + + + + org.codehaus.mojo + aspectj-maven-plugin + ${aspectj.plugin.version} + + + org.aspectj + aspectjtools + ${aspectj.version} + + + + + + compile + test-compile + + + + + ${project.java.version} + ${project.java.version} + ${project.java.version} + ${project.build.sourceEncoding} + true + + none + + + org.springframework + spring-aspects + + + org.zstack + core + + + org.zstack + header + + + + + + + diff --git a/plugin/portForwarding/pom.xml b/plugin/portForwarding/pom.xml index 114f0dfd147..32031bdd136 100755 --- a/plugin/portForwarding/pom.xml +++ b/plugin/portForwarding/pom.xml @@ -33,29 +33,41 @@ maven-compiler-plugin ${project.compiler.version} - groovy-eclipse-compiler - ${project.java.version} - ${project.java.version} - lines,vars,source + ${project.java.version} true + true - - - org.codehaus.groovy - groovy-eclipse-compiler - ${groovy.eclipse.compiler} - - - org.codehaus.groovy - groovy-eclipse-batch - ${groovy.eclipse.batch} - - + + + org.codehaus.gmavenplus + gmavenplus-plugin + 4.2.1 + + + + generateStubs + compile + + + + + ${groovy.version} + ${project.java.version} + + + org.codehaus.mojo aspectj-maven-plugin ${aspectj.plugin.version} + + + org.aspectj + aspectjtools + ${aspectj.version} + + @@ -65,10 +77,12 @@ + ${project.java.version} ${project.java.version} ${project.java.version} - ${project.java.version} - true + ${project.build.sourceEncoding} + true + org.springframework diff --git a/plugin/sdnController/pom.xml b/plugin/sdnController/pom.xml index 68773594b02..68354c926f1 100644 --- a/plugin/sdnController/pom.xml +++ b/plugin/sdnController/pom.xml @@ -56,29 +56,41 @@ maven-compiler-plugin ${project.compiler.version} - groovy-eclipse-compiler - ${project.java.version} - ${project.java.version} - lines,vars,source + ${project.java.version} true + true - - - org.codehaus.groovy - groovy-eclipse-compiler - ${groovy.eclipse.compiler} - - - org.codehaus.groovy - groovy-eclipse-batch - ${groovy.eclipse.batch} - - + + + org.codehaus.gmavenplus + gmavenplus-plugin + 4.2.1 + + + + generateStubs + compile + + + + + ${groovy.version} + ${project.java.version} + + + org.codehaus.mojo aspectj-maven-plugin ${aspectj.plugin.version} + + + org.aspectj + aspectjtools + ${aspectj.version} + + @@ -88,10 +100,12 @@ + ${project.java.version} ${project.java.version} ${project.java.version} - ${project.java.version} - true + ${project.build.sourceEncoding} + true + org.springframework diff --git a/plugin/securityGroup/pom.xml b/plugin/securityGroup/pom.xml index 35211774744..1cb943a9762 100755 --- a/plugin/securityGroup/pom.xml +++ b/plugin/securityGroup/pom.xml @@ -1,84 +1,98 @@ - - 4.0.0 - - org.zstack - plugin + + 4.0.0 + + org.zstack + plugin 5.5.0 - - securityGroup - - - org.zstack - compute - ${project.version} - - - org.zstack - network - ${project.version} - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - ${project.compiler.version} - - groovy-eclipse-compiler - ${project.java.version} - ${project.java.version} - lines,vars,source - true - - - - org.codehaus.groovy - groovy-eclipse-compiler - ${groovy.eclipse.compiler} - - - org.codehaus.groovy - groovy-eclipse-batch - ${groovy.eclipse.batch} - - - - - org.codehaus.mojo - aspectj-maven-plugin - ${aspectj.plugin.version} - - - - compile - test-compile - - - - - ${project.java.version} - ${project.java.version} - ${project.java.version} - true - - - org.springframework - spring-aspects - - - org.zstack - core - - - org.zstack - header - - - - - - - + + securityGroup + + + org.zstack + compute + ${project.version} + + + org.zstack + network + ${project.version} + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${project.compiler.version} + + ${project.java.version} + true + true + + + + + org.codehaus.gmavenplus + gmavenplus-plugin + 4.2.1 + + + + generateStubs + compile + + + + + ${groovy.version} + ${project.java.version} + + + + + org.codehaus.mojo + aspectj-maven-plugin + ${aspectj.plugin.version} + + + org.aspectj + aspectjtools + ${aspectj.version} + + + + + + compile + test-compile + + + + + ${project.java.version} + ${project.java.version} + ${project.java.version} + ${project.build.sourceEncoding} + true + + + + org.springframework + spring-aspects + + + org.zstack + core + + + org.zstack + header + + + + + + + diff --git a/plugin/sftpBackupStorage/pom.xml b/plugin/sftpBackupStorage/pom.xml index fb467ba83b9..5a954e13435 100755 --- a/plugin/sftpBackupStorage/pom.xml +++ b/plugin/sftpBackupStorage/pom.xml @@ -1,80 +1,94 @@ - - 4.0.0 - - plugin - org.zstack + + 4.0.0 + + plugin + org.zstack 5.5.0 - .. - - sftpBackupStorage - - - org.zstack - storage - ${project.version} - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - ${project.compiler.version} - - groovy-eclipse-compiler - ${project.java.version} - ${project.java.version} - lines,vars,source - true - - - - org.codehaus.groovy - groovy-eclipse-compiler - ${groovy.eclipse.compiler} - - - org.codehaus.groovy - groovy-eclipse-batch - ${groovy.eclipse.batch} - - - - - org.codehaus.mojo - aspectj-maven-plugin - ${aspectj.plugin.version} - - - - compile - test-compile - - - - - ${project.java.version} - ${project.java.version} - ${project.java.version} - true - - - org.springframework - spring-aspects - - - org.zstack - core - - - org.zstack - header - - - - - - - + .. + + sftpBackupStorage + + + org.zstack + storage + ${project.version} + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${project.compiler.version} + + ${project.java.version} + true + true + + + + + org.codehaus.gmavenplus + gmavenplus-plugin + 4.2.1 + + + + generateStubs + compile + + + + + ${groovy.version} + ${project.java.version} + + + + + org.codehaus.mojo + aspectj-maven-plugin + ${aspectj.plugin.version} + + + org.aspectj + aspectjtools + ${aspectj.version} + + + + + + compile + test-compile + + + + + ${project.java.version} + ${project.java.version} + ${project.java.version} + ${project.build.sourceEncoding} + true + + + + org.springframework + spring-aspects + + + org.zstack + core + + + org.zstack + header + + + + + + + diff --git a/plugin/sharedMountPointPrimaryStorage/pom.xml b/plugin/sharedMountPointPrimaryStorage/pom.xml index 1f5fcef5d50..da928558385 100755 --- a/plugin/sharedMountPointPrimaryStorage/pom.xml +++ b/plugin/sharedMountPointPrimaryStorage/pom.xml @@ -36,29 +36,41 @@ maven-compiler-plugin ${project.compiler.version} - groovy-eclipse-compiler - ${project.java.version} - ${project.java.version} - lines,vars,source + ${project.java.version} true + true - - - org.codehaus.groovy - groovy-eclipse-compiler - ${groovy.eclipse.compiler} - - - org.codehaus.groovy - groovy-eclipse-batch - ${groovy.eclipse.batch} - - + + + org.codehaus.gmavenplus + gmavenplus-plugin + 4.2.1 + + + + generateStubs + compile + + + + + ${groovy.version} + ${project.java.version} + + + org.codehaus.mojo aspectj-maven-plugin ${aspectj.plugin.version} + + + org.aspectj + aspectjtools + ${aspectj.version} + + @@ -68,10 +80,12 @@ + ${project.java.version} ${project.java.version} ${project.java.version} - ${project.java.version} - true + ${project.build.sourceEncoding} + true + org.springframework diff --git a/plugin/sshKeyPair/pom.xml b/plugin/sshKeyPair/pom.xml index f73868c7fec..9c242920a7c 100644 --- a/plugin/sshKeyPair/pom.xml +++ b/plugin/sshKeyPair/pom.xml @@ -25,35 +25,44 @@ maven-compiler-plugin ${project.compiler.version} - groovy-eclipse-compiler - ${project.java.version} - ${project.java.version} - lines,vars,source + ${project.java.version} true + true - - org.codehaus.groovy - groovy-eclipse-compiler - ${groovy.eclipse.compiler} - - - org.codehaus.groovy - groovy-eclipse-batch - ${groovy.eclipse.batch} - - - com.jcraft - jsch - 0.1.55 - + + + org.codehaus.gmavenplus + gmavenplus-plugin + 4.2.1 + + + + generateStubs + compile + + + + + ${groovy.version} + ${project.java.version} + + + org.codehaus.mojo aspectj-maven-plugin ${aspectj.plugin.version} + + + org.aspectj + aspectjtools + ${aspectj.version} + + @@ -63,10 +72,12 @@ + ${project.java.version} ${project.java.version} ${project.java.version} - ${project.java.version} - true + ${project.build.sourceEncoding} + true + org.springframework diff --git a/plugin/sugonSdnController/pom.xml b/plugin/sugonSdnController/pom.xml index f9e83fa4468..13a418f7918 100644 --- a/plugin/sugonSdnController/pom.xml +++ b/plugin/sugonSdnController/pom.xml @@ -51,29 +51,41 @@ maven-compiler-plugin ${project.compiler.version} - groovy-eclipse-compiler - ${project.java.version} - ${project.java.version} - lines,vars,source + ${project.java.version} true + true - - - org.codehaus.groovy - groovy-eclipse-compiler - ${groovy.eclipse.compiler} - - - org.codehaus.groovy - groovy-eclipse-batch - ${groovy.eclipse.batch} - - + + + org.codehaus.gmavenplus + gmavenplus-plugin + 4.2.1 + + + + generateStubs + compile + + + + + ${groovy.version} + ${project.java.version} + + + org.codehaus.mojo aspectj-maven-plugin ${aspectj.plugin.version} + + + org.aspectj + aspectjtools + ${aspectj.version} + + @@ -83,10 +95,12 @@ + ${project.java.version} ${project.java.version} ${project.java.version} - ${project.java.version} - true + ${project.build.sourceEncoding} + true + org.springframework diff --git a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/api/ApiConnectorImpl.java b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/api/ApiConnectorImpl.java index ef88f3c9109..b233b2d4147 100644 --- a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/api/ApiConnectorImpl.java +++ b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/api/ApiConnectorImpl.java @@ -558,7 +558,7 @@ public String findByName(Class cls, ApiObjectBase paren name_list.addAll(parent.getQualifiedName()); } else { try { - name_list.addAll(cls.newInstance().getDefaultParent()); + name_list.addAll(cls.getConstructor().newInstance().getDefaultParent()); } catch (Exception ex) { // Instantiation or IllegalAccess s_logger.error("Failed to instantiate object of class " + cls.getName(), ex); diff --git a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/api/ApiConnectorMock.java b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/api/ApiConnectorMock.java index 8278226c4c9..91eee16e8f0 100644 --- a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/api/ApiConnectorMock.java +++ b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/api/ApiConnectorMock.java @@ -449,7 +449,7 @@ public String findByName(Class cls, ApiObjectBase paren name_list.addAll(parent.getQualifiedName()); } else { try { - name_list.addAll(cls.newInstance().getDefaultParent()); + name_list.addAll(cls.getConstructor().newInstance().getDefaultParent()); } catch (Exception e) { s_logger.warn(e.getMessage()); } diff --git a/plugin/vhost/pom.xml b/plugin/vhost/pom.xml index 2c3ae284b8c..223a189f6a6 100644 --- a/plugin/vhost/pom.xml +++ b/plugin/vhost/pom.xml @@ -31,29 +31,41 @@ maven-compiler-plugin ${project.compiler.version} - groovy-eclipse-compiler - ${project.java.version} - ${project.java.version} - lines,vars,source + ${project.java.version} true + true - - - org.codehaus.groovy - groovy-eclipse-compiler - ${groovy.eclipse.compiler} - - - org.codehaus.groovy - groovy-eclipse-batch - ${groovy.eclipse.batch} - - + + + org.codehaus.gmavenplus + gmavenplus-plugin + 4.2.1 + + + + generateStubs + compile + + + + + ${groovy.version} + ${project.java.version} + + + org.codehaus.mojo aspectj-maven-plugin ${aspectj.plugin.version} + + + org.aspectj + aspectjtools + ${aspectj.version} + + @@ -63,10 +75,12 @@ + ${project.java.version} ${project.java.version} ${project.java.version} - ${project.java.version} - true + ${project.build.sourceEncoding} + true + org.springframework diff --git a/plugin/vip/pom.xml b/plugin/vip/pom.xml index 828acd6c537..ec58d27a1f3 100755 --- a/plugin/vip/pom.xml +++ b/plugin/vip/pom.xml @@ -18,29 +18,41 @@ maven-compiler-plugin ${project.compiler.version} - groovy-eclipse-compiler - ${project.java.version} - ${project.java.version} - lines,vars,source + ${project.java.version} true + true - - - org.codehaus.groovy - groovy-eclipse-compiler - ${groovy.eclipse.compiler} - - - org.codehaus.groovy - groovy-eclipse-batch - ${groovy.eclipse.batch} - - + + + org.codehaus.gmavenplus + gmavenplus-plugin + 4.2.1 + + + + generateStubs + compile + + + + + ${groovy.version} + ${project.java.version} + + + org.codehaus.mojo aspectj-maven-plugin ${aspectj.plugin.version} + + + org.aspectj + aspectjtools + ${aspectj.version} + + @@ -50,10 +62,12 @@ + ${project.java.version} ${project.java.version} ${project.java.version} - ${project.java.version} - true + ${project.build.sourceEncoding} + true + org.springframework diff --git a/plugin/virtualRouterProvider/pom.xml b/plugin/virtualRouterProvider/pom.xml index c50ab0511cb..0631def83b3 100755 --- a/plugin/virtualRouterProvider/pom.xml +++ b/plugin/virtualRouterProvider/pom.xml @@ -1,125 +1,139 @@ - - 4.0.0 - - org.zstack - plugin + + 4.0.0 + + org.zstack + plugin 5.5.0 - - virtualRouterProvider - - - - - org.apache.maven.plugins - maven-compiler-plugin - ${project.compiler.version} - - groovy-eclipse-compiler - ${project.java.version} - ${project.java.version} - lines,vars,source - true - - - - org.codehaus.groovy - groovy-eclipse-compiler - ${groovy.eclipse.compiler} - - - org.codehaus.groovy - groovy-eclipse-batch - ${groovy.eclipse.batch} - - - - - org.codehaus.mojo - aspectj-maven-plugin - ${aspectj.plugin.version} - - - - compile - test-compile - - - - - ${project.java.version} - ${project.java.version} - ${project.java.version} - true - - - org.springframework - spring-aspects - - - org.zstack - core - - - org.zstack - header - - - - - - - - - - org.zstack - network - ${project.version} - - - org.zstack - image - ${project.version} - - - org.zstack - vip - ${project.version} - - - org.zstack - configuration - ${project.version} - - - org.zstack - compute - ${project.version} - - - org.zstack - kvm - ${project.version} - - - org.zstack - portForwarding - ${project.version} - - - org.zstack - eip - ${project.version} - - - org.zstack - applianceVm - ${project.version} - - - org.zstack - loadBalancer - ${project.version} - - - + + virtualRouterProvider + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${project.compiler.version} + + ${project.java.version} + true + true + + + + + org.codehaus.gmavenplus + gmavenplus-plugin + 4.2.1 + + + + generateStubs + compile + + + + + ${groovy.version} + ${project.java.version} + + + + + org.codehaus.mojo + aspectj-maven-plugin + ${aspectj.plugin.version} + + + org.aspectj + aspectjtools + ${aspectj.version} + + + + + + compile + test-compile + + + + + ${project.java.version} + ${project.java.version} + ${project.java.version} + ${project.build.sourceEncoding} + true + + + + org.springframework + spring-aspects + + + org.zstack + core + + + org.zstack + header + + + + + + + + + + org.zstack + network + ${project.version} + + + org.zstack + image + ${project.version} + + + org.zstack + vip + ${project.version} + + + org.zstack + configuration + ${project.version} + + + org.zstack + compute + ${project.version} + + + org.zstack + kvm + ${project.version} + + + org.zstack + portForwarding + ${project.version} + + + org.zstack + eip + ${project.version} + + + org.zstack + applianceVm + ${project.version} + + + org.zstack + loadBalancer + ${project.version} + + + diff --git a/plugin/vxlan/pom.xml b/plugin/vxlan/pom.xml index 31668f4bdcf..b749e511172 100755 --- a/plugin/vxlan/pom.xml +++ b/plugin/vxlan/pom.xml @@ -51,29 +51,41 @@ maven-compiler-plugin ${project.compiler.version} - groovy-eclipse-compiler - ${project.java.version} - ${project.java.version} - lines,vars,source + ${project.java.version} true + true - - - org.codehaus.groovy - groovy-eclipse-compiler - ${groovy.eclipse.compiler} - - - org.codehaus.groovy - groovy-eclipse-batch - ${groovy.eclipse.batch} - - + + + org.codehaus.gmavenplus + gmavenplus-plugin + 4.2.1 + + + + generateStubs + compile + + + + + ${groovy.version} + ${project.java.version} + + + org.codehaus.mojo aspectj-maven-plugin ${aspectj.plugin.version} + + + org.aspectj + aspectjtools + ${aspectj.version} + + @@ -83,10 +95,12 @@ + ${project.java.version} ${project.java.version} ${project.java.version} - ${project.java.version} - true + ${project.build.sourceEncoding} + true + org.springframework diff --git a/plugin/xinfini/pom.xml b/plugin/xinfini/pom.xml index 89c1f6c5a7d..9863edd6665 100644 --- a/plugin/xinfini/pom.xml +++ b/plugin/xinfini/pom.xml @@ -51,29 +51,41 @@ maven-compiler-plugin ${project.compiler.version} - groovy-eclipse-compiler - ${project.java.version} - ${project.java.version} - lines,vars,source + ${project.java.version} true + true - - - org.codehaus.groovy - groovy-eclipse-compiler - ${groovy.eclipse.compiler} - - - org.codehaus.groovy - groovy-eclipse-batch - ${groovy.eclipse.batch} - - + + + org.codehaus.gmavenplus + gmavenplus-plugin + 4.2.1 + + + + generateStubs + compile + + + + + ${groovy.version} + ${project.java.version} + + + org.codehaus.mojo aspectj-maven-plugin ${aspectj.plugin.version} + + + org.aspectj + aspectjtools + ${aspectj.version} + + @@ -83,10 +95,12 @@ + ${project.java.version} ${project.java.version} ${project.java.version} - ${project.java.version} - true + ${project.build.sourceEncoding} + true + org.springframework diff --git a/plugin/zbs/pom.xml b/plugin/zbs/pom.xml index 15bae057d4c..176d6e07da1 100644 --- a/plugin/zbs/pom.xml +++ b/plugin/zbs/pom.xml @@ -30,29 +30,41 @@ maven-compiler-plugin ${project.compiler.version} - groovy-eclipse-compiler - ${project.java.version} - ${project.java.version} - lines,vars,source + ${project.java.version} true + true - - - org.codehaus.groovy - groovy-eclipse-compiler - ${groovy.eclipse.compiler} - - - org.codehaus.groovy - groovy-eclipse-batch - ${groovy.eclipse.batch} - - + + + org.codehaus.gmavenplus + gmavenplus-plugin + 4.2.1 + + + + generateStubs + compile + + + + + ${groovy.version} + ${project.java.version} + + + org.codehaus.mojo aspectj-maven-plugin ${aspectj.plugin.version} + + + org.aspectj + aspectjtools + ${aspectj.version} + + @@ -62,10 +74,12 @@ + ${project.java.version} ${project.java.version} ${project.java.version} - ${project.java.version} - true + ${project.build.sourceEncoding} + true + org.springframework diff --git a/pom.xml b/pom.xml index 29c4276b2cf..9017c1bd6af 100755 --- a/pom.xml +++ b/pom.xml @@ -5,19 +5,30 @@ org.springframework spring-web + + + + javax.annotation + javax.annotation-api + UTF-8 3.6.1 - 1.8 + 17 5.2.25.RELEASE 5.7.13 - 5.3.26.Final - 1.8.9 - 1.10 - 2.9.2-01 - 2.4.3-01 + 5.6.15.Final + 1.9.21 + 1.16.0 + 4.0.15 + 3.9.0 + 4.0.15-01 5.10.12.Final + + 2.3.1 + 2.3.6 + 1.3.2 4.0.0 @@ -131,9 +142,36 @@ 2.18.0 - org.codehaus.groovy - groovy-all - 2.4.21 + org.apache.groovy + groovy + ${groovy.version} + + + org.apache.groovy + groovy-xml + ${groovy.version} + + + org.apache.groovy + groovy-templates + ${groovy.version} + + + + javax.xml.bind + jaxb-api + ${jaxb.api.version} + + + org.glassfish.jaxb + jaxb-runtime + ${jaxb.runtime.version} + + + + javax.annotation + javax.annotation-api + ${javax.annotation.version} org.hibernate.javax.persistence @@ -295,7 +333,7 @@ com.mchange c3p0 - 0.9.5.4 + 0.9.5.5 com.google.guava @@ -622,9 +660,115 @@ + + + org.apache.maven.plugins + maven-enforcer-plugin + 3.4.1 + + + enforce-java17 + + enforce + + + + + [17,18) + 项目需要Java 17,当前版本: ${java.version} + + + [3.6.0,) + + + true + + + + + + + + + org.codehaus.gmavenplus + gmavenplus-plugin + 4.2.1 + + + + org.apache.groovy + groovy + ${groovy.version} + + + + + true + + + ${project.basedir}/src/main/java + + **/*.groovy + + + + ${project.basedir}/src/main/groovy + + **/*.groovy + + + + + + ${project.basedir}/src/test/java + + **/*.groovy + + + + ${project.basedir}/src/test/groovy + + **/*.groovy + + + + + + + + + + + central + Maven Central Repository + https://repo1.maven.org/maven2 + + true + + + false + + + + + + + + central + Maven Central Plugin Repository + https://repo1.maven.org/maven2 + + true + + + false + + + + maven-releases diff --git a/portal/pom.xml b/portal/pom.xml index e174dfe5f45..5fa5c8d3fe1 100755 --- a/portal/pom.xml +++ b/portal/pom.xml @@ -49,29 +49,23 @@ maven-compiler-plugin ${project.compiler.version} - groovy-eclipse-compiler - ${project.java.version} - ${project.java.version} - lines,vars,source + ${project.java.version} true + true - - - org.codehaus.groovy - groovy-eclipse-compiler - ${groovy.eclipse.compiler} - - - org.codehaus.groovy - groovy-eclipse-batch - ${groovy.eclipse.batch} - - + org.codehaus.mojo aspectj-maven-plugin ${aspectj.plugin.version} + + + org.aspectj + aspectjtools + ${aspectj.version} + + @@ -81,10 +75,12 @@ + ${project.java.version} ${project.java.version} ${project.java.version} - ${project.java.version} - true + ${project.build.sourceEncoding} + true + org.springframework diff --git a/portal/src/main/java/org/zstack/portal/managementnode/DebugSignalHandler.java b/portal/src/main/java/org/zstack/portal/managementnode/DebugSignalHandler.java index 17cf7a36ab6..8687a9f19f8 100644 --- a/portal/src/main/java/org/zstack/portal/managementnode/DebugSignalHandler.java +++ b/portal/src/main/java/org/zstack/portal/managementnode/DebugSignalHandler.java @@ -1,5 +1,7 @@ package org.zstack.portal.managementnode; +// Note: sun.misc.Signal requires --add-exports java.base/sun.misc=ALL-UNNAMED JVM option in Java 17+ +// This is configured in conf/jvm-options-java17.conf import sun.misc.Signal; import sun.misc.SignalHandler; diff --git a/resourceconfig/pom.xml b/resourceconfig/pom.xml index f28c3c820db..5d124a9135b 100644 --- a/resourceconfig/pom.xml +++ b/resourceconfig/pom.xml @@ -46,29 +46,23 @@ maven-compiler-plugin ${project.compiler.version} - groovy-eclipse-compiler - ${project.java.version} - ${project.java.version} - lines,vars,source + ${project.java.version} true + true - - - org.codehaus.groovy - groovy-eclipse-compiler - ${groovy.eclipse.compiler} - - - org.codehaus.groovy - groovy-eclipse-batch - ${groovy.eclipse.batch} - - + org.codehaus.mojo aspectj-maven-plugin ${aspectj.plugin.version} + + + org.aspectj + aspectjtools + ${aspectj.version} + + @@ -78,10 +72,12 @@ + ${project.java.version} ${project.java.version} ${project.java.version} - ${project.java.version} - true + ${project.build.sourceEncoding} + true + org.springframework diff --git a/rest/pom.xml b/rest/pom.xml index 5f346305937..1cce3d4ad7a 100755 --- a/rest/pom.xml +++ b/rest/pom.xml @@ -79,29 +79,23 @@ maven-compiler-plugin ${project.compiler.version} - groovy-eclipse-compiler - ${project.java.version} - ${project.java.version} - lines,vars,source + ${project.java.version} true + true - - - org.codehaus.groovy - groovy-eclipse-compiler - ${groovy.eclipse.compiler} - - - org.codehaus.groovy - groovy-eclipse-batch - ${groovy.eclipse.batch} - - + org.codehaus.mojo aspectj-maven-plugin ${aspectj.plugin.version} + + + org.aspectj + aspectjtools + ${aspectj.version} + + @@ -111,10 +105,11 @@ + ${project.java.version} ${project.java.version} ${project.java.version} - ${project.java.version} - true + ${project.build.sourceEncoding} + true org.springframework diff --git a/rest/src/main/java/org/zstack/rest/RestServer.java b/rest/src/main/java/org/zstack/rest/RestServer.java index 339396d3c41..9a860135c82 100755 --- a/rest/src/main/java/org/zstack/rest/RestServer.java +++ b/rest/src/main/java/org/zstack/rest/RestServer.java @@ -1118,7 +1118,7 @@ private void handleApi(Api api, Map body, String parameterName, HttpEntity vars = req.getParameterMap(); - APIQueryMessage msg = (APIQueryMessage) api.apiClass.newInstance(); + APIQueryMessage msg = (APIQueryMessage) api.apiClass.getConstructor().newInstance(); if (session != null && session.isNoSessionEvaluation()) { msg.putHeaderEntry(IdentityByPassCheck.NoSessionEvaluation.toString(), true); diff --git a/runMavenProfile b/runMavenProfile index c911240dee3..25cd7ce38d3 100755 --- a/runMavenProfile +++ b/runMavenProfile @@ -499,7 +499,7 @@ clear_git_config() { run_profile() { if test x$1 = x'premium'; then - mvn -Dmaven.test.skip=true -P premium clean install + mvn -Dmaven.test.skip=true -T 1C -P premium clean install elif test x$1 = x'md'; then md elif test x$1 = x'sdk'; then diff --git a/sdk/pom.xml b/sdk/pom.xml index 988b8f7d7c0..d471e5be9a8 100755 --- a/sdk/pom.xml +++ b/sdk/pom.xml @@ -44,8 +44,7 @@ maven-compiler-plugin ${project.compiler.version} - ${project.java.version} - ${project.java.version} + ${project.java.version} lines,vars,source true diff --git a/search/pom.xml b/search/pom.xml index a2735c3e583..f6ccb6d52f4 100755 --- a/search/pom.xml +++ b/search/pom.xml @@ -8,6 +8,22 @@ .. search + + + + + central + Maven Central Plugin Repository + https://repo1.maven.org/maven2 + + true + + + false + + + + org.zstack @@ -39,8 +55,12 @@ 1.19 - org.codehaus.groovy - groovy-all + org.apache.groovy + groovy + + + org.apache.groovy + groovy-xml org.antlr @@ -134,35 +154,75 @@ + org.apache.maven.plugins maven-compiler-plugin ${project.compiler.version} - groovy-eclipse-compiler - ${project.java.version} - ${project.java.version} - lines,vars,source + ${project.java.version} true + true + + + + + + org.codehaus.gmavenplus + gmavenplus-plugin + 4.2.1 + + + + generate-stubs + process-sources + + generateStubs + + + + + compile-groovy + compile + + compile + + + + + generate-test-stubs + process-test-sources + + generateTestStubs + + + + + compile-test-groovy + test-compile + + compileTests + + + + + ${groovy.version} + ${project.java.version} - - - org.codehaus.groovy - groovy-eclipse-compiler - 2.9.2-01 - - - org.codehaus.groovy - groovy-eclipse-batch - 2.4.3-01 - - + org.codehaus.mojo aspectj-maven-plugin ${aspectj.plugin.version} + + + org.aspectj + aspectjtools + ${aspectj.version} + + @@ -172,10 +232,12 @@ + ${project.java.version} ${project.java.version} ${project.java.version} - ${project.java.version} - true + ${project.build.sourceEncoding} + true + none org.springframework diff --git a/search/src/main/java/org/zstack/query/APIBatchQueryMsgDoc_zh_cn.groovy b/search/src/main/groovy/org/zstack/query/APIBatchQueryMsgDoc_zh_cn.groovy similarity index 99% rename from search/src/main/java/org/zstack/query/APIBatchQueryMsgDoc_zh_cn.groovy rename to search/src/main/groovy/org/zstack/query/APIBatchQueryMsgDoc_zh_cn.groovy index bda576ced59..822fb2edd77 100644 --- a/search/src/main/java/org/zstack/query/APIBatchQueryMsgDoc_zh_cn.groovy +++ b/search/src/main/groovy/org/zstack/query/APIBatchQueryMsgDoc_zh_cn.groovy @@ -55,4 +55,5 @@ doc { clz APIBatchQueryReply.class } } -} \ No newline at end of file +} + diff --git a/search/src/main/java/org/zstack/query/APIBatchQueryReplyDoc_zh_cn.groovy b/search/src/main/groovy/org/zstack/query/APIBatchQueryReplyDoc_zh_cn.groovy similarity index 99% rename from search/src/main/java/org/zstack/query/APIBatchQueryReplyDoc_zh_cn.groovy rename to search/src/main/groovy/org/zstack/query/APIBatchQueryReplyDoc_zh_cn.groovy index 51191bb2d58..05f28f337c4 100644 --- a/search/src/main/java/org/zstack/query/APIBatchQueryReplyDoc_zh_cn.groovy +++ b/search/src/main/groovy/org/zstack/query/APIBatchQueryReplyDoc_zh_cn.groovy @@ -27,3 +27,4 @@ doc { since "0.6" } } + diff --git a/search/src/main/java/org/zstack/query/APIZQLQueryMsgDoc_zh_cn.groovy b/search/src/main/groovy/org/zstack/query/APIZQLQueryMsgDoc_zh_cn.groovy similarity index 99% rename from search/src/main/java/org/zstack/query/APIZQLQueryMsgDoc_zh_cn.groovy rename to search/src/main/groovy/org/zstack/query/APIZQLQueryMsgDoc_zh_cn.groovy index 2b161d70622..72a323d5fe2 100644 --- a/search/src/main/java/org/zstack/query/APIZQLQueryMsgDoc_zh_cn.groovy +++ b/search/src/main/groovy/org/zstack/query/APIZQLQueryMsgDoc_zh_cn.groovy @@ -55,4 +55,5 @@ doc { clz APIZQLQueryReply.class } } -} \ No newline at end of file +} + diff --git a/search/src/main/java/org/zstack/query/APIZQLQueryReplyDoc_zh_cn.groovy b/search/src/main/groovy/org/zstack/query/APIZQLQueryReplyDoc_zh_cn.groovy old mode 100755 new mode 100644 similarity index 99% rename from search/src/main/java/org/zstack/query/APIZQLQueryReplyDoc_zh_cn.groovy rename to search/src/main/groovy/org/zstack/query/APIZQLQueryReplyDoc_zh_cn.groovy index bef9151aa68..1380ee6b6b0 --- a/search/src/main/java/org/zstack/query/APIZQLQueryReplyDoc_zh_cn.groovy +++ b/search/src/main/groovy/org/zstack/query/APIZQLQueryReplyDoc_zh_cn.groovy @@ -30,3 +30,4 @@ doc { clz ZQLQueryReturn.class } } + diff --git a/search/src/main/java/org/zstack/query/BatchQuery.groovy b/search/src/main/groovy/org/zstack/query/BatchQuery.groovy old mode 100755 new mode 100644 similarity index 97% rename from search/src/main/java/org/zstack/query/BatchQuery.groovy rename to search/src/main/groovy/org/zstack/query/BatchQuery.groovy index f4f9cafb7dd..edffe1bd9f8 --- a/search/src/main/java/org/zstack/query/BatchQuery.groovy +++ b/search/src/main/groovy/org/zstack/query/BatchQuery.groovy @@ -1,485 +1,486 @@ package org.zstack.query -import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; - -import org.apache.commons.lang.StringUtils -import org.codehaus.groovy.control.CompilerConfiguration -import org.codehaus.groovy.reflection.ClassInfo -import org.codehaus.groovy.reflection.GroovyClassValue -import org.kohsuke.groovy.sandbox.GroovyInterceptor -import org.kohsuke.groovy.sandbox.SandboxTransformer -import org.kohsuke.groovy.sandbox.impl.Super -import org.zstack.core.Platform -import org.zstack.core.cloudbus.CloudBus -import org.zstack.header.errorcode.OperationFailureException -import org.zstack.header.exception.CloudRuntimeException -import org.zstack.header.identity.AccountConstant -import org.zstack.header.identity.Action -import org.zstack.header.identity.SessionInventory -import org.zstack.header.identity.SuppressCredentialCheck -import org.zstack.header.message.APIMessage -import org.zstack.header.message.APIResponse -import org.zstack.header.message.APISyncCallMessage -import org.zstack.header.message.MessageReply -import org.zstack.header.query.APIQueryMessage -import org.zstack.header.query.AutoQuery -import org.zstack.header.query.QueryCondition -import org.zstack.header.query.QueryOp -import org.zstack.utils.Utils -import org.zstack.utils.gson.JSONObjectUtil -import org.zstack.utils.logging.CLogger -import org.zstack.zql.ZQL -import org.zstack.zql.ZQLContext -import org.zstack.zql.ZQLQueryReturn - -import java.lang.reflect.Field -import java.lang.reflect.Modifier -import java.util.regex.Pattern - -class BatchQuery { - private static CLogger logger = Utils.getLogger(BatchQuery.class) - - private QueryFacade queryf - private SessionInventory session - private CloudBus bus - - private static class DebugObject { - static class APIStatistics { - transient long startTime - - int timeCostPerCall - int totalTimeCost - int callTimes - long totalResultSize - long resultSizePerCall - } - - Map APIStats = [:] - long resultSize - long totalTimeCost - } - - private DebugObject debugObject; - - static class SandBox extends GroovyInterceptor { - static List RECEIVER_WHITE_LIST = [ - Number[].class, - Number.class, - long[].class, - long.class, - int[].class, - int.class, - short[].class, - short.class, - double[].class, - double.class, - float[].class, - float.class, - String[].class, - String.class, - Date[].class, - Date.class, - Map.class, - Collection.class, - Enum[].class, - Enum.class - ] - - static void checkReceiver(Object obj) { - checkReceiver(obj.getClass()) - } - - static void checkReceiver(Class clz) { - for (Class wclz : RECEIVER_WHITE_LIST) { - if (wclz.isAssignableFrom(clz)) { - return - } - } - - throw new Exception("invalid operation on class[${clz.name}]") - } - - static void checkMethod(String method) { - if (method == "sleep") { - throw new Exception("invalid operation[${method}]") - } - } - - Object onMethodCall(GroovyInterceptor.Invoker invoker, Object receiver, String method, Object... args) throws Throwable { - checkReceiver(receiver) - checkMethod(method) - return super.onMethodCall(invoker, receiver, method, args) - } - - Object onStaticCall(GroovyInterceptor.Invoker invoker, Class receiver, String method, Object... args) throws Throwable { - checkReceiver(receiver) - checkMethod(method) - return super.onStaticCall(invoker, receiver, method, args) - } - - Object onNewInstance(GroovyInterceptor.Invoker invoker, Class receiver, Object... args) throws Throwable { - checkReceiver(receiver) - return invoker.call(receiver, (String)null, (Object[])args); - } - - Object onSuperCall(GroovyInterceptor.Invoker invoker, Class senderType, Object receiver, String method, Object... args) throws Throwable { - checkReceiver(receiver) - return invoker.call(new Super(senderType, receiver), method, (Object[])args); - } - - void onSuperConstructor(GroovyInterceptor.Invoker invoker, Class receiver, Object... args) throws Throwable { - checkReceiver(receiver) - this.onNewInstance(invoker, receiver, args); - } - - Object onGetProperty(GroovyInterceptor.Invoker invoker, Object receiver, String property) throws Throwable { - checkReceiver(receiver) - return invoker.call(receiver, property); - } - - Object onSetProperty(GroovyInterceptor.Invoker invoker, Object receiver, String property, Object value) throws Throwable { - checkReceiver(receiver) - return invoker.call(receiver, property, value); - } - - Object onGetAttribute(GroovyInterceptor.Invoker invoker, Object receiver, String attribute) throws Throwable { - checkReceiver(receiver) - return invoker.call(receiver, attribute); - } - - Object onSetAttribute(GroovyInterceptor.Invoker invoker, Object receiver, String attribute, Object value) throws Throwable { - checkReceiver(receiver) - return invoker.call(receiver, attribute, value); - } - - Object onGetArray(GroovyInterceptor.Invoker invoker, Object receiver, Object index) throws Throwable { - checkReceiver(receiver) - return invoker.call(receiver, (String)null, (Object)index); - } - - Object onSetArray(GroovyInterceptor.Invoker invoker, Object receiver, Object index, Object value) throws Throwable { - checkReceiver(receiver) - return invoker.call(receiver, (String)null, index, value); - } - } - - BatchQuery() { - this.queryf = Platform.getComponentLoader().getComponent(QueryFacade.class) - this.bus = Platform.getComponentLoader().getComponent(CloudBus.class) - - if (isDebugOn()) { - debugObject = new DebugObject() - } - } - - private static SandBox sandbox = new SandBox() - - static Map queryMessageClass = [:] - static LinkedHashMap QUERY_OP_MAPPING = [:] - - static String lstrip(String s, String remove) { - return StringUtils.removeStart(s, remove) - } - - static String rstrip(String s, String remove) { - return StringUtils.removeEnd(s, remove) - } - - static { - Platform.reflections.getSubTypesOf(APISyncCallMessage.class).each { clz -> - if (Modifier.isAbstract(clz.modifiers)) { - return - } - - SuppressCredentialCheck at = clz.getAnnotation(SuppressCredentialCheck.class) - if (at != null && !at.supportBacthQuery()) { - return - } - - String name = lstrip(rstrip(clz.simpleName, "Msg"), "API") - queryMessageClass[name.toLowerCase()] = clz - queryMessageClass[clz.name] = clz - } - - // order is important, don't change it - QUERY_OP_MAPPING.put("=null", QueryOp.IS_NULL.toString()) - QUERY_OP_MAPPING.put("!=null", QueryOp.NOT_NULL.toString()) - QUERY_OP_MAPPING.put("!=", QueryOp.NOT_EQ.toString()) - QUERY_OP_MAPPING.put(">=", QueryOp.GT_AND_EQ.toString()) - QUERY_OP_MAPPING.put("<=", QueryOp.LT_AND_EQ.toString()) - QUERY_OP_MAPPING.put("!?=", QueryOp.NOT_IN.toString()) - QUERY_OP_MAPPING.put("!~=", QueryOp.NOT_LIKE.toString()) - QUERY_OP_MAPPING.put("~=", QueryOp.LIKE.toString()) - QUERY_OP_MAPPING.put("?=", QueryOp.IN.toString()) - QUERY_OP_MAPPING.put("=", QueryOp.EQ.toString()) - QUERY_OP_MAPPING.put(">", QueryOp.GT.toString()) - QUERY_OP_MAPPING.put("<", QueryOp.LT.toString()) - } - - private static boolean isDebugOn() { - return QueryGlobalConfig.BATCH_QUERY_DEBUG.value(Boolean.class) - } - - private void startDebug(APIMessage msg) { - if (isDebugOn()) { - DebugObject.APIStatistics stat = debugObject.APIStats.computeIfAbsent(msg.class.name, {new DebugObject.APIStatistics()}) - stat.startTime = System.currentTimeMillis() - } - } - - private void endDebug(APIMessage msg, Map res) { - if (isDebugOn()) { - DebugObject.APIStatistics stat = debugObject.APIStats[msg.class.name] - long timeCost = System.currentTimeMillis() - stat.startTime - stat.totalTimeCost += timeCost - stat.totalResultSize += getMapMemorySize(res) - stat.callTimes += 1 - } - } - - private void printDebugInfo() { - if (!isDebugOn()) { - return - } - - // some APIs may not complete because of error - debugObject.APIStats = debugObject.APIStats.findAll { it.value.callTimes != 0 } - - debugObject.APIStats.values().each { stat -> - stat.timeCostPerCall = (int) (stat.totalTimeCost / stat.callTimes) - stat.resultSizePerCall = (long) (stat.totalResultSize / stat.callTimes) - - debugObject.resultSize += stat.totalResultSize - debugObject.totalTimeCost += stat.totalTimeCost - } - - logger.debug("""BATCH QUERY DEBUG INFO: ${JSONObjectUtil.toJsonString(debugObject)}""") - } - - private Map syncApiCall(String apiname, String jstr) { - Class msgClz = queryMessageClass[apiname] - if (msgClz == null) { - throw new OperationFailureException(org.zstack.core.Platform.argerr(ORG_ZSTACK_QUERY_10006, "no query API found for %s", apiname)) - } - - APISyncCallMessage msg = JSONObjectUtil.toObject(jstr, msgClz) - - startDebug(msg) - - msg.setSession(session) - msg.setServiceId("api.portal") - MessageReply reply = bus.call(msg) - if (!reply.isSuccess()) { - throw new OperationFailureException(reply.error) - } - - APIResponse rsp = reply as APIResponse - def res = ["result":rsp.toResponseMap(rsp)] - - endDebug(msg, res) - - return res - } - - private List zqlQuery(String qstr){ - ZQLContext.putAPISession(session) - List result = ZQL.fromString(qstr).getResultList() - ZQLContext.cleanAPISession() - return result - } - - private Map doQuery(String qstr) { - List words = qstr.split(" ") - words = words.findAll { !it.isEmpty() } - if (words.isEmpty()) { - throw new OperationFailureException(org.zstack.core.Platform.argerr(ORG_ZSTACK_QUERY_10007, "invalid query string: %s", qstr)) - } - - String api = words[0].toLowerCase() - Class msgClz = queryMessageClass[api] - if (msgClz == null) { - throw new OperationFailureException(org.zstack.core.Platform.argerr(ORG_ZSTACK_QUERY_10008, "no query API found for %s", words[0])) - } - - APIQueryMessage msg = msgClz.newInstance() as APIQueryMessage - - startDebug(msg) - - msg.setSession(session) - if (AccountConstant.INITIAL_SYSTEM_ADMIN_UUID != msg.session.accountUuid && !msgClz.isAnnotationPresent(Action.class)) { - // the resource is owned by admin and the account is a normal account - //TODO: fix hard code check admin query - return ["total": 0, "result": []] - } - - msg.setConditions([]) - boolean count = false - boolean replyWithCount = false - String filterName - - AutoQuery at = msg.getClass().getAnnotation(AutoQuery.class) - if (at == null) { - throw new CloudRuntimeException("class[${msg.getClass().name}] is not annotated by AutoQuery") - } - - Class inventoryClass = at.inventoryClass() - - if (words.size() > 1) { - words[1..words.size() - 1].each { String word -> - if (word.startsWith("fields=")) { - def values = lstrip(word, "fields=") - msg["fields"] = values.split(",") - } else if (word.startsWith("limit=")) { - def value = lstrip(word, "limit=") - msg["limit"] = Integer.valueOf(value) - } else if (word.startsWith("start=")) { - def value = lstrip(word, "start=") - msg["start"] = Integer.valueOf(value) - } else if (word.startsWith("sortBy=")) { - def value = lstrip(word, "sortBy=") - msg["sortBy"] = value - } else if (word.startsWith("sortDirection=")) { - def value = lstrip(word, "sortDirection=") - msg["sortDirection"] = value - } else if (word.startsWith("count=")) { - def value = lstrip(word, "count=") - count = Boolean.parseBoolean(value) - } else if (word.startsWith("replyWithCount=")) { - def value = lstrip(word, "replyWithCount=") - replyWithCount = Boolean.parseBoolean(value) - } else { - String OP = null - String delimiter = null - for (String op : QUERY_OP_MAPPING.keySet()) { - if (word.contains(op)) { - OP = QUERY_OP_MAPPING.get(op) - delimiter = op - break - } - } - - if (OP == null) { - throw new OperationFailureException(org.zstack.core.Platform.argerr(ORG_ZSTACK_QUERY_10009, "invalid query string[%s], word[%s] doesn't have a valid operator", qstr, word)) - } - - List ks = word.split(Pattern.quote(delimiter), 2) - QueryCondition cond = new QueryCondition() - if (OP == QueryOp.IS_NULL.toString() || OP == QueryOp.NOT_NULL.toString()) { - cond.name = ks[0] - cond.op = OP - } else { - if (ks.size() != 2) { - throw new OperationFailureException(org.zstack.core.Platform.argerr(ORG_ZSTACK_QUERY_10010, "invalid query string[%s], word[%s] doesn't has key-value pair", qstr, word)) - } - cond.name = ks[0] - cond.op = OP - cond.value = ks[1] - } - - msg.getConditions().add(cond) - } - } - } - - if (count) { - msg.setCount(true) - } - if (replyWithCount) { - msg.setReplyWithCount(true) - } - if (filterName != null) { - msg.setFilterName(filterName) - } - - ZQLQueryReturn ret = queryf.queryUseZQL(msg, inventoryClass) - - def res = ["total": ret.total, "result": ret.inventories == null ? null : JSONObjectUtil.rehashObject(ret.inventories, ArrayList.class)] - - endDebug(msg, res) - - return res - } - - private long getMapMemorySize(Map m) { - String jstr = JSONObjectUtil.toJsonString(m) - return jstr.length() - } - - private String errorLine(String code, Throwable e) { - Throwable t = e - while (t.cause != null) { - t = t.cause - } - - def trace = t.stackTrace.find { - it.fileName ==~ /^Script\d+\.groovy$/ - } - - if (!trace.hasProperty("lineNumber")) { - throw e - } - - def lineNum = trace.lineNumber - 1 - println(code.readLines()) - def line = code.readLines()[lineNum] - return "${e.message}, error at line ${lineNum}: ${line}" - } - - // To mitigate Metaspace been occupied - // c.f. https://stackoverflow.com/questions/41465834 - private static void clearAllClassInfo(Class type) { - Field globalClassValue = ClassInfo.class.getDeclaredField("globalClassValue") - globalClassValue.setAccessible(true) - GroovyClassValue classValueBean = (GroovyClassValue) globalClassValue.get(null) - classValueBean.remove(type) - } - - Map query(APIBatchQueryMsg msg) { - try { - session = msg.getSession() - Binding binding = new Binding() - Map output = [:] - - def query = { doQuery(it) } - def put = { k, v -> output[k] = v } - def call = { apiName, value -> syncApiCall(apiName, value) } - def zql = { zqlQuery(it) } - - binding.setVariable("query", query) - binding.setVariable("put", put) - binding.setVariable("call", call) - binding.setVariable("zql", zql) - - def cc = new CompilerConfiguration() - cc.addCompilationCustomizers(new RejectASTTransformsCustomizer()) - cc.addCompilationCustomizers(new SandboxTransformer()) - - def shell = new GroovyShell(new GroovyClassLoader(), binding, cc) - sandbox.register() - try { - Script script = shell.parse(msg.script) - ZQLContext.putAPISession(msg.session) - script.run() - ZQLContext.clean() - clearAllClassInfo(script.getClass()) - } catch (Throwable t) { - logger.warn(t.message, t) - sandbox.unregister() - throw new OperationFailureException(org.zstack.core.Platform.operr(ORG_ZSTACK_QUERY_10011, "${errorLine(msg.script, t)}")) - } finally { - sandbox.unregister() - shell.resetLoadedClasses() - } - - printDebugInfo() - - return output - } catch (Throwable t) { - if (!(t instanceof OperationFailureException)) { - logger.warn(t.message, t) - } - - throw t - } - } -} +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; + +import org.apache.commons.lang.StringUtils +import org.codehaus.groovy.control.CompilerConfiguration +import org.codehaus.groovy.reflection.ClassInfo +import org.codehaus.groovy.reflection.GroovyClassValue +import org.kohsuke.groovy.sandbox.GroovyInterceptor +import org.kohsuke.groovy.sandbox.SandboxTransformer +import org.kohsuke.groovy.sandbox.impl.Super +import org.zstack.core.Platform +import org.zstack.core.cloudbus.CloudBus +import org.zstack.header.errorcode.OperationFailureException +import org.zstack.header.exception.CloudRuntimeException +import org.zstack.header.identity.AccountConstant +import org.zstack.header.identity.Action +import org.zstack.header.identity.SessionInventory +import org.zstack.header.identity.SuppressCredentialCheck +import org.zstack.header.message.APIMessage +import org.zstack.header.message.APIResponse +import org.zstack.header.message.APISyncCallMessage +import org.zstack.header.message.MessageReply +import org.zstack.header.query.APIQueryMessage +import org.zstack.header.query.AutoQuery +import org.zstack.header.query.QueryCondition +import org.zstack.header.query.QueryOp +import org.zstack.utils.Utils +import org.zstack.utils.gson.JSONObjectUtil +import org.zstack.utils.logging.CLogger +import org.zstack.zql.ZQL +import org.zstack.zql.ZQLContext +import org.zstack.zql.ZQLQueryReturn + +import java.lang.reflect.Field +import java.lang.reflect.Modifier +import java.util.regex.Pattern + +class BatchQuery { + private static CLogger logger = Utils.getLogger(BatchQuery.class) + + private QueryFacade queryf + private SessionInventory session + private CloudBus bus + + private static class DebugObject { + static class APIStatistics { + transient long startTime + + int timeCostPerCall + int totalTimeCost + int callTimes + long totalResultSize + long resultSizePerCall + } + + Map APIStats = [:] + long resultSize + long totalTimeCost + } + + private DebugObject debugObject; + + static class SandBox extends GroovyInterceptor { + static List RECEIVER_WHITE_LIST = [ + Number[].class, + Number.class, + long[].class, + long.class, + int[].class, + int.class, + short[].class, + short.class, + double[].class, + double.class, + float[].class, + float.class, + String[].class, + String.class, + Date[].class, + Date.class, + Map.class, + Collection.class, + Enum[].class, + Enum.class + ] + + static void checkReceiver(Object obj) { + checkReceiver(obj.getClass()) + } + + static void checkReceiver(Class clz) { + for (Class wclz : RECEIVER_WHITE_LIST) { + if (wclz.isAssignableFrom(clz)) { + return + } + } + + throw new Exception("invalid operation on class[${clz.name}]") + } + + static void checkMethod(String method) { + if (method == "sleep") { + throw new Exception("invalid operation[${method}]") + } + } + + Object onMethodCall(GroovyInterceptor.Invoker invoker, Object receiver, String method, Object... args) throws Throwable { + checkReceiver(receiver) + checkMethod(method) + return super.onMethodCall(invoker, receiver, method, args) + } + + Object onStaticCall(GroovyInterceptor.Invoker invoker, Class receiver, String method, Object... args) throws Throwable { + checkReceiver(receiver) + checkMethod(method) + return super.onStaticCall(invoker, receiver, method, args) + } + + Object onNewInstance(GroovyInterceptor.Invoker invoker, Class receiver, Object... args) throws Throwable { + checkReceiver(receiver) + return invoker.call(receiver, (String)null, (Object[])args); + } + + Object onSuperCall(GroovyInterceptor.Invoker invoker, Class senderType, Object receiver, String method, Object... args) throws Throwable { + checkReceiver(receiver) + return invoker.call(new Super(senderType, receiver), method, (Object[])args); + } + + void onSuperConstructor(GroovyInterceptor.Invoker invoker, Class receiver, Object... args) throws Throwable { + checkReceiver(receiver) + this.onNewInstance(invoker, receiver, args); + } + + Object onGetProperty(GroovyInterceptor.Invoker invoker, Object receiver, String property) throws Throwable { + checkReceiver(receiver) + return invoker.call(receiver, property); + } + + Object onSetProperty(GroovyInterceptor.Invoker invoker, Object receiver, String property, Object value) throws Throwable { + checkReceiver(receiver) + return invoker.call(receiver, property, value); + } + + Object onGetAttribute(GroovyInterceptor.Invoker invoker, Object receiver, String attribute) throws Throwable { + checkReceiver(receiver) + return invoker.call(receiver, attribute); + } + + Object onSetAttribute(GroovyInterceptor.Invoker invoker, Object receiver, String attribute, Object value) throws Throwable { + checkReceiver(receiver) + return invoker.call(receiver, attribute, value); + } + + Object onGetArray(GroovyInterceptor.Invoker invoker, Object receiver, Object index) throws Throwable { + checkReceiver(receiver) + return invoker.call(receiver, (String)null, (Object)index); + } + + Object onSetArray(GroovyInterceptor.Invoker invoker, Object receiver, Object index, Object value) throws Throwable { + checkReceiver(receiver) + return invoker.call(receiver, (String)null, index, value); + } + } + + BatchQuery() { + this.queryf = Platform.getComponentLoader().getComponent(QueryFacade.class) + this.bus = Platform.getComponentLoader().getComponent(CloudBus.class) + + if (isDebugOn()) { + debugObject = new DebugObject() + } + } + + private static SandBox sandbox = new SandBox() + + static Map queryMessageClass = [:] + static LinkedHashMap QUERY_OP_MAPPING = [:] + + static String lstrip(String s, String remove) { + return StringUtils.removeStart(s, remove) + } + + static String rstrip(String s, String remove) { + return StringUtils.removeEnd(s, remove) + } + + static { + Platform.reflections.getSubTypesOf(APISyncCallMessage.class).each { clz -> + if (Modifier.isAbstract(clz.modifiers)) { + return + } + + SuppressCredentialCheck at = clz.getAnnotation(SuppressCredentialCheck.class) + if (at != null && !at.supportBacthQuery()) { + return + } + + String name = lstrip(rstrip(clz.simpleName, "Msg"), "API") + queryMessageClass[name.toLowerCase()] = clz + queryMessageClass[clz.name] = clz + } + + // order is important, don't change it + QUERY_OP_MAPPING.put("=null", QueryOp.IS_NULL.toString()) + QUERY_OP_MAPPING.put("!=null", QueryOp.NOT_NULL.toString()) + QUERY_OP_MAPPING.put("!=", QueryOp.NOT_EQ.toString()) + QUERY_OP_MAPPING.put(">=", QueryOp.GT_AND_EQ.toString()) + QUERY_OP_MAPPING.put("<=", QueryOp.LT_AND_EQ.toString()) + QUERY_OP_MAPPING.put("!?=", QueryOp.NOT_IN.toString()) + QUERY_OP_MAPPING.put("!~=", QueryOp.NOT_LIKE.toString()) + QUERY_OP_MAPPING.put("~=", QueryOp.LIKE.toString()) + QUERY_OP_MAPPING.put("?=", QueryOp.IN.toString()) + QUERY_OP_MAPPING.put("=", QueryOp.EQ.toString()) + QUERY_OP_MAPPING.put(">", QueryOp.GT.toString()) + QUERY_OP_MAPPING.put("<", QueryOp.LT.toString()) + } + + private static boolean isDebugOn() { + return QueryGlobalConfig.BATCH_QUERY_DEBUG.value(Boolean.class) + } + + private void startDebug(APIMessage msg) { + if (isDebugOn()) { + DebugObject.APIStatistics stat = debugObject.APIStats.computeIfAbsent(msg.class.name, {new DebugObject.APIStatistics()}) + stat.startTime = System.currentTimeMillis() + } + } + + private void endDebug(APIMessage msg, Map res) { + if (isDebugOn()) { + DebugObject.APIStatistics stat = debugObject.APIStats[msg.class.name] + long timeCost = System.currentTimeMillis() - stat.startTime + stat.totalTimeCost += timeCost + stat.totalResultSize += getMapMemorySize(res) + stat.callTimes += 1 + } + } + + private void printDebugInfo() { + if (!isDebugOn()) { + return + } + + // some APIs may not complete because of error + debugObject.APIStats = debugObject.APIStats.findAll { it.value.callTimes != 0 } + + debugObject.APIStats.values().each { stat -> + stat.timeCostPerCall = (int) (stat.totalTimeCost / stat.callTimes) + stat.resultSizePerCall = (long) (stat.totalResultSize / stat.callTimes) + + debugObject.resultSize += stat.totalResultSize + debugObject.totalTimeCost += stat.totalTimeCost + } + + logger.debug("""BATCH QUERY DEBUG INFO: ${JSONObjectUtil.toJsonString(debugObject)}""") + } + + private Map syncApiCall(String apiname, String jstr) { + Class msgClz = queryMessageClass[apiname] + if (msgClz == null) { + throw new OperationFailureException(org.zstack.core.Platform.argerr(ORG_ZSTACK_QUERY_10006, "no query API found for %s", apiname)) + } + + APISyncCallMessage msg = JSONObjectUtil.toObject(jstr, msgClz) + + startDebug(msg) + + msg.setSession(session) + msg.setServiceId("api.portal") + MessageReply reply = bus.call(msg) + if (!reply.isSuccess()) { + throw new OperationFailureException(reply.error) + } + + APIResponse rsp = reply as APIResponse + def res = ["result":rsp.toResponseMap(rsp)] + + endDebug(msg, res) + + return res + } + + private List zqlQuery(String qstr){ + ZQLContext.putAPISession(session) + List result = ZQL.fromString(qstr).getResultList() + ZQLContext.cleanAPISession() + return result + } + + private Map doQuery(String qstr) { + List words = qstr.split(" ") + words = words.findAll { !it.isEmpty() } + if (words.isEmpty()) { + throw new OperationFailureException(org.zstack.core.Platform.argerr(ORG_ZSTACK_QUERY_10007, "invalid query string: %s", qstr)) + } + + String api = words[0].toLowerCase() + Class msgClz = queryMessageClass[api] + if (msgClz == null) { + throw new OperationFailureException(org.zstack.core.Platform.argerr(ORG_ZSTACK_QUERY_10008, "no query API found for %s", words[0])) + } + + APIQueryMessage msg = msgClz.getConstructor().newInstance() as APIQueryMessage + + startDebug(msg) + + msg.setSession(session) + if (AccountConstant.INITIAL_SYSTEM_ADMIN_UUID != msg.session.accountUuid && !msgClz.isAnnotationPresent(Action.class)) { + // the resource is owned by admin and the account is a normal account + //TODO: fix hard code check admin query + return ["total": 0, "result": []] + } + + msg.setConditions([]) + boolean count = false + boolean replyWithCount = false + String filterName + + AutoQuery at = msg.getClass().getAnnotation(AutoQuery.class) + if (at == null) { + throw new CloudRuntimeException("class[${msg.getClass().name}] is not annotated by AutoQuery") + } + + Class inventoryClass = at.inventoryClass() + + if (words.size() > 1) { + words[1..words.size() - 1].each { String word -> + if (word.startsWith("fields=")) { + def values = lstrip(word, "fields=") + msg["fields"] = values.split(",") + } else if (word.startsWith("limit=")) { + def value = lstrip(word, "limit=") + msg["limit"] = Integer.valueOf(value) + } else if (word.startsWith("start=")) { + def value = lstrip(word, "start=") + msg["start"] = Integer.valueOf(value) + } else if (word.startsWith("sortBy=")) { + def value = lstrip(word, "sortBy=") + msg["sortBy"] = value + } else if (word.startsWith("sortDirection=")) { + def value = lstrip(word, "sortDirection=") + msg["sortDirection"] = value + } else if (word.startsWith("count=")) { + def value = lstrip(word, "count=") + count = Boolean.parseBoolean(value) + } else if (word.startsWith("replyWithCount=")) { + def value = lstrip(word, "replyWithCount=") + replyWithCount = Boolean.parseBoolean(value) + } else { + String OP = null + String delimiter = null + for (String op : QUERY_OP_MAPPING.keySet()) { + if (word.contains(op)) { + OP = QUERY_OP_MAPPING.get(op) + delimiter = op + break + } + } + + if (OP == null) { + throw new OperationFailureException(org.zstack.core.Platform.argerr(ORG_ZSTACK_QUERY_10009, "invalid query string[%s], word[%s] doesn't have a valid operator", qstr, word)) + } + + List ks = word.split(Pattern.quote(delimiter), 2) + QueryCondition cond = new QueryCondition() + if (OP == QueryOp.IS_NULL.toString() || OP == QueryOp.NOT_NULL.toString()) { + cond.name = ks[0] + cond.op = OP + } else { + if (ks.size() != 2) { + throw new OperationFailureException(org.zstack.core.Platform.argerr(ORG_ZSTACK_QUERY_10010, "invalid query string[%s], word[%s] doesn't has key-value pair", qstr, word)) + } + cond.name = ks[0] + cond.op = OP + cond.value = ks[1] + } + + msg.getConditions().add(cond) + } + } + } + + if (count) { + msg.setCount(true) + } + if (replyWithCount) { + msg.setReplyWithCount(true) + } + if (filterName != null) { + msg.setFilterName(filterName) + } + + ZQLQueryReturn ret = queryf.queryUseZQL(msg, inventoryClass) + + def res = ["total": ret.total, "result": ret.inventories == null ? null : JSONObjectUtil.rehashObject(ret.inventories, ArrayList.class)] + + endDebug(msg, res) + + return res + } + + private long getMapMemorySize(Map m) { + String jstr = JSONObjectUtil.toJsonString(m) + return jstr.length() + } + + private String errorLine(String code, Throwable e) { + Throwable t = e + while (t.cause != null) { + t = t.cause + } + + def trace = t.stackTrace.find { + it.fileName ==~ /^Script\d+\.groovy$/ + } + + if (!trace.hasProperty("lineNumber")) { + throw e + } + + def lineNum = trace.lineNumber - 1 + println(code.readLines()) + def line = code.readLines()[lineNum] + return "${e.message}, error at line ${lineNum}: ${line}" + } + + // To mitigate Metaspace been occupied + // c.f. https://stackoverflow.com/questions/41465834 + private static void clearAllClassInfo(Class type) { + Field globalClassValue = ClassInfo.class.getDeclaredField("globalClassValue") + globalClassValue.setAccessible(true) + GroovyClassValue classValueBean = (GroovyClassValue) globalClassValue.get(null) + classValueBean.remove(type) + } + + Map query(APIBatchQueryMsg msg) { + try { + session = msg.getSession() + Binding binding = new Binding() + Map output = [:] + + def query = { doQuery(it) } + def put = { k, v -> output[k] = v } + def call = { apiName, value -> syncApiCall(apiName, value) } + def zql = { zqlQuery(it) } + + binding.setVariable("query", query) + binding.setVariable("put", put) + binding.setVariable("call", call) + binding.setVariable("zql", zql) + + def cc = new CompilerConfiguration() + cc.addCompilationCustomizers(new RejectASTTransformsCustomizer()) + cc.addCompilationCustomizers(new SandboxTransformer()) + + def shell = new GroovyShell(new GroovyClassLoader(), binding, cc) + sandbox.register() + try { + Script script = shell.parse(msg.script) + ZQLContext.putAPISession(msg.session) + script.run() + ZQLContext.clean() + clearAllClassInfo(script.getClass()) + } catch (Throwable t) { + logger.warn(t.message, t) + sandbox.unregister() + throw new OperationFailureException(org.zstack.core.Platform.operr(ORG_ZSTACK_QUERY_10011, "${errorLine(msg.script, t)}")) + } finally { + sandbox.unregister() + shell.resetLoadedClasses() + } + + printDebugInfo() + + return output + } catch (Throwable t) { + if (!(t instanceof OperationFailureException)) { + logger.warn(t.message, t) + } + + throw t + } + } +} + diff --git a/search/src/main/java/org/zstack/search/ESTuple.java b/search/src/main/java/org/zstack/search/ESTuple.java index 3926c45d21e..db0587675fc 100755 --- a/search/src/main/java/org/zstack/search/ESTuple.java +++ b/search/src/main/java/org/zstack/search/ESTuple.java @@ -39,7 +39,7 @@ public K get(String name, Class collections, Class< } String val = vals.get(name); if (val == null) { - Collection c = collections.newInstance(); + Collection c = collections.getConstructor().newInstance(); return (K) c; } return (K) JSONObjectUtil.toCollection(val, collections, clazz); diff --git a/search/src/main/java/org/zstack/zql/ast/parser/visitors/ValueVisitor.java b/search/src/main/java/org/zstack/zql/ast/parser/visitors/ValueVisitor.java index 08cfae13e86..97771297a5d 100755 --- a/search/src/main/java/org/zstack/zql/ast/parser/visitors/ValueVisitor.java +++ b/search/src/main/java/org/zstack/zql/ast/parser/visitors/ValueVisitor.java @@ -144,7 +144,7 @@ private Object callAction(String apiStr, String outputStr, Map p String apiName = "org.zstack.sdk." + apiStr + "Action"; logger.debug(String.format("start to call sdk: %s, params: %s", apiName, JSONObjectUtil.toJsonString(params))); try { - Object action = Class.forName(apiName).newInstance(); + Object action = Class.forName(apiName).getConstructor().newInstance(); params.forEach((k, v) -> { setField(action, k, v); }); diff --git a/simulator/pom.xml b/simulator/pom.xml index 4e2d713b293..580b760a13a 100755 --- a/simulator/pom.xml +++ b/simulator/pom.xml @@ -45,41 +45,55 @@ maven-compiler-plugin ${project.compiler.version} - groovy-eclipse-compiler - ${project.java.version} - ${project.java.version} - lines,vars,source + ${project.java.version} true - - - org.codehaus.groovy - groovy-eclipse-compiler - ${groovy.eclipse.compiler} - - - org.codehaus.groovy - groovy-eclipse-batch - ${groovy.eclipse.batch} - - + + + org.codehaus.gmavenplus + gmavenplus-plugin + 4.2.1 + + + + generateStubs + compile + + + + + ${groovy.version} + ${project.java.version} + + + org.codehaus.mojo aspectj-maven-plugin ${aspectj.plugin.version} + + + org.aspectj + aspectjtools + ${aspectj.version} + + - compile - test-compile + compile + test-compile - 1.6 - 1.6 - true + ${project.java.version} + ${project.java.version} + ${project.java.version} + ${project.build.sourceEncoding} + true + org.springframework diff --git a/simulator/simulatorHeader/pom.xml b/simulator/simulatorHeader/pom.xml index 42ec3205da5..90b8d5c8710 100755 --- a/simulator/simulatorHeader/pom.xml +++ b/simulator/simulatorHeader/pom.xml @@ -1,72 +1,85 @@ - - 4.0.0 - - simulator - org.zstack + + 4.0.0 + + simulator + org.zstack 5.5.0 - .. - - simulatorHeader - - - - org.apache.maven.plugins - maven-compiler-plugin - ${project.compiler.version} - - groovy-eclipse-compiler - ${project.java.version} - ${project.java.version} - lines,vars,source - true - - - - org.codehaus.groovy - groovy-eclipse-compiler - ${groovy.eclipse.compiler} - - - org.codehaus.groovy - groovy-eclipse-batch - ${groovy.eclipse.batch} - - - - - org.codehaus.mojo - aspectj-maven-plugin - ${aspectj.plugin.version} - - - - compile - test-compile - - - - - ${project.java.version} - ${project.java.version} - ${project.java.version} - true - - - org.springframework - spring-aspects - - - org.zstack - core - - - org.zstack - header - - - - - - - + .. + + simulatorHeader + + + + org.apache.maven.plugins + maven-compiler-plugin + ${project.compiler.version} + + ${project.java.version} + true + + + + + org.codehaus.gmavenplus + gmavenplus-plugin + 4.2.1 + + + + generateStubs + compile + + + + + ${groovy.version} + ${project.java.version} + + + + + org.codehaus.mojo + aspectj-maven-plugin + ${aspectj.plugin.version} + + + org.aspectj + aspectjtools + ${aspectj.version} + + + + + + compile + test-compile + + + + + ${project.java.version} + ${project.java.version} + ${project.java.version} + ${project.build.sourceEncoding} + true + + + + org.springframework + spring-aspects + + + org.zstack + core + + + org.zstack + header + + + + + + + diff --git a/simulator/simulatorImpl/pom.xml b/simulator/simulatorImpl/pom.xml index dee2cfb4b07..f4142fc4cfa 100755 --- a/simulator/simulatorImpl/pom.xml +++ b/simulator/simulatorImpl/pom.xml @@ -1,119 +1,132 @@ - - 4.0.0 - - simulator - org.zstack + + 4.0.0 + + simulator + org.zstack 5.5.0 - .. - - simulatorImpl - - - org.zstack - simulatorHeader - ${project.version} - - - org.zstack - compute - ${project.version} - - - org.zstack - applianceVm - ${project.version} - - - org.zstack - storage - ${project.version} - - - org.zstack - securityGroup - ${project.version} - - - org.zstack - kvm - ${project.version} - - - org.zstack - nfsPrimaryStorage - ${project.version} - - - org.zstack - sftpBackupStorage - ${project.version} - - - org.zstack - virtualRouterProvider - ${project.version} - - - - - - org.apache.maven.plugins - maven-compiler-plugin - ${project.compiler.version} - - groovy-eclipse-compiler - ${project.java.version} - ${project.java.version} - lines,vars,source - true - - - - org.codehaus.groovy - groovy-eclipse-compiler - ${groovy.eclipse.compiler} - - - org.codehaus.groovy - groovy-eclipse-batch - ${groovy.eclipse.batch} - - - - - org.codehaus.mojo - aspectj-maven-plugin - ${aspectj.plugin.version} - - - - compile - test-compile - - - - - ${project.java.version} - ${project.java.version} - ${project.java.version} - true - - - org.springframework - spring-aspects - - - org.zstack - core - - - org.zstack - header - - - - - - - + .. + + simulatorImpl + + + org.zstack + simulatorHeader + ${project.version} + + + org.zstack + compute + ${project.version} + + + org.zstack + applianceVm + ${project.version} + + + org.zstack + storage + ${project.version} + + + org.zstack + securityGroup + ${project.version} + + + org.zstack + kvm + ${project.version} + + + org.zstack + nfsPrimaryStorage + ${project.version} + + + org.zstack + sftpBackupStorage + ${project.version} + + + org.zstack + virtualRouterProvider + ${project.version} + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${project.compiler.version} + + ${project.java.version} + true + + + + + org.codehaus.gmavenplus + gmavenplus-plugin + 4.2.1 + + + + generateStubs + compile + + + + + ${groovy.version} + ${project.java.version} + + + + + org.codehaus.mojo + aspectj-maven-plugin + ${aspectj.plugin.version} + + + org.aspectj + aspectjtools + ${aspectj.version} + + + + + + compile + test-compile + + + + + ${project.java.version} + ${project.java.version} + ${project.java.version} + ${project.build.sourceEncoding} + true + + + + org.springframework + spring-aspects + + + org.zstack + core + + + org.zstack + header + + + + + + + diff --git a/storage/pom.xml b/storage/pom.xml index 9aaddc0626c..3b3c3b78bbd 100755 --- a/storage/pom.xml +++ b/storage/pom.xml @@ -1,120 +1,116 @@ - - 4.0.0 - - zstack - org.zstack + + 4.0.0 + + zstack + org.zstack 5.5.0 - .. - - storage - - - - org.zstack - core - ${project.version} - - - org.zstack - utils - ${project.version} - - - org.zstack - search - ${project.version} - - - org.zstack - identity - ${project.version} - - - org.zstack - header - ${project.version} - - - org.zstack - tag - ${project.version} - - - org.zstack - resourceconfig - ${project.version} - - - org.zstack - configuration - ${project.version} - - - org.zstack - longjob - ${project.version} - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - ${project.compiler.version} - - groovy-eclipse-compiler - ${project.java.version} - ${project.java.version} - lines,vars,source - true - - - - org.codehaus.groovy - groovy-eclipse-compiler - ${groovy.eclipse.compiler} - - - org.codehaus.groovy - groovy-eclipse-batch - ${groovy.eclipse.batch} - - - - - org.codehaus.mojo - aspectj-maven-plugin - ${aspectj.plugin.version} - - - - compile - test-compile - - - - - ${project.java.version} - ${project.java.version} - ${project.java.version} - true - - - org.springframework - spring-aspects - - - org.zstack - core - - - org.zstack - header - - - - - - - + .. + + storage + + + + org.zstack + core + ${project.version} + + + org.zstack + utils + ${project.version} + + + org.zstack + search + ${project.version} + + + org.zstack + identity + ${project.version} + + + org.zstack + header + ${project.version} + + + org.zstack + tag + ${project.version} + + + org.zstack + resourceconfig + ${project.version} + + + org.zstack + configuration + ${project.version} + + + org.zstack + longjob + ${project.version} + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${project.compiler.version} + + ${project.java.version} + true + true + + + + + org.codehaus.mojo + aspectj-maven-plugin + ${aspectj.plugin.version} + + + org.aspectj + aspectjtools + ${aspectj.version} + + + + + + compile + test-compile + + + + + ${project.java.version} + ${project.java.version} + ${project.java.version} + ${project.build.sourceEncoding} + true + + + + org.springframework + spring-aspects + + + org.zstack + core + + + org.zstack + header + + + + + + + diff --git a/storage/src/main/java/org/zstack/storage/primary/AbstractUsageReport.java b/storage/src/main/java/org/zstack/storage/primary/AbstractUsageReport.java index 7cb7f4daf6c..a621b31e622 100644 --- a/storage/src/main/java/org/zstack/storage/primary/AbstractUsageReport.java +++ b/storage/src/main/java/org/zstack/storage/primary/AbstractUsageReport.java @@ -354,8 +354,8 @@ private void addMissingDataIfNeeded(List existedUsageVOs, HistoricalUsageLoad IntStream.range(1, (int) days).forEach(i -> { T vo; try { - vo = usageClass.newInstance(); - } catch (InstantiationException | IllegalAccessException e) { + vo = usageClass.getConstructor().newInstance(); + } catch (Exception e) { throw new RuntimeException(e); } @@ -444,8 +444,8 @@ protected void collectUsage(LocalDate nowRecordDate) { if (usageRecordedNotInDatabase(usage.getResourceUuid(), nowRecordDate, historicalLastUsageRecordDateMap)) { T vo; try { - vo = usageClass.newInstance(); - } catch (InstantiationException | IllegalAccessException e) { + vo = usageClass.getConstructor().newInstance(); + } catch (Exception e) { throw new RuntimeException(e); } vo.setPrimaryStorageUuid(usage.getPrimaryStorageUuid()); diff --git a/tag/pom.xml b/tag/pom.xml index b7351a5c699..c1bc0aae5bb 100755 --- a/tag/pom.xml +++ b/tag/pom.xml @@ -51,29 +51,23 @@ maven-compiler-plugin ${project.compiler.version} - groovy-eclipse-compiler - ${project.java.version} - ${project.java.version} - lines,vars,source + ${project.java.version} true + true - - - org.codehaus.groovy - groovy-eclipse-compiler - ${groovy.eclipse.compiler} - - - org.codehaus.groovy - groovy-eclipse-batch - ${groovy.eclipse.batch} - - + org.codehaus.mojo aspectj-maven-plugin ${aspectj.plugin.version} + + + org.aspectj + aspectjtools + ${aspectj.version} + + @@ -83,10 +77,12 @@ + ${project.java.version} ${project.java.version} ${project.java.version} - ${project.java.version} - true + ${project.build.sourceEncoding} + true + org.springframework diff --git a/tag/src/main/java/org/zstack/tag/PatternedSystemTag.java b/tag/src/main/java/org/zstack/tag/PatternedSystemTag.java index 5bd1bcd56eb..e06e2fcfbdc 100755 --- a/tag/src/main/java/org/zstack/tag/PatternedSystemTag.java +++ b/tag/src/main/java/org/zstack/tag/PatternedSystemTag.java @@ -127,9 +127,9 @@ public String hideSensitiveInfo(String tag) { Class clz = this.annotation.customizeOutput(); String result = tag; try { - SensitiveTagOutputHandler sensitiveOutputHandler = clz.newInstance(); + SensitiveTagOutputHandler sensitiveOutputHandler = clz.getConstructor().newInstance(); result = sensitiveOutputHandler.desensitizeTag(this, tag); - } catch (InstantiationException | IllegalAccessException e) { + } catch (Exception e) { logger.warn("exception happened :", e); } return result; diff --git a/test/pom.xml b/test/pom.xml index 7dfbb0bbcac..b3a9c50e155 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -1,603 +1,691 @@ - - - true - ${env.skipJacoco} - ${skipJacoco} - - 4.0.0 - - zstack - org.zstack + + + true + ${env.skipJacoco} + ${skipJacoco} + + 4.0.0 + + zstack + org.zstack 5.5.0 - .. - - test - - - - - - org.kohsuke - groovy-sandbox - 1.19 - - - - junit - junit - 4.13.1 - - - org.zapodot - embedded-ldap-junit - 0.7 - test - - - - org.mockito - mockito-core - 4.11.0 - - - - org.zstack - core - ${project.version} - - - org.zstack - compute - ${project.version} - - - org.zstack - header - ${project.version} - - - org.zstack - portal - ${project.version} - - - org.zstack - utils - ${project.version} - - - org.zstack - external-service - ${project.version} - - - org.zstack - simulatorImpl - ${project.version} - - - org.zstack - image - ${project.version} - - - org.zstack - network - ${project.version} - - - org.zstack - configuration - ${project.version} - - - org.zstack - identity - ${project.version} - - - org.zstack - search - ${project.version} - - - org.zstack - console - ${project.version} - - - org.zstack - applianceVm - ${project.version} - - - org.zstack - localstorage - ${project.version} - - - org.zstack - externalStorage - ${project.version} - - - org.zstack - zbs - ${project.version} - - - org.zstack - cbd - ${project.version} - - - org.zstack - expon - ${project.version} - - - org.zstack - xinfini - ${project.version} - - - org.zstack - vhost - ${project.version} - - - org.zstack - iscsi - ${project.version} - - - org.zstack - ceph - ${project.version} - - - org.zstack - sharedMountPointPrimaryStorage - ${project.version} - - - org.zstack - ldap - ${project.version} - - - - org.jboss.shrinkwrap - shrinkwrap-api - 1.0.0-alpha-12 - test - - - org.jboss.shrinkwrap - 1.0.0-alpha-12 - shrinkwrap-impl-base - test - - - org.eclipse.jetty - jetty-server - 9.4.51.v20230217 - - - org.eclipse.jetty - jetty-webapp - 9.4.49.v20220914 - - - - org.zstack - kvm - ${project.version} - - - org.zstack - nfsPrimaryStorage - ${project.version} - - - org.zstack - sftpBackupStorage - ${project.version} - - - org.zstack - virtualRouterProvider - ${project.version} - - - org.zstack - securityGroup - ${project.version} - - - org.zstack - vip - ${project.version} - - - org.zstack - mediator - ${project.version} - - - org.zstack - flatNetworkProvider - ${project.version} - - - org.zstack - rest - ${project.version} - - - org.zstack - vxlan - ${project.version} - - - org.zstack - sdnController - ${project.version} - - - org.zstack - longjob - ${project.version} - - - org.zstack - sshKeyPair - ${project.version} - - - org.zstack - sdk - ${project.version} - - - org.zstack - sugonSdnController - ${project.version} - - - org.zstack - hostNetworkInterface - ${project.version} - - - org.zstack - testlib - ${project.version} - - - com.github.javaparser - javaparser-core - - - org.jasig.cas.client - cas-client-core - - - - - - merge - - - - org.apache.maven.plugins - maven-antrun-plugin - 1.8 - - - - - run - - - default-cli - - - - - - - - - - - - - - - - - - org.jacoco - org.jacoco.ant - 0.8.6 - - - - - - - - - coverage - - - - org.apache.maven.plugins - maven-antrun-plugin - 1.8 - - - - run - - - default-cli - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - org.jacoco - org.jacoco.ant - 0.8.6 - - - - - - - - - coverage-xml - - - - org.apache.maven.plugins - maven-antrun-plugin - 1.8 - - - - run - - - default-cli - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - org.jacoco - org.jacoco.ant - 0.8.6 - - - - - - - - - - - - - org.jacoco - jacoco-maven-plugin - 0.8.6 - - - - prepare-agent - - prepare-agent - - - true - target/classes - - org.zstack.* - - target/jacoco.exec - - - - - - - org.apache.maven.plugins - maven-surefire-plugin - 2.18 - - - c3p0:c3p0:jar:0.9.1.1 - - - - - - org.apache.maven.plugins - maven-compiler-plugin - ${project.compiler.version} - - ${project.java.version} - ${project.java.version} - true - false - - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.6.1 - - groovy-eclipse-compiler - ${project.java.version} - ${project.java.version} - lines,vars,source - true - - - - org.codehaus.groovy - groovy-eclipse-compiler - 2.9.2-01 - - - org.codehaus.groovy - groovy-eclipse-batch - 2.4.3-01 - - - - - - org.codehaus.mojo - aspectj-maven-plugin - ${aspectj.plugin.version} - - - - compile - test-compile - - - - - ${project.java.version} - ${project.java.version} - ${project.java.version} - true - - - org.springframework - spring-aspects - - - org.zstack - core - - - org.zstack - header - - - - - - - maven-resources-plugin - 2.5 - - - copy-conf - - validate - - copy-resources - - - target/test-classes - true - - - ../conf - - - - - - - - - + .. + + test + + + + + + + org.apache.groovy + groovy + ${groovy.version} + + + org.kohsuke + groovy-sandbox + 1.19 + + + + junit + junit + 4.13.1 + + + org.zapodot + embedded-ldap-junit + 0.7 + test + + + + org.mockito + mockito-core + 4.11.0 + + + + org.zstack + core + ${project.version} + + + org.zstack + compute + ${project.version} + + + org.zstack + header + ${project.version} + + + org.zstack + portal + ${project.version} + + + org.zstack + utils + ${project.version} + + + org.zstack + external-service + ${project.version} + + + org.zstack + simulatorImpl + ${project.version} + + + org.zstack + image + ${project.version} + + + org.zstack + network + ${project.version} + + + org.zstack + configuration + ${project.version} + + + org.zstack + identity + ${project.version} + + + org.zstack + search + ${project.version} + + + org.zstack + console + ${project.version} + + + org.zstack + applianceVm + ${project.version} + + + org.zstack + localstorage + ${project.version} + + + org.zstack + externalStorage + ${project.version} + + + org.zstack + zbs + ${project.version} + + + org.zstack + cbd + ${project.version} + + + org.zstack + expon + ${project.version} + + + org.zstack + xinfini + ${project.version} + + + org.zstack + vhost + ${project.version} + + + org.zstack + iscsi + ${project.version} + + + org.zstack + ceph + ${project.version} + + + org.zstack + sharedMountPointPrimaryStorage + ${project.version} + + + org.zstack + ldap + ${project.version} + + + + org.jboss.shrinkwrap + shrinkwrap-api + 1.0.0-alpha-12 + test + + + org.jboss.shrinkwrap + 1.0.0-alpha-12 + shrinkwrap-impl-base + test + + + org.eclipse.jetty + jetty-server + 9.4.51.v20230217 + + + org.eclipse.jetty + jetty-webapp + 9.4.49.v20220914 + + + + org.zstack + kvm + ${project.version} + + + org.zstack + nfsPrimaryStorage + ${project.version} + + + org.zstack + sftpBackupStorage + ${project.version} + + + org.zstack + virtualRouterProvider + ${project.version} + + + org.zstack + securityGroup + ${project.version} + + + org.zstack + vip + ${project.version} + + + org.zstack + mediator + ${project.version} + + + org.zstack + flatNetworkProvider + ${project.version} + + + org.zstack + rest + ${project.version} + + + org.zstack + vxlan + ${project.version} + + + org.zstack + sdnController + ${project.version} + + + org.zstack + longjob + ${project.version} + + + org.zstack + sshKeyPair + ${project.version} + + + org.zstack + sdk + ${project.version} + + + org.zstack + sugonSdnController + ${project.version} + + + org.zstack + hostNetworkInterface + ${project.version} + + + org.zstack + testlib + ${project.version} + + + com.github.javaparser + javaparser-core + + + org.jasig.cas.client + cas-client-core + + + + + + merge + + + + org.apache.maven.plugins + maven-antrun-plugin + 1.8 + + + + + run + + + default-cli + + + + + + + + + + + + + + + + + + org.jacoco + org.jacoco.ant + 0.8.6 + + + + + + + + + coverage + + + + org.apache.maven.plugins + maven-antrun-plugin + 1.8 + + + + run + + + default-cli + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + org.jacoco + org.jacoco.ant + 0.8.6 + + + + + + + + + coverage-xml + + + + org.apache.maven.plugins + maven-antrun-plugin + 1.8 + + + + run + + + default-cli + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + org.jacoco + org.jacoco.ant + 0.8.6 + + + + + + + + + + + + + org.jacoco + jacoco-maven-plugin + 0.8.6 + + + + prepare-agent + + prepare-agent + + + true + target/classes + + org.zstack.* + + target/jacoco.exec + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.18 + + + c3p0:c3p0:jar:0.9.1.1 + + + + + + + org.codehaus.mojo + build-helper-maven-plugin + 3.4.0 + + + add-test-source + generate-test-sources + + add-test-source + + + + ${project.basedir}/src/test/groovy + + + + + + + + + org.codehaus.gmavenplus + gmavenplus-plugin + 4.2.1 + + + org.apache.groovy + groovy + ${groovy.version} + + + + + generate-stubs + process-sources + + generateStubs + + + + compile-groovy + compile + + compile + + + + generate-test-stubs + process-test-sources + + generateTestStubs + + + + compile-test-groovy + test-compile + + compileTests + + + + + + true + ${groovy.version} + ${project.java.version} + + + ${project.basedir}/src/main/java + + **/*.groovy + + + + ${project.basedir}/src/main/groovy + + **/*.groovy + + + + + + ${project.basedir}/src/test/java + + **/*.groovy + + + + ${project.basedir}/src/test/groovy + + **/*.groovy + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${project.compiler.version} + + ${project.java.version} + true + true + false + + + + + org.codehaus.mojo + aspectj-maven-plugin + ${aspectj.plugin.version} + + + org.aspectj + aspectjtools + ${aspectj.version} + + + + + + compile + test-compile + + + + + ${project.java.version} + ${project.java.version} + ${project.java.version} + true + none + + + org.springframework + spring-aspects + + + org.zstack + core + + + org.zstack + header + + + + + + + maven-resources-plugin + 2.5 + + + copy-conf + + validate + + copy-resources + + + target/test-classes + true + + + ../conf + + + + + + + + + diff --git a/test/src/test/groovy/org/zstack/test/integration/core/gc/EventBasedGarbageCollectorCase.groovy b/test/src/test/groovy/org/zstack/test/integration/core/gc/EventBasedGarbageCollectorCase.groovy index 0bc76b3d065..b4c08a6eadb 100755 --- a/test/src/test/groovy/org/zstack/test/integration/core/gc/EventBasedGarbageCollectorCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/core/gc/EventBasedGarbageCollectorCase.groovy @@ -1,5 +1,5 @@ -package org.zstack.test.integration.core.gc - +package org.zstack.test.integration.core.gc + import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; import org.apache.commons.collections.map.HashedMap @@ -78,7 +78,7 @@ class EventBasedGarbageCollectorCase extends SubCase { } } - static Map> testLogicForJobLoadedFromDbMap = new HashedMap<>() + static Map> testLogicForJobLoadedFromDbMap = new HashedMap() static enum EventBasedGCInDbBehavior { SUCCESS, @@ -125,7 +125,7 @@ class EventBasedGarbageCollectorCase extends SubCase { } } - static Map> testTriggerNowForJobLoadedFromDbMap = new HashedMap<>() + static Map> testTriggerNowForJobLoadedFromDbMap = new HashedMap() static class EventBasedGCInDbTriggerNow extends EventBasedGarbageCollector { Closure trigger = { true } diff --git a/test/src/test/groovy/org/zstack/test/integration/network/l2network/AttachL2NetworkWithTwoClustersCase.groovy b/test/src/test/groovy/org/zstack/test/integration/network/l2network/AttachL2NetworkWithTwoClustersCase.groovy index 7240e3fcc53..a0c13f5c9a4 100644 --- a/test/src/test/groovy/org/zstack/test/integration/network/l2network/AttachL2NetworkWithTwoClustersCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/network/l2network/AttachL2NetworkWithTwoClustersCase.groovy @@ -208,7 +208,7 @@ public class AttachL2NetworkWithTwoClustersCase extends SubCase{ } assert vm2.hostUuid == host2.uuid - def cmds = [] as SynchronizedList + def cmds = [] as SynchronizedList env.afterSimulator(KVMConstant.KVM_DELETE_L2NOVLAN_NETWORK_PATH) { rsp, HttpEntity e -> def deleteBridgeCmd = JSONObjectUtil.toObject(e.body, KVMAgentCommands.DeleteBridgeCmd.class) cmds.add(deleteBridgeCmd) @@ -262,7 +262,7 @@ public class AttachL2NetworkWithTwoClustersCase extends SubCase{ } assert vm2.hostUuid == host2.uuid - def cmds = [] as SynchronizedList + def cmds = [] as SynchronizedList env.afterSimulator(KVMConstant.KVM_DELETE_L2VLAN_NETWORK_PATH) { rsp, HttpEntity e -> def deleteBridgeCmd = JSONObjectUtil.toObject(e.body, KVMAgentCommands.DeleteVlanBridgeCmd.class) cmds.add(deleteBridgeCmd) @@ -374,7 +374,7 @@ public class AttachL2NetworkWithTwoClustersCase extends SubCase{ } assert vm2.hostUuid == host2.uuid - def cmds = [] as SynchronizedList + def cmds = [] as SynchronizedList env.afterSimulator(VxlanNetworkPoolConstant.VXLAN_KVM_DELETE_L2VXLAN_NETWORK_PATH) { rsp, HttpEntity e -> def deleteBridgeCmd = JSONObjectUtil.toObject(e.body, VxlanKvmAgentCommands.DeleteVxlanBridgeCmd.class) cmds.add(deleteBridgeCmd) diff --git a/test/src/test/groovy/org/zstack/test/integration/network/l2network/DeleteL2NetworkBridgeCase.groovy b/test/src/test/groovy/org/zstack/test/integration/network/l2network/DeleteL2NetworkBridgeCase.groovy index 65896171966..439a4409e43 100644 --- a/test/src/test/groovy/org/zstack/test/integration/network/l2network/DeleteL2NetworkBridgeCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/network/l2network/DeleteL2NetworkBridgeCase.groovy @@ -129,7 +129,7 @@ class DeleteL2NetworkBridgeCase extends SubCase { clusterUuid = cluster.uuid } - def cmds = [] as SynchronizedList + def cmds = [] as SynchronizedList env.afterSimulator(KVMConstant.KVM_DELETE_L2NOVLAN_NETWORK_PATH) { rsp, HttpEntity e -> def deleteBridgeCmd = JSONObjectUtil.toObject(e.body, KVMAgentCommands.DeleteBridgeCmd.class) cmds.add(deleteBridgeCmd) @@ -158,7 +158,7 @@ class DeleteL2NetworkBridgeCase extends SubCase { clusterUuid = cluster.uuid } - def cmds = [] as SynchronizedList + def cmds = [] as SynchronizedList env.afterSimulator(KVMConstant.KVM_DELETE_L2NOVLAN_NETWORK_PATH) { rsp, HttpEntity e -> def deleteBridgeCmd = JSONObjectUtil.toObject(e.body, KVMAgentCommands.DeleteBridgeCmd.class) cmds.add(deleteBridgeCmd) @@ -192,7 +192,7 @@ class DeleteL2NetworkBridgeCase extends SubCase { clusterUuid = cluster.uuid } - def cmds = [] as SynchronizedList + def cmds = [] as SynchronizedList env.afterSimulator(KVMConstant.KVM_DELETE_L2VLAN_NETWORK_PATH) { rsp, HttpEntity e -> def deleteVlanBridgeCmd = JSONObjectUtil.toObject(e.body, KVMAgentCommands.DeleteVlanBridgeCmd.class) cmds.add(deleteVlanBridgeCmd) @@ -223,7 +223,7 @@ class DeleteL2NetworkBridgeCase extends SubCase { clusterUuid = cluster.uuid } - def cmds = [] as SynchronizedList + def cmds = [] as SynchronizedList env.afterSimulator(KVMConstant.KVM_DELETE_L2VLAN_NETWORK_PATH) { rsp, HttpEntity e -> def deleteVlanBridgeCmd = JSONObjectUtil.toObject(e.body, KVMAgentCommands.DeleteVlanBridgeCmd.class) cmds.add(deleteVlanBridgeCmd) @@ -278,7 +278,7 @@ class DeleteL2NetworkBridgeCase extends SubCase { } - def cmds = [] as SynchronizedList + def cmds = [] as SynchronizedList env.afterSimulator(VxlanNetworkPoolConstant.VXLAN_KVM_DELETE_L2VXLAN_NETWORK_PATH) { rsp, HttpEntity e -> def deleteVxlanBridgeCmd = JSONObjectUtil.toObject(e.body, VxlanKvmAgentCommands.DeleteVxlanBridgeCmd.class) cmds.add(deleteVxlanBridgeCmd) @@ -336,7 +336,7 @@ class DeleteL2NetworkBridgeCase extends SubCase { } - def cmds = [] as SynchronizedList + def cmds = [] as SynchronizedList env.afterSimulator(VxlanNetworkPoolConstant.VXLAN_KVM_DELETE_L2VXLAN_NETWORK_PATH) { rsp, HttpEntity e -> def deleteVxlanBridgeCmd = JSONObjectUtil.toObject(e.body, VxlanKvmAgentCommands.DeleteVxlanBridgeCmd.class) cmds.add(deleteVxlanBridgeCmd) @@ -393,7 +393,7 @@ class DeleteL2NetworkBridgeCase extends SubCase { } - def cmds = [] as SynchronizedList + def cmds = [] as SynchronizedList env.afterSimulator(VxlanNetworkPoolConstant.VXLAN_KVM_DELETE_L2VXLAN_NETWORK_PATH) { rsp, HttpEntity e -> def deleteVxlanBridgeCmd = JSONObjectUtil.toObject(e.body, VxlanKvmAgentCommands.DeleteVxlanBridgeCmd.class) cmds.add(deleteVxlanBridgeCmd) @@ -431,7 +431,7 @@ class DeleteL2NetworkBridgeCase extends SubCase { return resp } - def cmds = [] as SynchronizedList + def cmds = [] as SynchronizedList env.afterSimulator(KVMConstant.KVM_DELETE_L2NOVLAN_NETWORK_PATH) { rsp, HttpEntity e -> def deleteBridgeCmd = JSONObjectUtil.toObject(e.body, KVMAgentCommands.DeleteBridgeCmd.class) cmds.add(deleteBridgeCmd) diff --git a/test/src/test/groovy/org/zstack/test/integration/network/sdnController/SdnControllerCase.groovy b/test/src/test/groovy/org/zstack/test/integration/network/sdnController/SdnControllerCase.groovy index c07c9c3314c..ef3983055c6 100644 --- a/test/src/test/groovy/org/zstack/test/integration/network/sdnController/SdnControllerCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/network/sdnController/SdnControllerCase.groovy @@ -12,6 +12,7 @@ import org.zstack.sdk.SdnControllerInventory import org.zstack.sdk.ZoneInventory import org.zstack.sdnController.SdnControllerGlobalConfig import org.zstack.sdnController.SdnControllerSystemTags +import org.zstack.sdnController.h3cVcfc.H3cVcfcCommands import org.zstack.sdnController.h3cVcfc.H3cVcfcV2Commands import org.zstack.header.network.sdncontroller.SdnControllerConstant import org.zstack.sdnController.header.H3cSdnControllerTenantVO @@ -374,8 +375,8 @@ class SdnControllerCase extends SubCase { void testSdnControllerPing() { // Setup mock simulator for successful controller creation env.simulator(H3cVcfcV2Commands.H3C_VCFC_GET_TOKEN) { HttpEntity e, EnvSpec spec -> - def rsp = new H3cVcfcV2Commands.LoginRsp() - rsp.record = new H3cVcfcV2Commands.LoginReply() + def rsp = new H3cVcfcCommands.LoginRsp() + rsp.record = new H3cVcfcCommands.LoginReply() rsp.record.token = "init-token-12345" rsp.record.userName = "user" rsp.record.domainName = "default" @@ -400,7 +401,7 @@ class SdnControllerCase extends SubCase { // Mock token retrieval failure to simulate ping failure env.simulator(H3cVcfcV2Commands.H3C_VCFC_GET_TOKEN) { HttpEntity e, EnvSpec spec -> - def rsp = new H3cVcfcV2Commands.LoginRsp() + def rsp = new H3cVcfcCommands.LoginRsp() rsp.record = null return rsp } @@ -413,8 +414,8 @@ class SdnControllerCase extends SubCase { // Mock token retrieval success to simulate ping recovery env.simulator(H3cVcfcV2Commands.H3C_VCFC_GET_TOKEN) { HttpEntity e, EnvSpec spec -> - def rsp = new H3cVcfcV2Commands.LoginRsp() - rsp.record = new H3cVcfcV2Commands.LoginReply() + def rsp = new H3cVcfcCommands.LoginRsp() + rsp.record = new H3cVcfcCommands.LoginReply() rsp.record.token = "test-token-12345" rsp.record.userName = "user" rsp.record.domainName = "default" @@ -436,8 +437,8 @@ class SdnControllerCase extends SubCase { void testSdnControllerReconnect() { // Setup mock simulator for successful controller creation env.simulator(H3cVcfcV2Commands.H3C_VCFC_GET_TOKEN) { HttpEntity e, EnvSpec spec -> - def rsp = new H3cVcfcV2Commands.LoginRsp() - rsp.record = new H3cVcfcV2Commands.LoginReply() + def rsp = new H3cVcfcCommands.LoginRsp() + rsp.record = new H3cVcfcCommands.LoginReply() rsp.record.token = "init-token-67890" rsp.record.userName = "user" rsp.record.domainName = "default" @@ -461,8 +462,8 @@ class SdnControllerCase extends SubCase { boolean reconnectCalled = false env.simulator(H3cVcfcV2Commands.H3C_VCFC_GET_TOKEN) { HttpEntity e, EnvSpec spec -> reconnectCalled = true - def rsp = new H3cVcfcV2Commands.LoginRsp() - rsp.record = new H3cVcfcV2Commands.LoginReply() + def rsp = new H3cVcfcCommands.LoginRsp() + rsp.record = new H3cVcfcCommands.LoginReply() rsp.record.token = "reconnect-token-67890" rsp.record.userName = "user" rsp.record.domainName = "default" diff --git a/test/src/test/groovy/org/zstack/test/integration/network/vxlanNetwork/AddVxlanVtepIpCase.groovy b/test/src/test/groovy/org/zstack/test/integration/network/vxlanNetwork/AddVxlanVtepIpCase.groovy index 0a483f6759b..7055aac65fa 100644 --- a/test/src/test/groovy/org/zstack/test/integration/network/vxlanNetwork/AddVxlanVtepIpCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/network/vxlanNetwork/AddVxlanVtepIpCase.groovy @@ -274,7 +274,7 @@ class AddVxlanVtepIpCase extends SubCase { resp.setSuccess(true) return resp } - def cmds = [] as SynchronizedList + def cmds = [] as SynchronizedList env.afterSimulator(VxlanNetworkPoolConstant.VXLAN_KVM_POPULATE_FDB_L2VXLAN_NETWORKS_PATH) { rsp, HttpEntity e -> VxlanKvmAgentCommands.PopulateVxlanNetworksFdbCmd cmd = JSONObjectUtil.toObject(e.body, VxlanKvmAgentCommands.PopulateVxlanNetworksFdbCmd.class) cmds.add(cmd) diff --git a/test/src/test/groovy/org/zstack/test/integration/network/vxlanNetwork/VxlanLazyAttachCase.groovy b/test/src/test/groovy/org/zstack/test/integration/network/vxlanNetwork/VxlanLazyAttachCase.groovy index 25312b5e555..2354f456f6d 100644 --- a/test/src/test/groovy/org/zstack/test/integration/network/vxlanNetwork/VxlanLazyAttachCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/network/vxlanNetwork/VxlanLazyAttachCase.groovy @@ -310,7 +310,7 @@ class VxlanLazyAttachCase extends SubCase { return rsp } - def realizeRecords = [] as SynchronizedList + def realizeRecords = [] as SynchronizedList List createBridgeCmds = new ArrayList<>() createBridgeCmds = Collections.synchronizedList(new ArrayList()) env.simulator(VxlanNetworkPoolConstant.VXLAN_KVM_REALIZE_L2VXLAN_NETWORK_PATH) { HttpEntity entity, EnvSpec spec -> diff --git a/test/src/test/groovy/org/zstack/test/integration/network/vxlanNetwork/VxlanVtepIpChangedCase.groovy b/test/src/test/groovy/org/zstack/test/integration/network/vxlanNetwork/VxlanVtepIpChangedCase.groovy index b480d241b8e..8e2d7e23a7f 100644 --- a/test/src/test/groovy/org/zstack/test/integration/network/vxlanNetwork/VxlanVtepIpChangedCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/network/vxlanNetwork/VxlanVtepIpChangedCase.groovy @@ -242,14 +242,14 @@ class VxlanVtepIpChangedCase extends SubCase { return resp } - def records = [] as SynchronizedList + def records = [] as SynchronizedList env.simulator(VxlanNetworkPoolConstant.VXLAN_KVM_POPULATE_FDB_L2VXLAN_NETWORKS_PATH) { HttpEntity entity, EnvSpec spec -> def cmd = JSONObjectUtil.toObject(entity.body, VxlanKvmAgentCommands.PopulateVxlanNetworksFdbCmd.class) records.add(cmd.networkUuids) return new VxlanKvmAgentCommands.PopulateVxlanNetworksFdbCmd() } - def realizeRecords = [] as SynchronizedList + def realizeRecords = [] as SynchronizedList env.simulator(VxlanNetworkPoolConstant.VXLAN_KVM_REALIZE_L2VXLAN_NETWORKS_PATH) { HttpEntity entity, EnvSpec spec -> def cmd = JSONObjectUtil.toObject(entity.body, VxlanKvmAgentCommands.CreateVxlanBridgesCmd.class) for (VxlanKvmAgentCommands.CreateVxlanBridgeCmd bcmd : cmd.bridgeCmds) { diff --git a/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/dhcp/CheckFlatDhcpWorkCase.groovy b/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/dhcp/CheckFlatDhcpWorkCase.groovy index 3214f30911e..12efbccb36d 100644 --- a/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/dhcp/CheckFlatDhcpWorkCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/dhcp/CheckFlatDhcpWorkCase.groovy @@ -258,14 +258,14 @@ class CheckFlatDhcpWorkCase extends SubCase{ } assert flushCmds.size() == 2 flushCmds.clear() - l31 = queryL3Network{ conditions = ["uuid=${l31.uuid}"]}[0] - for (NetworkServiceL3NetworkRefInventory ref : l31.networkServices) { + def l31Refreshed = queryL3Network{ conditions = ["uuid=${l31.uuid}"]}[0] + for (NetworkServiceL3NetworkRefInventory ref : l31Refreshed.networkServices) { if (ref.networkServiceType == "DHCP") { assert false } } GetL3NetworkDhcpIpAddressResult ret = getL3NetworkDhcpIpAddress { - l3NetworkUuid = l31.uuid + l3NetworkUuid = l31Refreshed.uuid } assert ret.ip6 == null assert ret.ip == null @@ -283,19 +283,19 @@ class CheckFlatDhcpWorkCase extends SubCase{ } assert bCmds.size() == 2 bCmds.clear() - l31 = queryL3Network{ conditions = ["uuid=${l31.uuid}"]}[0] - List services = l31.networkServices.stream().map {ref -> ref.networkServiceType}.collect(Collectors.toList()) + def l31Refreshed2 = queryL3Network{ conditions = ["uuid=${l31.uuid}"]}[0] + List services = l31Refreshed2.networkServices.stream().map {ref -> ref.networkServiceType}.collect(Collectors.toList()) assert services.contains("DHCP") detachNetworkServiceFromL3Network { - l3NetworkUuid = l31.uuid + l3NetworkUuid = l31Refreshed2.uuid service = 'DHCP' } /* dhcp is disabled, can not change dhcp server ip */ expect(AssertionError.class) { changeL3NetworkDhcpIpAddress { - l3NetworkUuid = l31.uuid + l3NetworkUuid = l31Refreshed2.uuid dhcpServerIp = "172.16.10.10" } } @@ -380,14 +380,14 @@ class CheckFlatDhcpWorkCase extends SubCase{ } assert flushCmds.size() == 2 flushCmds.clear() - l32 = queryL3Network{ conditions = ["uuid=${l32.uuid}"]}[0] - for (NetworkServiceL3NetworkRefInventory ref : l32.networkServices) { + def l32Refreshed = queryL3Network{ conditions = ["uuid=${l32.uuid}"]}[0] + for (NetworkServiceL3NetworkRefInventory ref : l32Refreshed.networkServices) { if (ref.networkServiceType == "DHCP") { assert false } } GetL3NetworkDhcpIpAddressResult ret = getL3NetworkDhcpIpAddress { - l3NetworkUuid = l32.uuid + l3NetworkUuid = l32Refreshed.uuid } assert ret.ip6 == null assert ret.ip == null @@ -405,29 +405,29 @@ class CheckFlatDhcpWorkCase extends SubCase{ } assert bCmds.size() == 2 bCmds.clear() - l32 = queryL3Network{ conditions = ["uuid=${l32.uuid}"]}[0] - List services = l32.networkServices.stream().map {ref -> ref.networkServiceType}.collect(Collectors.toList()) + def l32Refreshed2 = queryL3Network{ conditions = ["uuid=${l32.uuid}"]}[0] + List services = l32Refreshed2.networkServices.stream().map {ref -> ref.networkServiceType}.collect(Collectors.toList()) assert services.contains("DHCP") - UsedIpInventory usedIp4 = queryIpAddress {conditions=["l3NetworkUuid=${l32.uuid}", "ipVersion=4"] + UsedIpInventory usedIp4 = queryIpAddress {conditions=["l3NetworkUuid=${l32Refreshed2.uuid}", "ipVersion=4"] limit = 1} [0] - UsedIpInventory usedIp6 = queryIpAddress {conditions=["l3NetworkUuid=${l32.uuid}", "ipVersion=6"] + UsedIpInventory usedIp6 = queryIpAddress {conditions=["l3NetworkUuid=${l32Refreshed2.uuid}", "ipVersion=6"] limit = 1} [0] expect(AssertionError.class) { changeL3NetworkDhcpIpAddress { - l3NetworkUuid = l32.uuid + l3NetworkUuid = l32Refreshed2.uuid dhcpServerIp = usedIp4.ip } } expect(AssertionError.class) { changeL3NetworkDhcpIpAddress { - l3NetworkUuid = l32.uuid + l3NetworkUuid = l32Refreshed2.uuid dhcpServerIp = usedIp6.ip } } def freeIp6s = getFreeIp { - l3NetworkUuid = l32.getUuid() + l3NetworkUuid = l32Refreshed2.getUuid() ipVersion = IPv6Constants.IPv6 limit = 1 } as List diff --git a/test/src/test/java/org/zstack/test/ApiSender.java b/test/src/test/java/org/zstack/test/ApiSender.java index e4b2e35bd7b..cb4777235c8 100755 --- a/test/src/test/java/org/zstack/test/ApiSender.java +++ b/test/src/test/java/org/zstack/test/ApiSender.java @@ -44,7 +44,7 @@ public T call(APIMessage msg, Class clazz) throws ApiSe private T doSend(final APIMessage msg, Class clazz, boolean exceptionOnError) throws ApiSenderException { APIEvent resultEvent; try { - resultEvent = clazz.newInstance(); + resultEvent = clazz.getConstructor().newInstance(); } catch (Exception e) { throw new CloudRuntimeException("Unable to create instance of " + clazz.getCanonicalName(), e); } diff --git a/test/src/test/java/org/zstack/test/deployer/Deployer.java b/test/src/test/java/org/zstack/test/deployer/Deployer.java index 2ed2c488714..532bee653c5 100755 --- a/test/src/test/java/org/zstack/test/deployer/Deployer.java +++ b/test/src/test/java/org/zstack/test/deployer/Deployer.java @@ -118,7 +118,7 @@ private void scanDeployer() { for (BeanDefinition bd : scanner.findCandidateComponents("org.zstack.test")) { try { Class clazz = Class.forName(bd.getBeanClassName()); - AbstractDeployer d = (AbstractDeployer) clazz.newInstance(); + AbstractDeployer d = (AbstractDeployer) clazz.getConstructor().newInstance(); deployers.put(d.getSupportedDeployerClassType(), d); logger.debug(String.format("Scanned a deployer[%s] supporting %s", d.getClass().getName(), d.getSupportedDeployerClassType())); } catch (Exception e) { diff --git a/testlib/pom.xml b/testlib/pom.xml index 4d1688012a6..95a32177f0e 100644 --- a/testlib/pom.xml +++ b/testlib/pom.xml @@ -17,8 +17,12 @@ junit - org.codehaus.groovy - groovy-all + org.apache.groovy + groovy + + + org.apache.groovy + groovy-xml org.mockito @@ -223,29 +227,90 @@ + org.apache.maven.plugins maven-compiler-plugin 3.6.1 - groovy-eclipse-compiler - ${project.java.version} - ${project.java.version} - lines,vars,source - true + ${project.java.version} + true + true + + + + + + org.codehaus.gmavenplus + gmavenplus-plugin + 4.2.1 + + + + generate-stubs + process-sources + + generateStubs + + + + + compile-groovy + compile + + compile + + + + + generate-test-stubs + process-test-sources + + generateTestStubs + + + + + compile-test-groovy + test-compile + + compileTests + + + + + ${groovy.version} + ${project.java.version} + + + + ${project.basedir}/src/main/java + + **/*.groovy + + + + ${project.basedir}/src/main/groovy + + **/*.groovy + + + + + + ${project.basedir}/src/test/java + + **/*.groovy + + + + ${project.basedir}/src/test/groovy + + **/*.groovy + + + - - - org.codehaus.groovy - groovy-eclipse-compiler - 2.9.2-01 - - - org.codehaus.groovy - groovy-eclipse-batch - 2.4.3-01 - - diff --git a/testlib/src/main/java/org/zstack/testlib/StabilityTest.groovy b/testlib/src/main/java/org/zstack/testlib/StabilityTest.groovy index e700a42a5bc..7a19ff2bef3 100755 --- a/testlib/src/main/java/org/zstack/testlib/StabilityTest.groovy +++ b/testlib/src/main/java/org/zstack/testlib/StabilityTest.groovy @@ -117,7 +117,7 @@ abstract class StabilityTest extends Test implements Case{ } protected Case buildCase(String caseName) { - Case subCase = Class.forName(caseName).newInstance() as Case + Case subCase = Class.forName(caseName).getConstructor().newInstance() as Case def resultDir = [getResultDirBase(), getFailureLogsDirName()].join("/") def dir = new File(resultDir) dir.deleteDir() diff --git a/testlib/src/main/java/org/zstack/testlib/Test.groovy b/testlib/src/main/java/org/zstack/testlib/Test.groovy index 1dcb02c54e9..b3c69df3593 100755 --- a/testlib/src/main/java/org/zstack/testlib/Test.groovy +++ b/testlib/src/main/java/org/zstack/testlib/Test.groovy @@ -1065,11 +1065,11 @@ mysqldump -u root zstack > ${failureLogDir.absolutePath}/dbdump.sql StartMode getStabilityTestStartMode() { String targetCaseList = System.getProperty(targetSubCaseParamKey) List caseClassNameList = targetCaseList.split(",") - def count = caseClassNameList.stream().map { it -> Class.forName(it).newInstance().getCaseMode() }.distinct().count() + def count = caseClassNameList.stream().map { it -> Class.forName(it).getConstructor().newInstance().getCaseMode() }.distinct().count() if (count != 1) { throw new Exception("All cases in the case list should use the same mode") } - return Class.forName(caseClassNameList[0]).newInstance().getCaseMode() + return Class.forName(caseClassNameList[0]).getConstructor().newInstance().getCaseMode() } StartMode getCaseMode() { diff --git a/utils/pom.xml b/utils/pom.xml index 59355a3e183..1c648d8c013 100644 --- a/utils/pom.xml +++ b/utils/pom.xml @@ -53,8 +53,24 @@ log4j-slf4j-impl - org.codehaus.groovy - groovy-all + org.apache.groovy + groovy + ${groovy.version} + + + org.apache.groovy + groovy-xml + ${groovy.version} + + + org.apache.groovy + groovy-templates + ${groovy.version} + + + javax.xml.bind + jaxb-api + ${jaxb.api.version} org.json @@ -149,8 +165,7 @@ maven-compiler-plugin ${project.compiler.version} - ${project.java.version} - ${project.java.version} + ${project.java.version} true diff --git a/utils/src/main/java/org/zstack/utils/GroovyUtils.java b/utils/src/main/java/org/zstack/utils/GroovyUtils.java index 3347aab3e32..7d161a33418 100755 --- a/utils/src/main/java/org/zstack/utils/GroovyUtils.java +++ b/utils/src/main/java/org/zstack/utils/GroovyUtils.java @@ -19,7 +19,7 @@ public class GroovyUtils { public static T newInstance(String scriptPath, ClassLoader parent) { try { Class clz = getClass(scriptPath, parent); - return (T)clz.newInstance(); + return (T) clz.getConstructor().newInstance(); } catch (Exception e) { throw new RuntimeException(e); } diff --git a/utils/src/main/java/org/zstack/utils/ObjectUtils.java b/utils/src/main/java/org/zstack/utils/ObjectUtils.java index eb51bf02ad0..43df3ca1cfa 100755 --- a/utils/src/main/java/org/zstack/utils/ObjectUtils.java +++ b/utils/src/main/java/org/zstack/utils/ObjectUtils.java @@ -55,7 +55,7 @@ public static T newAndCopy(Object src, Class dstClass) { } try { - T dst = dstClass.newInstance(); + T dst = dstClass.getConstructor().newInstance(); org.springframework.beans.BeanUtils.copyProperties(src, dst); return dst; } catch (Exception e) { diff --git a/utils/src/main/java/org/zstack/utils/form/Form.java b/utils/src/main/java/org/zstack/utils/form/Form.java index abe47906f46..90b90781408 100644 --- a/utils/src/main/java/org/zstack/utils/form/Form.java +++ b/utils/src/main/java/org/zstack/utils/form/Form.java @@ -172,7 +172,7 @@ private T doLoadObject(String[] record) throws Exception { throw new OutOfLimitException(String.format("objects count is too larger than limit[%d]", limit)); } - T object = clz.newInstance(); + T object = clz.getConstructor().newInstance(); for (int i = 0; i < record.length; i++) { String key = columns[i]; String value = record[i]; diff --git a/utils/src/main/java/org/zstack/utils/gson/JSONObjectUtil.java b/utils/src/main/java/org/zstack/utils/gson/JSONObjectUtil.java index a6451ce35e4..5aa735c76f3 100755 --- a/utils/src/main/java/org/zstack/utils/gson/JSONObjectUtil.java +++ b/utils/src/main/java/org/zstack/utils/gson/JSONObjectUtil.java @@ -37,7 +37,7 @@ public static K toCollection(String content, Class if (collections.isInterface()) { throw new IllegalArgumentException(String.format("collections must be a concrete class, not interface[%s]", collections.getName())); } - Collection c = collections.newInstance(); + Collection c = collections.getConstructor().newInstance(); JSONArray jarr = new JSONArray(content); for (int i=0; i clazz, Function rewriter) { private MessageFactory buildMessageFactory(Function rewriter) { try { return new MessageFactory() { - MessageFactory defaultFactory = AbstractLogger.DEFAULT_MESSAGE_FACTORY_CLASS.newInstance(); + MessageFactory defaultFactory = AbstractLogger.DEFAULT_MESSAGE_FACTORY_CLASS.getConstructor().newInstance(); @Override public org.apache.logging.log4j.message.Message newMessage(Object message) { diff --git a/utils/src/test/java/org/zstack/utils/test/TestNetworkUtils.java b/utils/src/test/java/org/zstack/utils/test/TestNetworkUtils.java index f1cc86f81bd..a24c31ec347 100644 --- a/utils/src/test/java/org/zstack/utils/test/TestNetworkUtils.java +++ b/utils/src/test/java/org/zstack/utils/test/TestNetworkUtils.java @@ -1,7 +1,6 @@ package org.zstack.utils.test; import org.junit.Test; -import org.omg.PortableInterceptor.SYSTEM_EXCEPTION; import org.zstack.utils.network.NetworkUtils; public class TestNetworkUtils {